/ Hex Artifact Content
Login

Artifact 7893a74448bcac7e3ea1e2308dd38e12dd92d351:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3110: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
3120: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
3130: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
3140: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
3150: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
3160: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
3170: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
3180: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
3190: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
31a0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
31b0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
31c0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
31d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
31e0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
31f0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3200: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3210: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3220: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3230: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3240: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3250: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
3260: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
3270: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
3280: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
3290: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
32a0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
32b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
32c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
32e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
32f0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3310: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3320: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3330: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3340: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3350: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
3360: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
3370: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
3380: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
3390: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
33c0: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
33d0: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
33e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
33f0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3400: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3410: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3420: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3430: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3450: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3460: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3470: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3480: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3490: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
34a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
34b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
34f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3500: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3510: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3520: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3530: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3540: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3550: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
3560: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
3570: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
3580: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
3590: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
35a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
35b0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
35c0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
35d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
35e0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
35f0: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3610: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3620: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3630: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3640: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3650: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
3660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3670: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
3680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3690: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
36a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
36b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
36c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
36d0: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
36e0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
36f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3700: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3710: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3720: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3730: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3740: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3750: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
3760: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
3770: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
3780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3790: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
37a0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
37b0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
37c0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
37d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
37e0: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
37f0: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3800: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3810: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3820: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3850: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
3860: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
3870: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
3880: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
3890: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
38a0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
38b0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
38c0: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
38d0: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
38e0: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
38f0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3900: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3910: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3920: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3930: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3940: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3950: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
3960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3970: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
3980: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
3990: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
39a0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
39b0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
39c0: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
39d0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
39e0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
39f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3a00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3a10: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3a20: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3a30: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3a40: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3a50: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3a60: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3a70: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3a80: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
3a90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
3aa0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
3ab0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3ac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3ad0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3ae0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3af0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3b00: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3b10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3b40: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3b50: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3b70: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
3b80: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
3b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ba0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
3bb0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3bc0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3bd0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3be0: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3bf0: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3c00: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3c10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3c20: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3c30: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3c40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3c50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3c80: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3c90: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ca0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3cb0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3cc0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3cd0: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3ce0: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3cf0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3d00: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d10: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3d20: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3d30: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3d40: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3d50: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3d60: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3d70: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3d80: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3d90: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3da0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3db0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3dc0: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3dd0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3e00: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3e10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3e20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3e30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3e40: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3e50: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3e60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3e70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3e80: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3e90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ea0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3eb0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3ec0: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3ed0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3ee0: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3ef0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3f00: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3f10: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3f20: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3f30: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3f40: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3f50: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3f60: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3f70: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3f80: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3f90: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3fa0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3fb0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3fc0: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3fd0: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3fe0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3ff0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
4000: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
4010: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
4020: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
4030: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
4040: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
4050: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
4060: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
4070: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
4080: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
4090: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
40a0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
40b0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
40c0: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
40d0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
40e0: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
40f0: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
4100: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
4110: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
4120: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
4130: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4150: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4160: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4170: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
4180: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
4190: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
41a0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
41b0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
41c0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
41d0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
41e0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
41f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4200: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4210: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74  pBtree) );.  pBt
4220: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4230: 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cur = 0;.  for(p
4240: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
4250: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4260: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4270: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
4280: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
4290: 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d  ){.      pBtree-
42a0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
42b0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
42c0: 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70  sClearTable || p
42d0: 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
42e0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  w ){.        p->
42f0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4300: 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d  INVALID;.      }
4310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
4320: 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75  lse.  /* Stub fu
4330: 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52  nction when INCR
4340: 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20  BLOB is omitted 
4350: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  */.  #define inv
4360: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
4370: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
4380: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4390: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
43a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
43b0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
43c0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
43d0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
43e0: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
43f0: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4400: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4410: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4420: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4430: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4440: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4450: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4460: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
4470: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
4480: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
4490: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
44a0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
44b0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
44c0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
44d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
44e0: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
44f0: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4500: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4510: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4520: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4530: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4540: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4550: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4560: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4570: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
4580: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4590: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
45a0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
45b0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
45c0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
45d0: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
45e0: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
45f0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4600: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4610: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4620: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4630: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4640: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4650: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4660: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
4670: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
4680: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
4690: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
46a0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
46b0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
46c0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
46d0: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
46e0: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
46f0: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4700: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4710: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4720: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4730: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4740: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4750: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4760: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
4770: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
4780: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
4790: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
47a0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
47b0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
47c0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
47d0: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
47e0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
47f0: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4800: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4810: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4820: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4830: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4840: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4850: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4860: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
4870: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
4880: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
4890: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
48a0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
48b0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
48c0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
48d0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
48e0: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
48f0: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4900: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4910: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4920: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4930: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4940: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4950: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4960: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
4970: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
4980: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4990: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
49a0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
49b0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
49c0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
49d0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
49e0: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
49f0: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4a00: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4a10: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4a20: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4a30: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4a40: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4a50: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4a60: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4a70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4a80: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4aa0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4ab0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4ac0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4ad0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4ae0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4af0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4b00: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4b10: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4b20: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4b30: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4b40: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4b50: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4b60: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4b70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
4b80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b90: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4ba0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4bb0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
4bc0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4bd0: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4be0: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4bf0: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4c00: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4c10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4c30: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4c40: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4c50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4c60: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4c70: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4c80: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4c90: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ca0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4cb0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4cc0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4cd0: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4ce0: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4cf0: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4d00: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4d10: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4d20: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4d40: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4d50: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4d60: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4d70: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4d90: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4da0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4db0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4dc0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4dd0: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4de0: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4df0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4e00: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4e10: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4e20: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4e30: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4e40: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4e50: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4e60: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4e70: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4e80: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4e90: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4ea0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4eb0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4ec0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4ed0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4ee0: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4ef0: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4f00: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4f10: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4f20: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4f30: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4f50: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4f60: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4f70: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4f80: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4f90: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4fa0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4fb0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4fc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
4fd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
4fe0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d   only argument m
4ff0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76  ust point to a v
5000: 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68  alid entry.** wh
5010: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
5020: 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e   is called (i.e.
5030: 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55   have eState==CU
5040: 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69  RSOR_VALID). Thi
5050: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61  s.** function sa
5060: 76 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ves the current 
5070: 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61  cursor key in va
5080: 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b  riables pCur->nK
5090: 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e  ey and.** pCur->
50a0: 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  pKey. SQLITE_OK 
50b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
50c0: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20  uccessful or an 
50d0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a  SQLite error .**
50e0: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
50f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
5100: 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  rsor is open on 
5110: 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
5120: 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65   then the intege
5130: 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f  r key.** (the ro
5140: 77 69 64 29 20 69 73 20 73 74 6f 72 65 64 20 69  wid) is stored i
5150: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  n pCur->nKey and
5160: 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c   pCur->pKey is l
5170: 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55  eft set to.** NU
5180: 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f  LL. If the curso
5190: 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e  r is open on a n
51a0: 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  on-intkey table,
51b0: 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79   then pCur->pKey
51c0: 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70   is .** set to p
51d0: 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63  oint to a malloc
51e0: 65 64 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e  ed buffer pCur->
51f0: 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73 69  nKey bytes in si
5200: 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ze containing .*
5210: 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74  * the key..*/.st
5220: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
5230: 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20  sorKey(BtCursor 
5240: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5250: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5260: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5270: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5280: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5290: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
52a0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
52b0: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
52c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
52d0: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
52e0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
52f0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
5300: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
5310: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
5320: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5330: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
5340: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
5350: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
5360: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
5370: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
5380: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
5390: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
53a0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
53b0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
53c0: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
53d0: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
53e0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
53f0: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
5400: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
5410: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
5420: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
5430: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
5440: 20 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20   ** data.  */.  
5450: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 63 75 72  if( 0==pCur->cur
5460: 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  IntKey ){.    vo
5470: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
5480: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
5490: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
54a0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
54b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
54c0: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
54d0: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
54e0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
54f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5500: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5510: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5530: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
5540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5560: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5570: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
5580: 74 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74  t( !pCur->curInt
5590: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
55a0: 65 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ey );.  return r
55b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
55c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
55d0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  sor position in 
55e0: 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74  the variables Bt
55f0: 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20  Cursor.nKey .** 
5600: 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65  and BtCursor.pKe
5610: 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20  y. The cursor's 
5620: 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
5630: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5640: 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  EK..**.** The ca
5650: 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
5660: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
5670: 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65   is valid (has e
5680: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5690: 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  LID).** prior to
56a0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
56b0: 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  utine.  .*/.stat
56c0: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
56d0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
56e0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
56f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
5700: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
5710: 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55  ur->eState || CU
5720: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70  RSOR_SKIPNEXT==p
5730: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
5740: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
5750: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
5760: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5770: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
5780: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
5790: 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
57a0: 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  XT ){.    pCur->
57b0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
57c0: 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  VALID;.  }else{.
57d0: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
57e0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  xt = 0;.  }..  r
57f0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65  c = saveCursorKe
5800: 79 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  y(pCur);.  if( r
5810: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5820: 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
5830: 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
5840: 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Cur);.    pCur->
5850: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5860: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
5870: 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ..  pCur->curFla
5880: 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
5890: 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
58a0: 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73  dOvfl|BTCF_AtLas
58b0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
58c0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
58d0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
58e0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
58f0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5900: 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f  rsOnList(BtCurso
5910: 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72  r*,Pgno,BtCursor
5920: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  *);../*.** Save 
5930: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
5940: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78   all cursors (ex
5950: 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68  cept pExcept) th
5960: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a  at are open on.*
5970: 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  * the table with
5980: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
5990: 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63  .  "Saving the c
59a0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20  ursor position" 
59b0: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
59c0: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  e location in th
59d0: 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d  e btree is remem
59e0: 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20  bered in such a 
59f0: 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20  way that it can 
5a00: 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b  be.** moved back
5a10: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f   to the same spo
5a20: 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65  t after the btre
5a30: 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
5a40: 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ied.  This.** ro
5a50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5a60: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
5a70: 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73  or pExcept is us
5a80: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
5a90: 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65  .** table, for e
5aa0: 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44  xample in BtreeD
5ab0: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5ac0: 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Insert()..**.** 
5ad0: 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
5ae0: 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
5af0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
5b00: 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
5b10: 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68  h .** cursors sh
5b20: 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20  ould have their 
5b30: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5b40: 61 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72  ag set.  The btr
5b50: 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f  eeCursor().** ro
5b60: 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74  utine enforces t
5b70: 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20  hat rule.  This 
5b80: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65  routine only nee
5b90: 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ds to be called 
5ba0: 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d  in.** the uncomm
5bb0: 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78  on case when pEx
5bc0: 70 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43  pect has the BTC
5bd0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5be0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
5bf0: 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20  xpect!=NULL and 
5c00: 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73  if no other curs
5c10: 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e  ors are found on
5c20: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70   the same root-p
5c30: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  age,.** then the
5c40: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
5c50: 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69  lag on pExpect i
5c60: 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76  s cleared, to av
5c70: 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70  oid another.** p
5c80: 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f  ointless call to
5c90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
5ca0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5cb0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
5cc0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
5cd0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
5ce0: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
5cf0: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
5d00: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
5d10: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
5d20: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
5d30: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
5d40: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
5d50: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
5d60: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
5d70: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
5d80: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
5d90: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
5da0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
5db0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
5dc0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
5dd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5de0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5df0: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
5e00: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
5e10: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
5e20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
5e30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5e40: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
5e50: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
5e60: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
5e70: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
5e80: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  k;.  }.  if( p )
5e90: 20 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73   return saveCurs
5ea0: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5eb0: 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20  ot, pExcept);.  
5ec0: 69 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45  if( pExcept ) pE
5ed0: 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20  xcept->curFlags 
5ee0: 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c  &= ~BTCF_Multipl
5ef0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
5f00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  TE_OK;.}../* Thi
5f10: 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  s helper routine
5f20: 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f   to saveAllCurso
5f30: 72 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75  rs does the actu
5f40: 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e  al work of savin
5f50: 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73  g.** the cursors
5f60: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63   if and when a c
5f70: 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74  ursor is found t
5f80: 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  hat actually req
5f90: 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a  uires saving..**
5fa0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
5fb0: 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73   is that no curs
5fc0: 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ors need to be s
5fd0: 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f  aved, so this ro
5fe0: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b  utine is.** brok
5ff0: 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20  en out from its 
6000: 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20  caller to avoid 
6010: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63  unnecessary stac
6020: 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65  k pointer moveme
6030: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
6040: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
6050: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
6060: 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ist(.  BtCursor 
6070: 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  *p,         /* T
6080: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
6090: 74 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e  that needs savin
60a0: 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f  g */.  Pgno iRoo
60b0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
60c0: 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20  nly save cursor 
60d0: 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e  with this iRoot.
60e0: 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72   Save all if zer
60f0: 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  o */.  BtCursor 
6100: 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44  *pExcept    /* D
6110: 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20  o not save this 
6120: 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64  cursor */.){.  d
6130: 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  o{.    if( p!=pE
6140: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
6150: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
6160: 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20  t==iRoot) ){.   
6170: 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
6180: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
6190: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
61a0: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
61b0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
61c0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
61d0: 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
61e0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
61f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
6200: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
6210: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6220: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
6230: 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b  e( p->iPage>0 );
6240: 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65  .        btreeRe
6250: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
6260: 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ges(p);.      }.
6270: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
6280: 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65  >pNext;.  }while
6290: 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ( p );.  return 
62a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
62b0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
62c0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
62d0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
62e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
62f0: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
6300: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
6310: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
6320: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
6330: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6340: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
6350: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
6360: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6370: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
6380: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
6390: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
63a0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
63b0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
63c0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
63d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
63e0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
63f0: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
6400: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
6410: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
6420: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
6430: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
6440: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6450: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
6460: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
6470: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
6480: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
6490: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
64a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
64b0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
64c0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
64d0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
64e0: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
64f0: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
6500: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
6510: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
6520: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
6530: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
6540: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
6550: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
6560: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
6570: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
6580: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
6590: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
65a0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
65c0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
65d0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
65e0: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
65f0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
6600: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
6610: 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20  e[200];         
6620: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
6630: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
6640: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
6650: 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20  /.  char *pFree 
6660: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  = 0;..  if( pKey
6670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6680: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
6690: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
66a0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
66b0: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
66c0: 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43  cord(.        pC
66d0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53  ur->pKeyInfo, aS
66e0: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
66f0: 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20  ace), &pFree.   
6700: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
6710: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
6720: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
6740: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
6750: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
6760: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
6770: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
6780: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
6790: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
67a0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
67b0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
67c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
67d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
67e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  KPT;.    }.  }el
67f0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6810: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6820: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6830: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6840: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
6850: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
6860: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6870: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6880: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
6890: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
68a0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
68b0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
68c0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
68d0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
68e0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
68f0: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
6900: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
6910: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
6920: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
6930: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
6940: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
6950: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
6960: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
6970: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
6980: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
6990: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
69a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
69b0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
69c0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
69d0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
69e0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
69f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6a00: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
6a10: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6a20: 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20  int skipNext;.  
6a30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6a40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6a50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
6a60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6a70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
6a80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
6aa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
6ab0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
6ac0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
6ad0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
6ae0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
6af0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
6b00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
6b10: 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78  Key, 0, &skipNex
6b20: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
6b30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
6b40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
6b50: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
6b60: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
6b70: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6b80: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6b90: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
6ba0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
6bb0: 4c 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  LID );.    pCur-
6bc0: 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69  >skipNext |= ski
6bd0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
6be0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26  Cur->skipNext &&
6bf0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6c00: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
6c10: 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
6c20: 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
6c30: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
6c40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
6c50: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
6c60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
6c70: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
6c80: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6c90: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
6ca0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6cb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
6cc0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
6cd0: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
6ce0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
6cf0: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
6d00: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
6d10: 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65  e position where
6d20: 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20  .** it was last 
6d30: 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62  placed, or has b
6d40: 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20  een invalidated 
6d50: 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65  for any other re
6d60: 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73  ason..** Cursors
6d70: 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74   can move when t
6d80: 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20  he row they are 
6d90: 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64  pointing at is d
6da0: 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72  eleted out.** fr
6db0: 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66  om under them, f
6dc0: 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72  or example.  Cur
6dd0: 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d  sor might also m
6de0: 6f 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a  ove if a btree.*
6df0: 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e  * is rebalanced.
6e00: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
6e10: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
6e20: 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70   a NULL cursor p
6e30: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66  ointer returns f
6e40: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  alse..**.** Use 
6e50: 74 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c  the separate sql
6e60: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
6e70: 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65  estore() routine
6e80: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75   to restore a cu
6e90: 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20  rsor.** back to 
6ea0: 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74  where it ought t
6eb0: 6f 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75  o be if this rou
6ec0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
6ed0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6ee0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
6ef0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
6f00: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
6f10: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6f20: 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
6f30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6f40: 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73   restores a curs
6f50: 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  or back to its o
6f60: 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e  riginal position
6f70: 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73   after it.** has
6f80: 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73   been moved by s
6f90: 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69  ome outside acti
6fa0: 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20  vity (such as a 
6fb0: 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20  btree rebalance 
6fc0: 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69  or.** a row havi
6fd0: 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ng been deleted 
6fe0: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
6ff0: 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a  he cursor).  .**
7000: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
7010: 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52  the *pDifferentR
7020: 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ow parameter is 
7030: 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72  false if the cur
7040: 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70  sor is left.** p
7050: 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74  ointing at exact
7060: 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e  ly the same row.
7070: 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20    *pDifferntRow 
7080: 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  is the row the c
7090: 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69  ursor.** was poi
70a0: 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65  nting to has bee
70b0: 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69  n deleted, forci
70c0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
70d0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a   point to some.*
70e0: 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a  * nearby row..**
70f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7100: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
7110: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72  called for a cur
7120: 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65  sor that just re
7130: 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66  turned.** TRUE f
7140: 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
7150: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
7160: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7170: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7180: 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  re(BtCursor *pCu
7190: 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65  r, int *pDiffere
71a0: 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  ntRow){.  int rc
71b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
71c0: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
71d0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
71e0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
71f0: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
7200: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
7210: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
7220: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
7230: 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
7240: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
7250: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
7260: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
7270: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7280: 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 1;.  }else{.
7290: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
72a0: 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b  ->skipNext==0 );
72b0: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
72c0: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
72d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
72f0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
7300: 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  UM./*.** Given a
7310: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
7320: 61 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61  a regular databa
7330: 73 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20  se page, return 
7340: 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62  the page.** numb
7350: 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74  er for the point
7360: 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74  er-map page that
7370: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e   contains the en
7380: 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69  try for the.** i
7390: 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72  nput page number
73a0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30  ..**.** Return 0
73b0: 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61   (not a valid pa
73c0: 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20  ge) for pgno==1 
73d0: 73 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a  since there is.*
73e0: 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70  * no pointer map
73f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
7400: 20 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e   page 1.  The in
7410: 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f  tegrity_check lo
7420: 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20  gic.** requires 
7430: 74 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e  that ptrmapPagen
7440: 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74  o(*,1)!=1..*/.st
7450: 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70  atic Pgno ptrmap
7460: 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20  Pageno(BtShared 
7470: 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pBt, Pgno pgno)
7480: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65  {.  int nPagesPe
7490: 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f  rMapPage;.  Pgno
74a0: 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20   iPtrMap, ret;. 
74b0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
74c0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
74d0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
74e0: 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e   pgno<2 ) return
74f0: 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d   0;.  nPagesPerM
7500: 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75  apPage = (pBt->u
7510: 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a  sableSize/5)+1;.
7520: 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e    iPtrMap = (pgn
7530: 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61  o-2)/nPagesPerMa
7540: 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28  pPage;.  ret = (
7550: 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65  iPtrMap*nPagesPe
7560: 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a  rMapPage) + 2; .
7570: 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49    if( ret==PENDI
7580: 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
7590: 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a  ) ){.    ret++;.
75a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74    }.  return ret
75b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
75c0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74   an entry into t
75d0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a  he pointer map..
75e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
75f0: 6e 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70  ne updates the p
7600: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7610: 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72   for page number
7620: 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61   'key'.** so tha
7630: 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70  t it maps to typ
7640: 65 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61  e 'eType' and pa
7650: 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72  rent page number
7660: 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49   'pgno'..**.** I
7670: 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61  f *pRC is initia
7680: 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f  lly non-zero (no
7690: 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65  n-SQLITE_OK) the
76a0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
76b0: 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  s.** a no-op.  I
76c0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
76d0: 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  s, the appropria
76e0: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
76f0: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
7700: 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63   *pRC..*/.static
7710: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28   void ptrmapPut(
7720: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
7730: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
7740: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20  e, Pgno parent, 
7750: 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50  int *pRC){.  DbP
7760: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f  age *pDbPage;  /
7770: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
7780: 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  p page */.  u8 *
7790: 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a  pPtrmap;      /*
77a0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
77b0: 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20   data */.  Pgno 
77c0: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20  iPtrmap;     /* 
77d0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
77e0: 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  page number */. 
77f0: 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20   int offset;    
7800: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20     /* Offset in 
7810: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7820: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
7830: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
7840: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  n code from subf
7850: 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69  unctions */..  i
7860: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
7870: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
7880: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7890: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
78a0: 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a   /* The master-j
78b0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62  ournal page numb
78c0: 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65  er must never be
78d0: 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74   used as a point
78e0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
78f0: 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d   assert( 0==PTRM
7900: 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50  AP_ISPAGE(pBt, P
7910: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
7920: 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73  (pBt)) );..  ass
7930: 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
7940: 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65  cuum );.  if( ke
7950: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  y==0 ){.    *pRC
7960: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7970: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  T_BKPT;.    retu
7980: 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61  rn;.  }.  iPtrma
7990: 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e  p = PTRMAP_PAGEN
79a0: 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72  O(pBt, key);.  r
79b0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
79c0: 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
79d0: 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61   iPtrmap, &pDbPa
79e0: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
79f0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7a00: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7a10: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7a20: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7a30: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7a40: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7a50: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7a60: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7a70: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7a80: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7a90: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7aa0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7ab0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7ac0: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7ad0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7ae0: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7af0: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7b00: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7b10: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7b20: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7b30: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7b40: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7b50: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7b60: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7b70: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7b80: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7b90: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7ba0: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7bb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7bc0: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7bd0: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7be0: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7bf0: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7c00: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7c10: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7c20: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7c30: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7c40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7c50: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7c60: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7c70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7c80: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
7c90: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7ca0: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
7cb0: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
7cc0: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
7cd0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
7ce0: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
7cf0: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
7d00: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
7d10: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
7d20: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
7d30: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
7d40: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
7d50: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
7d60: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
7d70: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
7d80: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
7d90: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
7da0: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
7db0: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
7dc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
7dd0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
7de0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
7df0: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
7e00: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
7e10: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
7e20: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
7e30: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
7e40: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
7e50: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
7e60: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
7e70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7e80: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7e90: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
7ea0: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
7eb0: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
7ec0: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
7ed0: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
7ee0: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
7ef0: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
7f00: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
7f10: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72 6d 61  rc;.  }.  pPtrma
7f20: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
7f30: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
7f40: 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66 73 65  bPage);..  offse
7f50: 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52 4f 46  t = PTRMAP_PTROF
7f60: 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20 6b 65  FSET(iPtrmap, ke
7f70: 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73 65 74  y);.  if( offset
7f80: 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  <0 ){.    sqlite
7f90: 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
7fa0: 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
7fb0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7fc0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
7fd0: 72 74 28 20 6f 66 66 73 65 74 20 3c 3d 20 28 69  rt( offset <= (i
7fe0: 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  nt)pBt->usableSi
7ff0: 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73 65 72 74  ze-5 );.  assert
8000: 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20  ( pEType!=0 );. 
8010: 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d   *pEType = pPtrm
8020: 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66  ap[offset];.  if
8030: 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f  ( pPgno ) *pPgno
8040: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 74   = get4byte(&pPt
8050: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b  rmap[offset+1]);
8060: 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ..  sqlite3Pager
8070: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
8080: 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20    if( *pEType<1 
8090: 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72  || *pEType>5 ) r
80a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
80b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74  RUPT_BKPT;.  ret
80c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
80d0: 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65  ..#else /* if de
80e0: 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49  fined SQLITE_OMI
80f0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a  T_AUTOVACUUM */.
8100: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8110: 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72 63 29 0a  Put(w,x,y,z,rc).
8120: 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70    #define ptrmap
8130: 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c  Get(w,x,y,z) SQL
8140: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
8150: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74   ptrmapPutOvflPt
8160: 72 28 78 2c 20 79 2c 20 72 63 29 0a 23 65 6e 64  r(x, y, rc).#end
8170: 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  if../*.** Given 
8180: 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e 64  a btree page and
8190: 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30   a cell index (0
81a0: 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73 74   means the first
81b0: 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20   cell on.** the 
81c0: 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68  page, 1 means th
81d0: 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61  e second cell, a
81e0: 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74  nd so forth) ret
81f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
8200: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
8210: 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66 69 6e 64  tent..**.** find
8220: 43 65 6c 6c 50 61 73 74 50 74 72 28 29 20 64 6f  CellPastPtr() do
8230: 65 73 20 74 68 65 20 73 61 6d 65 20 65 78 63 65  es the same exce
8240: 70 74 20 69 74 20 73 6b 69 70 73 20 70 61 73 74  pt it skips past
8250: 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20   the initial.** 
8260: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
8270: 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e 20 69 6e  nter found on in
8280: 74 65 72 69 6f 72 20 70 61 67 65 73 2c 20 69 66  terior pages, if
8290: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 0a 2a   there is one..*
82a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
82b0: 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72  e works only for
82c0: 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e   pages that do n
82d0: 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66  ot contain overf
82e0: 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64  low cells..*/.#d
82f0: 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50  efine findCell(P
8300: 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44  ,I) \.  ((P)->aD
8310: 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  ata + ((P)->mask
8320: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8330: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8340: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8350: 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c  #define findCell
8360: 50 61 73 74 50 74 72 28 50 2c 49 29 20 5c 0a 20  PastPtr(P,I) \. 
8370: 20 28 28 50 29 2d 3e 61 44 61 74 61 4f 66 73 74   ((P)->aDataOfst
8380: 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61 67   + ((P)->maskPag
8390: 65 20 26 20 67 65 74 32 62 79 74 65 41 6c 69 67  e & get2byteAlig
83a0: 6e 65 64 28 26 28 50 29 2d 3e 61 43 65 6c 6c 49  ned(&(P)->aCellI
83b0: 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a 0a 0a 2f  dx[2*(I)]))).../
83c0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6d  *.** This is com
83d0: 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63 65 73 73  mon tail process
83e0: 69 6e 67 20 66 6f 72 20 62 74 72 65 65 50 61 72  ing for btreePar
83f0: 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 0a  seCellPtr() and.
8400: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8410: 6c 50 74 72 49 6e 64 65 78 28 29 20 66 6f 72 20  lPtrIndex() for 
8420: 74 68 65 20 63 61 73 65 20 77 68 65 6e 20 74 68  the case when th
8430: 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20  e cell does not 
8440: 66 69 74 20 65 6e 74 69 72 65 6c 79 0a 2a 2a 20  fit entirely.** 
8450: 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42 2d 74 72  on a single B-tr
8460: 65 65 20 70 61 67 65 2e 20 20 4d 61 6b 65 20 6e  ee page.  Make n
8470: 65 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d  ecessary adjustm
8480: 65 6e 74 73 20 74 6f 20 74 68 65 20 43 65 6c 6c  ents to the Cell
8490: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  Info.** structur
84a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  e..*/.static SQL
84b0: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69  ITE_NOINLINE voi
84c0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
84d0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
84e0: 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50 61 67 65  rflow(.  MemPage
84f0: 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20   *pPage,        
8500: 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
8510: 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a  ing the cell */.
8520: 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
8530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
8540: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
8550: 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c   text. */.  Cell
8560: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
8570: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
8580: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
8590: 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  .){.  /* If the 
85a0: 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74  payload will not
85b0: 20 66 69 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20   fit completely 
85c0: 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
85d0: 65 2c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  e, we have.  ** 
85e0: 74 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75  to decide how mu
85f0: 63 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ch to store loca
8600: 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68  lly and how much
8610: 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20   to spill onto. 
8620: 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
8630: 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67  es.  The strateg
8640: 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  y is to minimize
8650: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75   the amount of u
8660: 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70 61 63 65  nused.  ** space
8670: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
8680: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
8690: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
86a0: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 2a  ocal storage.  *
86b0: 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d 69 6e  * in between min
86c0: 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c 6f 63  Local and maxLoc
86d0: 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 61  al..  **.  ** Wa
86e0: 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67 69 6e 67  rning:  changing
86f0: 20 74 68 65 20 77 61 79 20 6f 76 65 72 66 6c 6f   the way overflo
8700: 77 20 70 61 79 6c 6f 61 64 20 69 73 20 64 69 73  w payload is dis
8710: 74 72 69 62 75 74 65 64 20 69 6e 20 61 6e 79 0a  tributed in any.
8720: 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c 20 72 65    ** way will re
8730: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  sult in an incom
8740: 70 61 74 69 62 6c 65 20 66 69 6c 65 20 66 6f 72  patible file for
8750: 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  mat..  */.  int 
8760: 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69  minLocal;  /* Mi
8770: 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  nimum amount of 
8780: 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63  payload held loc
8790: 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61  ally */.  int ma
87a0: 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69  xLocal;  /* Maxi
87b0: 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61  mum amount of pa
87c0: 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c  yload held local
87d0: 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73 75 72 70  ly */.  int surp
87e0: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
87f0: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
8800: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
8810: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 6d 69 6e  torage */..  min
8820: 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d  Local = pPage->m
8830: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61 78 4c 6f  inLocal;.  maxLo
8840: 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e 6d 61 78  cal = pPage->max
8850: 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70 6c 75 73  Local;.  surplus
8860: 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 70   = minLocal + (p
8870: 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2d  Info->nPayload -
8880: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
8890: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
88a0: 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74 63 61 73  ze-4);.  testcas
88b0: 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78 4c  e( surplus==maxL
88c0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
88d0: 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d 61 78  se( surplus==max
88e0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28  Local+1 );.  if(
88f0: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
8900: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70 49 6e 66  ocal ){.    pInf
8910: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8920: 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d 65 6c 73  )surplus;.  }els
8930: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  e{.    pInfo->nL
8940: 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d 69 6e 4c  ocal = (u16)minL
8950: 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 49 6e 66  ocal;.  }.  pInf
8960: 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 28  o->iOverflow = (
8970: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
8980: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
8990: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 3b 0a 20  cal] - pCell);. 
89a0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20   pInfo->nSize = 
89b0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
89c0: 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   + 4;.}../*.** T
89d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
89e0: 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d  tines are implem
89f0: 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  entations of the
8a00: 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65 43   MemPage.xParseC
8a10: 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e  ell().** method.
8a20: 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  .**.** Parse a c
8a30: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
8a40: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
8a50: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
8a60: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65  ture..**.** btre
8a70: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
8a80: 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62 6c         =>   tabl
8a90: 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f 64  e btree leaf nod
8aa0: 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  es.** btreeParse
8ab0: 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20  CellNoPayload() 
8ac0: 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72 65   =>   table btre
8ad0: 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73  e internal nodes
8ae0: 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
8af0: 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20 3d  llPtrIndex()   =
8b00: 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65 20  >   index btree 
8b10: 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72  nodes.**.** Ther
8b20: 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61 70  e is also a wrap
8b30: 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74 72  per function btr
8b40: 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 68  eeParseCell() th
8b50: 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20  at works for.** 
8b60: 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70 65  all MemPage type
8b70: 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65 72  s and that refer
8b80: 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20 62  ences the cell b
8b90: 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20 74  y index rather t
8ba0: 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65  han.** by pointe
8bb0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
8bc0: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
8bd0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20  PtrNoPayload(.  
8be0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
8bf0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
8c00: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
8c10: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
8c20: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
8c30: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
8c40: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
8c50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
8c60: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
8c70: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
8c80: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  ture */.){.  ass
8c90: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
8ca0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
8cb0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
8cc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
8cd0: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  eaf==0 );.  asse
8ce0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
8cf0: 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72 74  load );.  assert
8d00: 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  ( pPage->childPt
8d10: 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e  rSize==4 );.#ifn
8d20: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8d30: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8d40: 54 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64  TER(pPage);.#end
8d50: 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  if.  pInfo->nSiz
8d60: 65 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e  e = 4 + getVarin
8d70: 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36  t(&pCell[4], (u6
8d80: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
8d90: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  ;.  pInfo->nPayl
8da0: 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f  oad = 0;.  pInfo
8db0: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20  ->nLocal = 0;.  
8dc0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
8dd0: 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70   = 0;.  pInfo->p
8de0: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 72  Payload = 0;.  r
8df0: 65 74 75 72 6e 3b 0a 7d 0a 73 74 61 74 69 63 20  eturn;.}.static 
8e00: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8e10: 65 6c 6c 50 74 72 28 0a 20 20 4d 65 6d 50 61 67  ellPtr(.  MemPag
8e20: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
8e30: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
8e40: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
8e50: 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
8e60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
8e70: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
8e80: 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c  l text. */.  Cel
8e90: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
8ea0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
8eb0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
8ec0: 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72  /.){.  u8 *pIter
8ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8ee0: 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74  * For scanning t
8ef0: 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a  hrough pCell */.
8f00: 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20    u32 nPayload; 
8f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f20: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
8f30: 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a  cell payload */.
8f40: 20 20 75 36 34 20 69 4b 65 79 3b 20 20 20 20 20    u64 iKey;     
8f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
8f60: 72 61 63 74 65 64 20 4b 65 79 20 76 61 6c 75 65  racted Key value
8f70: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
8f80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8f90: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
8fa0: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
8fb0: 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30  ( pPage->leaf==0
8fc0: 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d   || pPage->leaf=
8fd0: 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
8fe0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
8ff0: 66 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 6f 50 61  f || pPage->noPa
9000: 79 6c 6f 61 64 20 29 3b 0a 20 20 61 73 73 65 72  yload );.  asser
9010: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
9020: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  oad==0 );.  asse
9030: 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
9040: 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73 65 72  yLeaf );.  asser
9050: 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  t( pPage->childP
9060: 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 70  trSize==0 );.  p
9070: 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a 0a 20  Iter = pCell;.. 
9080: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 6c 6f   /* The next blo
9090: 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20 65 71  ck of code is eq
90a0: 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a  uivalent to:.  *
90b0: 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74 65 72  *.  **     pIter
90c0: 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
90d0: 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61 64 29  pIter, nPayload)
90e0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
90f0: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
9100: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
9110: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
9120: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74   nPayload = *pIt
9130: 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f  er;.  if( nPaylo
9140: 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20  ad>=0x80 ){.    
9150: 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65  u8 *pEnd = &pIte
9160: 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f  r[8];.    nPaylo
9170: 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20  ad &= 0x7f;.    
9180: 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  do{.      nPaylo
9190: 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c  ad = (nPayload<<
91a0: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
91b0: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
91c0: 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d 30 78  le( (*pIter)>=0x
91d0: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
91e0: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
91f0: 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  +;..  /* The nex
9200: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
9210: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9220: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9230: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9240: 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34 2a 29  nt(pIter, (u64*)
9250: 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20  &pInfo->nKey);. 
9260: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63 6f 64   **.  ** The cod
9270: 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74 6f 20  e is inlined to 
9280: 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69 6f 6e  avoid a function
9290: 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 4b   call..  */.  iK
92a0: 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ey = *pIter;.  i
92b0: 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20 29 7b  f( iKey>=0x80 ){
92c0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
92d0: 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20 20 69  &pIter[7];.    i
92e0: 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20 20 20  Key &= 0x7f;.   
92f0: 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20   while(1){.     
9300: 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 37   iKey = (iKey<<7
9310: 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20  ) | (*++pIter & 
9320: 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69 66 28  0x7f);.      if(
9330: 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30 20 29   (*pIter)<0x80 )
9340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
9350: 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20 29 7b  ( pIter>=pEnd ){
9360: 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
9370: 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b 2b 70  (iKey<<8) | *++p
9380: 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20 62 72  Iter;.        br
9390: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
93a0: 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b   }.  }.  pIter++
93b0: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  ;..  pInfo->nKey
93c0: 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65 79 3b   = *(i64*)&iKey;
93d0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
93e0: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
93f0: 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64   pInfo->pPayload
9400: 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74   = pIter;.  test
9410: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
9420: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9430: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
9440: 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e  Payload==pPage->
9450: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
9460: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50  if( nPayload<=pP
9470: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
9480: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
9490: 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f  the (easy) commo
94a0: 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65  n case where the
94b0: 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20   entire payload 
94c0: 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  fits.    ** on t
94d0: 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20  he local page.  
94e0: 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72  No overflow is r
94f0: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
9500: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65      pInfo->nSize
9510: 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75   = nPayload + (u
9520: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
9530: 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66  l);.    if( pInf
9540: 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e  o->nSize<4 ) pIn
9550: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  fo->nSize = 4;. 
9560: 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c     pInfo->nLocal
9570: 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64   = (u16)nPayload
9580: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  ;.    pInfo->iOv
9590: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65  erflow = 0;.  }e
95a0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
95b0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
95c0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
95d0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
95e0: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
95f0: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9600: 65 6c 6c 50 74 72 49 6e 64 65 78 28 0a 20 20 4d  ellPtrIndex(.  M
9610: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9620: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9630: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
9640: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
9650: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9660: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
9670: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
9680: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
9690: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
96a0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
96b0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
96c0: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
96d0: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
96e0: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
96f0: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9700: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9710: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9720: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9730: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
9740: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
9750: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
9760: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
9770: 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d  t( pPage->leaf==
9780: 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66  0 || pPage->leaf
9790: 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
97a0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
97b0: 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  af==0 );.  asser
97c0: 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c  t( pPage->noPayl
97d0: 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 70 49 74 65  oad==0 );.  pIte
97e0: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
97f0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9800: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
9810: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9820: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9830: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9840: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9850: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9860: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9870: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9880: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9890: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
98a0: 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d  hile( *(pIter)>=
98b0: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
98c0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
98d0: 72 2b 2b 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  r++;.  pInfo->nK
98e0: 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ey = nPayload;. 
98f0: 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64   pInfo->nPayload
9900: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70   = nPayload;.  p
9910: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
9920: 20 70 49 74 65 72 3b 0a 20 20 74 65 73 74 63 61   pIter;.  testca
9930: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9940: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
9950: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9960: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9970: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 69 66  xLocal+1 );.  if
9980: 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  ( nPayload<=pPag
9990: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
99a0: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
99b0: 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e 20  e (easy) common 
99c0: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20 65  case where the e
99d0: 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66 69  ntire payload fi
99e0: 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65  ts.    ** on the
99f0: 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e 6f   local page.  No
9a00: 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65 71   overflow is req
9a10: 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  uired..    */.  
9a20: 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d    pInfo->nSize =
9a30: 20 6e 50 61 79 6c 6f 61 64 20 2b 20 28 75 31 36   nPayload + (u16
9a40: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
9a50: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d  ;.    if( pInfo-
9a60: 3e 6e 53 69 7a 65 3c 34 20 29 20 70 49 6e 66 6f  >nSize<4 ) pInfo
9a70: 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20 20  ->nSize = 4;.   
9a80: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
9a90: 20 28 75 31 36 29 6e 50 61 79 6c 6f 61 64 3b 0a   (u16)nPayload;.
9aa0: 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72      pInfo->iOver
9ab0: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  flow = 0;.  }els
9ac0: 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73  e{.    btreePars
9ad0: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
9ae0: 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65  orOverflow(pPage
9af0: 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b  , pCell, pInfo);
9b00: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9b10: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
9b20: 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
9b30: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
9b40: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
9b50: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  the cell */.  in
9b60: 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t iCell,        
9b70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c        /* The cel
9b80: 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20  l index.  First 
9b90: 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43  cell is 0 */.  C
9ba0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
9bb0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
9bc0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
9bd0: 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e   */.){.  pPage->
9be0: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
9bf0: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
9c00: 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29  , iCell), pInfo)
9c10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
9c20: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
9c30: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
9c40: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
9c50: 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a  Page.xCellSize.*
9c60: 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20  * method..**.** 
9c70: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
9c80: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
9c90: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
9ca0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
9cb0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
9cc0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
9cd0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
9ce0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
9cf0: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
9d00: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
9d10: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
9d20: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
9d30: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
9d40: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
9d50: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
9d60: 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72  *.** cellSizePtr
9d70: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d  NoPayload()    =
9d80: 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e  >   table intern
9d90: 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c  al nodes.** cell
9da0: 53 69 7a 65 50 74 72 28 29 20 20 20 20 20 20 20  SizePtr()       
9db0: 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69        =>   all i
9dc0: 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62  ndex nodes & tab
9dd0: 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f  le leaf nodes.*/
9de0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
9df0: 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20  SizePtr(MemPage 
9e00: 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c  *pPage, u8 *pCel
9e10: 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20  l){.  u8 *pIter 
9e20: 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d  = pCell + pPage-
9e30: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f  >childPtrSize; /
9e40: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
9e50: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
9e60: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
9e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e90: 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20  /* End mark for 
9ea0: 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33  a varint */.  u3
9eb0: 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  2 nSize;        
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ed0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76         /* Size v
9ee0: 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  alue to return *
9ef0: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
9f00: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20  _DEBUG.  /* The 
9f10: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
9f20: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  y this function 
9f30: 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65  should always be
9f40: 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a   the same as.  *
9f50: 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e  * the (CellInfo.
9f60: 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75  nSize) value fou
9f70: 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75  nd by doing a fu
9f80: 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a  ll parse of the.
9f90: 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51    ** cell. If SQ
9fa0: 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65  LITE_DEBUG is de
9fb0: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
9fc0: 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d  () at the bottom
9fd0: 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75   of.  ** this fu
9fe0: 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20  nction verifies 
9ff0: 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72 69  that this invari
a000: 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61  ant is not viola
a010: 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ted. */.  CellIn
a020: 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20  fo debuginfo;.  
a030: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
a040: 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  l(pPage, pCell, 
a050: 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e  &debuginfo);.#en
a060: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
a070: 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f 61 64 3d  Page->noPayload=
a080: 3d 30 20 29 3b 0a 20 20 6e 53 69 7a 65 20 3d 20  =0 );.  nSize = 
a090: 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 53  *pIter;.  if( nS
a0a0: 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20  ize>=0x80 ){.   
a0b0: 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 38   pEnd = &pIter[8
a0c0: 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d 20  ];.    nSize &= 
a0d0: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
a0e0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69      nSize = (nSi
a0f0: 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ze<<7) | (*++pIt
a100: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
a110: 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72 29  }while( *(pIter)
a120: 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c  >=0x80 && pIter<
a130: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49  pEnd );.  }.  pI
a140: 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61  ter++;.  if( pPa
a150: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
a160: 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20 70    /* pIter now p
a170: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34 2d  oints at the 64-
a180: 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79 20  bit integer key 
a190: 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62 6c  value, a variabl
a1a0: 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a  e length .    **
a1b0: 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66 6f   integer. The fo
a1c0: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f  llowing block mo
a1d0: 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ves pIter to poi
a1e0: 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74 20  nt at the first 
a1f0: 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73 74  byte.    ** past
a200: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
a210: 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  key value. */.  
a220: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a230: 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  9];.    while( (
a240: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a250: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a260: 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28 20    }.  testcase( 
a270: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a280: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
a290: 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61  case( nSize==pPa
a2a0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29  ge->maxLocal+1 )
a2b0: 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70  ;.  if( nSize<=p
a2c0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a2d0: 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28  {.    nSize += (
a2e0: 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43 65  u32)(pIter - pCe
a2f0: 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 69  ll);.    if( nSi
a300: 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20 34  ze<4 ) nSize = 4
a310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a320: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50  nt minLocal = pP
a330: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20  age->minLocal;. 
a340: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a350: 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d  cal + (nSize - m
a360: 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61 67  inLocal) % (pPag
a370: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
a380: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
a390: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a3a0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b  age->maxLocal );
a3b0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
a3c0: 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  Size==pPage->max
a3d0: 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69  Local+1 );.    i
a3e0: 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e  f( nSize>pPage->
a3f0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
a400: 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63    nSize = minLoc
a410: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53  al;.    }.    nS
a420: 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36 29  ize += 4 + (u16)
a430: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a440: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
a450: 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e  Size==debuginfo.
a460: 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54  nSize || CORRUPT
a470: 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  _DB );.  return 
a480: 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74  (u16)nSize;.}.st
a490: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a4a0: 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65  ePtrNoPayload(Me
a4b0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
a4c0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a   *pCell){.  u8 *
a4d0: 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20  pIter = pCell + 
a4e0: 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  4; /* For loopin
a4f0: 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20  g over bytes of 
a500: 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
a510: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  End;            
a520: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
a530: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23  r a varint */..#
a540: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
a550: 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75  UG.  /* The valu
a560: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
a570: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
a580: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68 65  ld always be the
a590: 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68   same as.  ** th
a5a0: 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a  e (CellInfo.nSiz
a5b0: 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20 62  e) value found b
a5c0: 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70  y doing a full p
a5d0: 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  arse of the.  **
a5e0: 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45   cell. If SQLITE
a5f0: 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65  _DEBUG is define
a600: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 61  d, an assert() a
a610: 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a  t the bottom of.
a620: 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69    ** this functi
a630: 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61 74  on verifies that
a640: 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20   this invariant 
a650: 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e  is not violated.
a660: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64   */.  CellInfo d
a670: 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67  ebuginfo;.  pPag
a680: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
a690: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62  age, pCell, &deb
a6a0: 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20  uginfo);.#else. 
a6b0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
a6c0: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
a6d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a6e0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d  e->childPtrSize=
a6f0: 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70  =4 );.  pEnd = p
a700: 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c  Iter + 9;.  whil
a710: 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30 78  e( (*pIter++)&0x
a720: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a730: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 65   );.  assert( de
a740: 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28  buginfo.nSize==(
a750: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a760: 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ll) || CORRUPT_D
a770: 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75  B );.  return (u
a780: 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c  16)(pIter - pCel
a790: 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53  l);.}...#ifdef S
a7a0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54  QLITE_DEBUG./* T
a7b0: 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e  his variation on
a7c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 69   cellSizePtr() i
a7d0: 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66  s used inside of
a7e0: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
a7f0: 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f  ents.** only. */
a800: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
a810: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
a820: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
a830: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 2d  .  return pPage-
a840: 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65  >xCellSize(pPage
a850: 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  , findCell(pPage
a860: 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e  , iCell));.}.#en
a870: 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
a880: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
a890: 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  UUM./*.** If the
a8a0: 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72   cell pCell, par
a8b0: 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 20  t of page pPage 
a8c0: 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74  contains a point
a8d0: 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72  er.** to an over
a8e0: 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65 72  flow page, inser
a8f0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20  t an entry into 
a900: 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a  the pointer-map.
a910: 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  ** for the overf
a920: 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  low page..*/.sta
a930: 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50  tic void ptrmapP
a940: 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61 67  utOvflPtr(MemPag
a950: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a960: 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a  ell, int *pRC){.
a970: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
a980: 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72 65  .  if( *pRC ) re
a990: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
a9a0: 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50  pCell!=0 );.  pP
a9b0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a9c0: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
a9d0: 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
a9e0: 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  .iOverflow ){.  
a9f0: 20 20 50 67 6e 6f 20 6f 76 66 6c 20 3d 20 67 65    Pgno ovfl = ge
aa00: 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
aa10: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
aa20: 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 50      ptrmapPut(pP
aa30: 61 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20  age->pBt, ovfl, 
aa40: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
aa50: 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70  , pPage->pgno, p
aa60: 52 43 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  RC);.  }.}.#endi
aa70: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61 67  f.../*.** Defrag
aa80: 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67 69  ment the page gi
aa90: 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73 20  ven.  All Cells 
aaa0: 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
aab0: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 70  .** end of the p
aac0: 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65 65  age and all free
aad0: 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65 63   space is collec
aae0: 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a 20  ted into one.** 
aaf0: 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61 74  big FreeBlk that
ab00: 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77 65   occurs in betwe
ab10: 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  en the header an
ab20: 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 65  d cell.** pointe
ab30: 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65 20  r array and the 
ab40: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
ab50: 61 2e 0a 2a 2a 0a 2a 2a 20 45 56 49 44 45 4e 43  a..**.** EVIDENC
ab60: 45 2d 4f 46 3a 20 52 2d 34 34 35 38 32 2d 36 30  E-OF: R-44582-60
ab70: 31 33 38 20 53 51 4c 69 74 65 20 6d 61 79 20 66  138 SQLite may f
ab80: 72 6f 6d 20 74 69 6d 65 20 74 6f 20 74 69 6d 65  rom time to time
ab90: 20 72 65 6f 72 67 61 6e 69 7a 65 20 61 0a 2a 2a   reorganize a.**
aba0: 20 62 2d 74 72 65 65 20 70 61 67 65 20 73 6f 20   b-tree page so 
abb0: 74 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e  that there are n
abc0: 6f 20 66 72 65 65 62 6c 6f 63 6b 73 20 6f 72 20  o freeblocks or 
abd0: 66 72 61 67 6d 65 6e 74 20 62 79 74 65 73 2c 20  fragment bytes, 
abe0: 61 6c 6c 0a 2a 2a 20 75 6e 75 73 65 64 20 62 79  all.** unused by
abf0: 74 65 73 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  tes are containe
ac00: 64 20 69 6e 20 74 68 65 20 75 6e 61 6c 6c 6f 63  d in the unalloc
ac10: 61 74 65 64 20 73 70 61 63 65 20 72 65 67 69 6f  ated space regio
ac20: 6e 2c 20 61 6e 64 20 61 6c 6c 0a 2a 2a 20 63 65  n, and all.** ce
ac30: 6c 6c 73 20 61 72 65 20 70 61 63 6b 65 64 20 74  lls are packed t
ac40: 69 67 68 74 6c 79 20 61 74 20 74 68 65 20 65 6e  ightly at the en
ac50: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  d of the page..*
ac60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 66  /.static int def
ac70: 72 61 67 6d 65 6e 74 50 61 67 65 28 4d 65 6d 50  ragmentPage(MemP
ac80: 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69  age *pPage){.  i
ac90: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
aca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
acb0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
acc0: 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  nt pc;          
acd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
ace0: 72 65 73 73 20 6f 66 20 74 68 65 20 69 2d 74 68  ress of the i-th
acf0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 68   cell */.  int h
ad00: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
ad10: 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
ad20: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
ad30: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 73 69 7a 65  er */.  int size
ad40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ad50: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20     /* Size of a 
ad60: 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 75 73  cell */.  int us
ad70: 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  ableSize;       
ad80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ad90: 66 20 75 73 61 62 6c 65 20 62 79 74 65 73 20 6f  f usable bytes o
ada0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  n a page */.  in
adb0: 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
adc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
add0: 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 70  et to the cell p
ade0: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
adf0: 20 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20    int cbrk;     
ae00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae10: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
ae20: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
ae30: 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c  /* Number of cel
ae60: 6c 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  ls on the page *
ae70: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
ae80: 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  r *data;       /
ae90: 2a 20 54 68 65 20 70 61 67 65 20 64 61 74 61 20  * The page data 
aea0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
aeb0: 61 72 20 2a 74 65 6d 70 3b 20 20 20 20 20 20 20  ar *temp;       
aec0: 2f 2a 20 54 65 6d 70 20 61 72 65 61 20 66 6f 72  /* Temp area for
aed0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
aee0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
aef0: 20 2a 73 72 63 3b 20 20 20 20 20 20 20 20 2f 2a   *src;        /*
af00: 20 53 6f 75 72 63 65 20 6f 66 20 63 6f 6e 74 65   Source of conte
af10: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c  nt */.  int iCel
af20: 6c 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  lFirst;         
af30: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f     /* First allo
af40: 77 61 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65 78  wable cell index
af50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65 6c 6c 4c   */.  int iCellL
af60: 61 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ast;            
af70: 20 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c   /* Last possibl
af80: 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a  e cell index */.
af90: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
afa0: 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
afb0: 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
afc0: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
afd0: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
afe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
aff0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
b000: 7a 65 20 3c 3d 20 53 51 4c 49 54 45 5f 4d 41 58  ze <= SQLITE_MAX
b010: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
b020: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
b030: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
b040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
b050: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
b060: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
b070: 3b 0a 20 20 74 65 6d 70 20 3d 20 30 3b 0a 20 20  ;.  temp = 0;.  
b080: 73 72 63 20 3d 20 64 61 74 61 20 3d 20 70 50 61  src = data = pPa
b090: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
b0a0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
b0b0: 73 65 74 3b 0a 20 20 63 65 6c 6c 4f 66 66 73 65  set;.  cellOffse
b0c0: 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
b0d0: 66 66 73 65 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d  ffset;.  nCell =
b0e0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
b0f0: 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3d 3d   assert( nCell==
b100: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
b110: 64 72 2b 33 5d 29 20 29 3b 0a 20 20 75 73 61 62  dr+3]) );.  usab
b120: 6c 65 53 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e  leSize = pPage->
b130: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
b140: 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c 65  .  cbrk = usable
b150: 53 69 7a 65 3b 0a 20 20 69 43 65 6c 6c 46 69 72  Size;.  iCellFir
b160: 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  st = cellOffset 
b170: 2b 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 69 43 65  + 2*nCell;.  iCe
b180: 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c 65 53  llLast = usableS
b190: 69 7a 65 20 2d 20 34 3b 0a 20 20 66 6f 72 28 69  ize - 4;.  for(i
b1a0: 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
b1b0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72  ){.    u8 *pAddr
b1c0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74  ;     /* The i-t
b1d0: 68 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  h cell pointer *
b1e0: 2f 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64  /.    pAddr = &d
b1f0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ata[cellOffset +
b200: 20 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20   i*2];.    pc = 
b210: 67 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b  get2byte(pAddr);
b220: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b230: 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b  c==iCellFirst );
b240: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b250: 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a  c==iCellLast );.
b260: 20 20 20 20 2f 2a 20 54 68 65 73 65 20 63 6f 6e      /* These con
b270: 64 69 74 69 6f 6e 73 20 68 61 76 65 20 61 6c 72  ditions have alr
b280: 65 61 64 79 20 62 65 65 6e 20 76 65 72 69 66 69  eady been verifi
b290: 65 64 20 69 6e 20 62 74 72 65 65 49 6e 69 74 50  ed in btreeInitP
b2a0: 61 67 65 28 29 0a 20 20 20 20 2a 2a 20 69 66 20  age().    ** if 
b2b0: 50 52 41 47 4d 41 20 63 65 6c 6c 5f 73 69 7a 65  PRAGMA cell_size
b2c0: 5f 63 68 65 63 6b 3d 4f 4e 2e 0a 20 20 20 20 2a  _check=ON..    *
b2d0: 2f 0a 20 20 20 20 69 66 28 20 70 63 3c 69 43 65  /.    if( pc<iCe
b2e0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
b2f0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
b300: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
b310: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
b320: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
b330: 63 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 26 26  c>=iCellFirst &&
b340: 20 70 63 3c 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc<=iCellLast )
b350: 3b 0a 20 20 20 20 73 69 7a 65 20 3d 20 70 50 61  ;.    size = pPa
b360: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
b370: 61 67 65 2c 20 26 73 72 63 5b 70 63 5d 29 3b 0a  age, &src[pc]);.
b380: 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69 7a 65      cbrk -= size
b390: 3b 0a 20 20 20 20 69 66 28 20 63 62 72 6b 3c 69  ;.    if( cbrk<i
b3a0: 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 2b  CellFirst || pc+
b3b0: 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20  size>usableSize 
b3c0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
b3d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b3e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
b3f0: 73 73 65 72 74 28 20 63 62 72 6b 2b 73 69 7a 65  ssert( cbrk+size
b400: 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 26 26 20  <=usableSize && 
b410: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b420: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
b430: 28 20 63 62 72 6b 2b 73 69 7a 65 3d 3d 75 73 61  ( cbrk+size==usa
b440: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 74  bleSize );.    t
b450: 65 73 74 63 61 73 65 28 20 70 63 2b 73 69 7a 65  estcase( pc+size
b460: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b470: 20 20 20 20 70 75 74 32 62 79 74 65 28 70 41 64      put2byte(pAd
b480: 64 72 2c 20 63 62 72 6b 29 3b 0a 20 20 20 20 69  dr, cbrk);.    i
b490: 66 28 20 74 65 6d 70 3d 3d 30 20 29 7b 0a 20 20  f( temp==0 ){.  
b4a0: 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 20      int x;.     
b4b0: 20 69 66 28 20 63 62 72 6b 3d 3d 70 63 20 29 20   if( cbrk==pc ) 
b4c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b4d0: 74 65 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  temp = sqlite3Pa
b4e0: 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 61  gerTempSpace(pPa
b4f0: 67 65 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  ge->pBt->pPager)
b500: 3b 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32  ;.      x = get2
b510: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b520: 5d 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ]);.      memcpy
b530: 28 26 74 65 6d 70 5b 78 5d 2c 20 26 64 61 74 61  (&temp[x], &data
b540: 5b 78 5d 2c 20 28 63 62 72 6b 2b 73 69 7a 65 29  [x], (cbrk+size)
b550: 20 2d 20 78 29 3b 0a 20 20 20 20 20 20 73 72 63   - x);.      src
b560: 20 3d 20 74 65 6d 70 3b 0a 20 20 20 20 7d 0a 20   = temp;.    }. 
b570: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
b580: 63 62 72 6b 5d 2c 20 26 73 72 63 5b 70 63 5d 2c  cbrk], &src[pc],
b590: 20 73 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73   size);.  }.  as
b5a0: 73 65 72 74 28 20 63 62 72 6b 3e 3d 69 43 65 6c  sert( cbrk>=iCel
b5b0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 70 75 74 32  lFirst );.  put2
b5c0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
b5d0: 5d 2c 20 63 62 72 6b 29 3b 0a 20 20 64 61 74 61  ], cbrk);.  data
b5e0: 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20 20 64  [hdr+1] = 0;.  d
b5f0: 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30 3b 0a  ata[hdr+2] = 0;.
b600: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
b610: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  0;.  memset(&dat
b620: 61 5b 69 43 65 6c 6c 46 69 72 73 74 5d 2c 20 30  a[iCellFirst], 0
b630: 2c 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73  , cbrk-iCellFirs
b640: 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  t);.  assert( sq
b650: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
b660: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
b670: 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 63  Page) );.  if( c
b680: 62 72 6b 2d 69 43 65 6c 6c 46 69 72 73 74 21 3d  brk-iCellFirst!=
b690: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a  pPage->nFree ){.
b6a0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b6b0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
b6c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b6d0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b6e0: 20 53 65 61 72 63 68 20 74 68 65 20 66 72 65 65   Search the free
b6f0: 2d 6c 69 73 74 20 6f 6e 20 70 61 67 65 20 70 50  -list on page pP
b700: 67 20 66 6f 72 20 73 70 61 63 65 20 74 6f 20 73  g for space to s
b710: 74 6f 72 65 20 61 20 63 65 6c 6c 20 6e 42 79 74  tore a cell nByt
b720: 65 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 73 69  e bytes in.** si
b730: 7a 65 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62  ze. If one can b
b740: 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
b750: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
b760: 20 73 70 61 63 65 20 61 6e 64 20 72 65 6d 6f 76   space and remov
b770: 65 20 69 74 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  e it.** from the
b780: 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
b790: 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
b7a0: 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 66 6f   space can be fo
b7b0: 75 6e 64 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  und on the free-
b7c0: 6c 69 73 74 2c 20 72 65 74 75 72 6e 20 4e 55 4c  list, return NUL
b7d0: 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  L..**.** This fu
b7e0: 6e 63 74 69 6f 6e 20 6d 61 79 20 64 65 74 65 63  nction may detec
b7f0: 74 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 74  t corruption wit
b800: 68 69 6e 20 70 50 67 2e 20 20 49 66 20 63 6f 72  hin pPg.  If cor
b810: 72 75 70 74 69 6f 6e 20 69 73 0a 2a 2a 20 64 65  ruption is.** de
b820: 74 65 63 74 65 64 20 74 68 65 6e 20 2a 70 52 63  tected then *pRc
b830: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
b840: 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 4e 55  E_CORRUPT and NU
b850: 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
b860: 2a 2a 0a 2a 2a 20 53 6c 6f 74 73 20 6f 6e 20 74  **.** Slots on t
b870: 68 65 20 66 72 65 65 20 6c 69 73 74 20 74 68 61  he free list tha
b880: 74 20 61 72 65 20 62 65 74 77 65 65 6e 20 31 20  t are between 1 
b890: 61 6e 64 20 33 20 62 79 74 65 73 20 6c 61 72 67  and 3 bytes larg
b8a0: 65 72 20 74 68 61 6e 20 6e 42 79 74 65 0a 2a 2a  er than nByte.**
b8b0: 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64   will be ignored
b8c0: 20 69 66 20 61 64 64 69 6e 67 20 74 68 65 20 65   if adding the e
b8d0: 78 74 72 61 20 73 70 61 63 65 20 74 6f 20 74 68  xtra space to th
b8e0: 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  e fragmentation 
b8f0: 63 6f 75 6e 74 0a 2a 2a 20 63 61 75 73 65 73 20  count.** causes 
b900: 74 68 65 20 66 72 61 67 6d 65 6e 74 61 74 69 6f  the fragmentatio
b910: 6e 20 63 6f 75 6e 74 20 74 6f 20 65 78 63 65 65  n count to excee
b920: 64 20 36 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  d 60..*/.static 
b930: 75 38 20 2a 70 61 67 65 46 69 6e 64 53 6c 6f 74  u8 *pageFindSlot
b940: 28 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 69  (MemPage *pPg, i
b950: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
b960: 52 63 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Rc){.  const int
b970: 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f   hdr = pPg->hdrO
b980: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 20 63 6f  ffset;.  u8 * co
b990: 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
b9a0: 3e 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 41  >aData;.  int iA
b9b0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
b9c0: 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
b9d0: 74 65 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  te(&aData[iAddr]
b9e0: 29 3b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 69 6e  );.  int x;.  in
b9f0: 74 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  t usableSize = p
ba00: 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
ba10: 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ize;..  assert( 
ba20: 70 63 3e 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  pc>0 );.  do{.  
ba30: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
ba40: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
ba50: 66 20 74 68 65 20 66 72 65 65 20 73 6c 6f 74 20  f the free slot 
ba60: 2a 2f 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  */.    /* EVIDEN
ba70: 43 45 2d 4f 46 3a 20 52 2d 30 36 38 36 36 2d 33  CE-OF: R-06866-3
ba80: 39 31 32 35 20 46 72 65 65 62 6c 6f 63 6b 73 20  9125 Freeblocks 
ba90: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 6e 6e 65  are always conne
baa0: 63 74 65 64 20 69 6e 20 6f 72 64 65 72 20 6f 66  cted in order of
bab0: 0a 20 20 20 20 2a 2a 20 69 6e 63 72 65 61 73 69  .    ** increasi
bac0: 6e 67 20 6f 66 66 73 65 74 2e 20 2a 2f 0a 20 20  ng offset. */.  
bad0: 20 20 69 66 28 20 70 63 3e 75 73 61 62 6c 65 53    if( pc>usableS
bae0: 69 7a 65 2d 34 20 7c 7c 20 70 63 3c 69 41 64 64  ize-4 || pc<iAdd
baf0: 72 2b 34 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  r+4 ){.      *pR
bb00: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
bb10: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
bb20: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
bb30: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
bb40: 46 3a 20 52 2d 32 32 37 31 30 2d 35 33 33 32 38  F: R-22710-53328
bb50: 20 54 68 65 20 74 68 69 72 64 20 61 6e 64 20 66   The third and f
bb60: 6f 75 72 74 68 20 62 79 74 65 73 20 6f 66 20 65  ourth bytes of e
bb70: 61 63 68 0a 20 20 20 20 2a 2a 20 66 72 65 65 62  ach.    ** freeb
bb80: 6c 6f 63 6b 20 66 6f 72 6d 20 61 20 62 69 67 2d  lock form a big-
bb90: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
bba0: 68 69 63 68 20 69 73 20 74 68 65 20 73 69 7a 65  hich is the size
bbb0: 20 6f 66 20 74 68 65 20 66 72 65 65 62 6c 6f 63   of the freebloc
bbc0: 6b 0a 20 20 20 20 2a 2a 20 69 6e 20 62 79 74 65  k.    ** in byte
bbd0: 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  s, including the
bbe0: 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 2e 20   4-byte header. 
bbf0: 2a 2f 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65  */.    size = ge
bc00: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
bc10: 2b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 78  +2]);.    if( (x
bc20: 20 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 29   = size - nByte)
bc30: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 74 65 73  >=0 ){.      tes
bc40: 74 63 61 73 65 28 20 78 3d 3d 34 20 29 3b 0a 20  tcase( x==4 );. 
bc50: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 78       testcase( x
bc60: 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==3 );.      if(
bc70: 20 70 63 20 3c 20 70 50 67 2d 3e 63 65 6c 6c 4f   pc < pPg->cellO
bc80: 66 66 73 65 74 2b 32 2a 70 50 67 2d 3e 6e 43 65  ffset+2*pPg->nCe
bc90: 6c 6c 20 7c 7c 20 73 69 7a 65 2b 70 63 20 3e 20  ll || size+pc > 
bca0: 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
bcb0: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
bcc0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
bcd0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
bce0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
bcf0: 69 66 28 20 78 3c 34 20 29 7b 0a 20 20 20 20 20  if( x<4 ){.     
bd00: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
bd10: 46 3a 20 52 2d 31 31 34 39 38 2d 35 38 30 32 32  F: R-11498-58022
bd20: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
bd30: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
bd40: 68 65 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20  he total.       
bd50: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 62 79   ** number of by
bd60: 74 65 73 20 69 6e 20 66 72 61 67 6d 65 6e 74 73  tes in fragments
bd70: 20 6d 61 79 20 6e 6f 74 20 65 78 63 65 65 64 20   may not exceed 
bd80: 36 30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  60. */.        i
bd90: 66 28 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 3e  f( aData[hdr+7]>
bda0: 35 37 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  57 ) return 0;..
bdb0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
bdc0: 65 20 74 68 65 20 73 6c 6f 74 20 66 72 6f 6d 20  e the slot from 
bdd0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 55  the free-list. U
bde0: 70 64 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  pdate the number
bdf0: 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   of.        ** f
be00: 72 61 67 6d 65 6e 74 65 64 20 62 79 74 65 73 20  ragmented bytes 
be10: 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65 2e  within the page.
be20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   */.        memc
be30: 70 79 28 26 61 44 61 74 61 5b 69 41 64 64 72 5d  py(&aData[iAddr]
be40: 2c 20 26 61 44 61 74 61 5b 70 63 5d 2c 20 32 29  , &aData[pc], 2)
be50: 3b 0a 20 20 20 20 20 20 20 20 61 44 61 74 61 5b  ;.        aData[
be60: 68 64 72 2b 37 5d 20 2b 3d 20 28 75 38 29 78 3b  hdr+7] += (u8)x;
be70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
be80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 6c 6f        /* The slo
be90: 74 20 72 65 6d 61 69 6e 73 20 6f 6e 20 74 68 65  t remains on the
bea0: 20 66 72 65 65 2d 6c 69 73 74 2e 20 52 65 64 75   free-list. Redu
beb0: 63 65 20 69 74 73 20 73 69 7a 65 20 74 6f 20 61  ce its size to a
bec0: 63 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20  ccount.         
bed0: 2a 2a 20 66 6f 72 20 74 68 65 20 70 6f 72 74 69  ** for the porti
bee0: 6f 6e 20 75 73 65 64 20 62 79 20 74 68 65 20 6e  on used by the n
bef0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 2a  ew allocation. *
bf00: 2f 0a 20 20 20 20 20 20 20 20 70 75 74 32 62 79  /.        put2by
bf10: 74 65 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 2c  te(&aData[pc+2],
bf20: 20 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   x);.      }.   
bf30: 20 20 20 72 65 74 75 72 6e 20 26 61 44 61 74 61     return &aData
bf40: 5b 70 63 20 2b 20 78 5d 3b 0a 20 20 20 20 7d 0a  [pc + x];.    }.
bf50: 20 20 20 20 69 41 64 64 72 20 3d 20 70 63 3b 0a      iAddr = pc;.
bf60: 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79 74      pc = get2byt
bf70: 65 28 26 61 44 61 74 61 5b 70 63 5d 29 3b 0a 20  e(&aData[pc]);. 
bf80: 20 7d 77 68 69 6c 65 28 20 70 63 20 29 3b 0a 0a   }while( pc );..
bf90: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
bfa0: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6e 42  *.** Allocate nB
bfb0: 79 74 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  yte bytes of spa
bfc0: 63 65 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 74  ce from within t
bfd0: 68 65 20 42 2d 54 72 65 65 20 70 61 67 65 20 70  he B-Tree page p
bfe0: 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20  assed.** as the 
bff0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20  first argument. 
c000: 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 49 64 78  Write into *pIdx
c010: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74 6f 20   the index into 
c020: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 0a 2a  pPage->aData[].*
c030: 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62  * of the first b
c040: 79 74 65 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64  yte of allocated
c050: 20 73 70 61 63 65 2e 20 52 65 74 75 72 6e 20 65   space. Return e
c060: 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4f 4b 20  ither SQLITE_OK 
c070: 6f 72 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 63  or.** an error c
c080: 6f 64 65 20 28 75 73 75 61 6c 6c 79 20 53 51 4c  ode (usually SQL
c090: 49 54 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a  ITE_CORRUPT)..**
c0a0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 67  .** The caller g
c0b0: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 74  uarantees that t
c0c0: 68 65 72 65 20 69 73 20 73 75 66 66 69 63 69 65  here is sufficie
c0d0: 6e 74 20 73 70 61 63 65 20 74 6f 20 6d 61 6b 65  nt space to make
c0e0: 20 74 68 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69   the.** allocati
c0f0: 6f 6e 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  on.  This routin
c100: 65 20 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20  e might need to 
c110: 64 65 66 72 61 67 6d 65 6e 74 20 69 6e 20 6f 72  defragment in or
c120: 64 65 72 20 74 6f 20 62 72 69 6e 67 0a 2a 2a 20  der to bring.** 
c130: 61 6c 6c 20 74 68 65 20 73 70 61 63 65 20 74 6f  all the space to
c140: 67 65 74 68 65 72 2c 20 68 6f 77 65 76 65 72 2e  gether, however.
c150: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
c160: 69 6c 6c 20 61 76 6f 69 64 20 75 73 69 6e 67 0a  ill avoid using.
c170: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 77 6f  ** the first two
c180: 20 62 79 74 65 73 20 70 61 73 74 20 74 68 65 20   bytes past the 
c190: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 65  cell pointer are
c1a0: 61 20 73 69 6e 63 65 20 70 72 65 73 75 6d 61 62  a since presumab
c1b0: 6c 79 20 74 68 69 73 0a 2a 2a 20 61 6c 6c 6f 63  ly this.** alloc
c1c0: 61 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6d  ation is being m
c1d0: 61 64 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ade in order to 
c1e0: 69 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65 6c  insert a new cel
c1f0: 6c 2c 20 73 6f 20 77 65 20 77 69 6c 6c 0a 2a 2a  l, so we will.**
c200: 20 61 6c 73 6f 20 65 6e 64 20 75 70 20 6e 65 65   also end up nee
c210: 64 69 6e 67 20 61 20 6e 65 77 20 63 65 6c 6c 20  ding a new cell 
c220: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  pointer..*/.stat
c230: 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 53  ic int allocateS
c240: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
c250: 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  age, int nByte, 
c260: 69 6e 74 20 2a 70 49 64 78 29 7b 0a 20 20 63 6f  int *pIdx){.  co
c270: 6e 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50  nst int hdr = pP
c280: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20  age->hdrOffset; 
c290: 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
c2a0: 65 20 6f 66 20 70 50 61 67 65 2d 3e 68 64 72 4f  e of pPage->hdrO
c2b0: 66 66 73 65 74 20 2a 2f 0a 20 20 75 38 20 2a 20  ffset */.  u8 * 
c2c0: 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 70 50 61  const data = pPa
c2d0: 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20  ge->aData;      
c2e0: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
c2f0: 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  f pPage->aData *
c300: 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
c310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c320: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
c330: 74 20 62 79 74 65 20 6f 66 20 63 65 6c 6c 20 63  t byte of cell c
c340: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
c350: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c360: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
c370: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
c380: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
c390: 20 20 69 6e 74 20 67 61 70 3b 20 20 20 20 20 20    int gap;      
c3a0: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c3b0: 6f 66 20 67 61 70 20 62 65 74 77 65 65 6e 20 63  of gap between c
c3c0: 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 61 6e 64  ell pointers and
c3d0: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f   cell content */
c3e0: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
c3f0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
c400: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
c410: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
c420: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
c430: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
c440: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
c450: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
c460: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c470: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
c480: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
c490: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
c4a0: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
c4b0: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
c4c0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
c4d0: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  low==0 );.  asse
c4e0: 72 74 28 20 6e 42 79 74 65 20 3c 20 28 69 6e 74  rt( nByte < (int
c4f0: 29 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  )(pPage->pBt->us
c500: 61 62 6c 65 53 69 7a 65 2d 38 29 20 29 3b 0a 0a  ableSize-8) );..
c510: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
c520: 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 3d 20 68  >cellOffset == h
c530: 64 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67  dr + 12 - 4*pPag
c540: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 67 61 70  e->leaf );.  gap
c550: 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66   = pPage->cellOf
c560: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
c570: 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28  nCell;.  assert(
c580: 20 67 61 70 3c 3d 36 35 35 33 36 20 29 3b 0a 20   gap<=65536 );. 
c590: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
c5a0: 20 52 2d 32 39 33 35 36 2d 30 32 33 39 31 20 49   R-29356-02391 I
c5b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75  f the database u
c5c0: 73 65 73 20 61 20 36 35 35 33 36 2d 62 79 74 65  ses a 65536-byte
c5d0: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 2a 2a 20   page size.  ** 
c5e0: 61 6e 64 20 74 68 65 20 72 65 73 65 72 76 65 64  and the reserved
c5f0: 20 73 70 61 63 65 20 69 73 20 7a 65 72 6f 20 28   space is zero (
c600: 74 68 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20  the usual value 
c610: 66 6f 72 20 72 65 73 65 72 76 65 64 20 73 70 61  for reserved spa
c620: 63 65 29 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  ce).  ** then th
c630: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f  e cell content o
c640: 66 66 73 65 74 20 6f 66 20 61 6e 20 65 6d 70 74  ffset of an empt
c650: 79 20 70 61 67 65 20 77 61 6e 74 73 20 74 6f 20  y page wants to 
c660: 62 65 20 36 35 35 33 36 2e 0a 20 20 2a 2a 20 48  be 65536..  ** H
c670: 6f 77 65 76 65 72 2c 20 74 68 61 74 20 69 6e 74  owever, that int
c680: 65 67 65 72 20 69 73 20 74 6f 6f 20 6c 61 72 67  eger is too larg
c690: 65 20 74 6f 20 62 65 20 73 74 6f 72 65 64 20 69  e to be stored i
c6a0: 6e 20 61 20 32 2d 62 79 74 65 20 75 6e 73 69 67  n a 2-byte unsig
c6b0: 6e 65 64 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  ned.  ** integer
c6c0: 2c 20 73 6f 20 61 20 76 61 6c 75 65 20 6f 66 20  , so a value of 
c6d0: 30 20 69 73 20 75 73 65 64 20 69 6e 20 69 74 73  0 is used in its
c6e0: 20 70 6c 61 63 65 2e 20 2a 2f 0a 20 20 74 6f 70   place. */.  top
c6f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
c700: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 61 73 73  a[hdr+5]);.  ass
c710: 65 72 74 28 20 74 6f 70 3c 3d 28 69 6e 74 29 70  ert( top<=(int)p
c720: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
c730: 65 53 69 7a 65 20 29 3b 20 2f 2a 20 50 72 65 76  eSize ); /* Prev
c740: 65 6e 74 20 62 79 20 67 65 74 41 6e 64 49 6e 69  ent by getAndIni
c750: 74 50 61 67 65 28 29 20 2a 2f 0a 20 20 69 66 28  tPage() */.  if(
c760: 20 67 61 70 3e 74 6f 70 20 29 7b 0a 20 20 20 20   gap>top ){.    
c770: 69 66 28 20 74 6f 70 3d 3d 30 20 26 26 20 70 50  if( top==0 && pP
c780: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
c790: 53 69 7a 65 3d 3d 36 35 35 33 36 20 29 7b 0a 20  Size==65536 ){. 
c7a0: 20 20 20 20 20 74 6f 70 20 3d 20 36 35 35 33 36       top = 65536
c7b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c7c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c7d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
c7e0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
c7f0: 66 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  f there is enoug
c800: 68 20 73 70 61 63 65 20 62 65 74 77 65 65 6e 20  h space between 
c810: 67 61 70 20 61 6e 64 20 74 6f 70 20 66 6f 72 20  gap and top for 
c820: 6f 6e 65 20 6d 6f 72 65 20 63 65 6c 6c 20 70 6f  one more cell po
c830: 69 6e 74 65 72 0a 20 20 2a 2a 20 61 72 72 61 79  inter.  ** array
c840: 20 65 6e 74 72 79 20 6f 66 66 73 65 74 2c 20 61   entry offset, a
c850: 6e 64 20 69 66 20 74 68 65 20 66 72 65 65 6c 69  nd if the freeli
c860: 73 74 20 69 73 20 6e 6f 74 20 65 6d 70 74 79 2c  st is not empty,
c870: 20 74 68 65 6e 20 73 65 61 72 63 68 20 74 68 65   then search the
c880: 0a 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20 6c  .  ** freelist l
c890: 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 66 72 65  ooking for a fre
c8a0: 65 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67  e slot big enoug
c8b0: 68 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  h to satisfy the
c8c0: 20 72 65 71 75 65 73 74 2e 0a 20 20 2a 2f 0a 20   request..  */. 
c8d0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32   testcase( gap+2
c8e0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
c8f0: 61 73 65 28 20 67 61 70 2b 31 3d 3d 74 6f 70 20  ase( gap+1==top 
c900: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c910: 61 70 3d 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28  ap==top );.  if(
c920: 20 28 64 61 74 61 5b 68 64 72 2b 32 5d 20 7c 7c   (data[hdr+2] ||
c930: 20 64 61 74 61 5b 68 64 72 2b 31 5d 29 20 26 26   data[hdr+1]) &&
c940: 20 67 61 70 2b 32 3c 3d 74 6f 70 20 29 7b 0a 20   gap+2<=top ){. 
c950: 20 20 20 75 38 20 2a 70 53 70 61 63 65 20 3d 20     u8 *pSpace = 
c960: 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50 61  pageFindSlot(pPa
c970: 67 65 2c 20 6e 42 79 74 65 2c 20 26 72 63 29 3b  ge, nByte, &rc);
c980: 0a 20 20 20 20 69 66 28 20 70 53 70 61 63 65 20  .    if( pSpace 
c990: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
c9a0: 20 70 53 70 61 63 65 3e 3d 64 61 74 61 20 26 26   pSpace>=data &&
c9b0: 20 28 70 53 70 61 63 65 20 2d 20 64 61 74 61 29   (pSpace - data)
c9c0: 3c 36 35 35 33 36 20 29 3b 0a 20 20 20 20 20 20  <65536 );.      
c9d0: 2a 70 49 64 78 20 3d 20 28 69 6e 74 29 28 70 53  *pIdx = (int)(pS
c9e0: 70 61 63 65 20 2d 20 64 61 74 61 29 3b 0a 20 20  pace - data);.  
c9f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ca00: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
ca10: 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
ca20: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
ca30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72  .  }..  /* The r
ca40: 65 71 75 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74  equest could not
ca50: 20 62 65 20 66 75 6c 66 69 6c 6c 65 64 20 75 73   be fulfilled us
ca60: 69 6e 67 20 61 20 66 72 65 65 6c 69 73 74 20 73  ing a freelist s
ca70: 6c 6f 74 2e 20 20 43 68 65 63 6b 0a 20 20 2a 2a  lot.  Check.  **
ca80: 20 74 6f 20 73 65 65 20 69 66 20 64 65 66 72 61   to see if defra
ca90: 67 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 6e 65  gmentation is ne
caa0: 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
cab0: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 32 2b  testcase( gap+2+
cac0: 6e 42 79 74 65 3d 3d 74 6f 70 20 29 3b 0a 20 20  nByte==top );.  
cad0: 69 66 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3e  if( gap+2+nByte>
cae0: 74 6f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  top ){.    asser
caf0: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
cb00: 30 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  0 || CORRUPT_DB 
cb10: 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 65 66 72  );.    rc = defr
cb20: 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65  agmentPage(pPage
cb30: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
cb40: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 74  return rc;.    t
cb50: 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74  op = get2byteNot
cb60: 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35  Zero(&data[hdr+5
cb70: 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
cb80: 67 61 70 2b 6e 42 79 74 65 3c 3d 74 6f 70 20 29  gap+nByte<=top )
cb90: 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 6c 6c  ;.  }...  /* All
cba0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f  ocate memory fro
cbb0: 6d 20 74 68 65 20 67 61 70 20 69 6e 20 62 65 74  m the gap in bet
cbc0: 77 65 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f  ween the cell po
cbd0: 69 6e 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a  inter array.  **
cbe0: 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f   and the cell co
cbf0: 6e 74 65 6e 74 20 61 72 65 61 2e 20 20 54 68 65  ntent area.  The
cc00: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cc10: 20 63 61 6c 6c 20 68 61 73 20 61 6c 72 65 61 64   call has alread
cc20: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 61 74 65 64  y.  ** validated
cc30: 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
cc40: 47 69 76 65 6e 20 74 68 61 74 20 74 68 65 20 66  Given that the f
cc50: 72 65 65 6c 69 73 74 20 69 73 20 76 61 6c 69 64  reelist is valid
cc60: 2c 20 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20  , there.  ** is 
cc70: 6e 6f 20 77 61 79 20 74 68 61 74 20 74 68 65 20  no way that the 
cc80: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 20 65  allocation can e
cc90: 78 74 65 6e 64 20 6f 66 66 20 74 68 65 20 65 6e  xtend off the en
cca0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 20  d of the page.. 
ccb0: 20 2a 2a 20 54 68 65 20 61 73 73 65 72 74 28 29   ** The assert()
ccc0: 20 62 65 6c 6f 77 20 76 65 72 69 66 69 65 73 20   below verifies 
ccd0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
cce0: 74 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 74 6f  tence..  */.  to
ccf0: 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 70 75  p -= nByte;.  pu
cd00: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
cd10: 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 61 73 73  +5], top);.  ass
cd20: 65 72 74 28 20 74 6f 70 2b 6e 42 79 74 65 20 3c  ert( top+nByte <
cd30: 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
cd40: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
cd50: 0a 20 20 2a 70 49 64 78 20 3d 20 74 6f 70 3b 0a  .  *pIdx = top;.
cd60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
cd70: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
cd80: 75 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66  urn a section of
cd90: 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
cda0: 61 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  a to the freelis
cdb0: 74 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  t..** The first 
cdc0: 62 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20  byte of the new 
cdd0: 66 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50  free block is pP
cde0: 61 67 65 2d 3e 61 44 61 74 61 5b 69 53 74 61 72  age->aData[iStar
cdf0: 74 5d 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69  t].** and the si
ce00: 7a 65 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20  ze of the block 
ce10: 69 73 20 69 53 69 7a 65 20 62 79 74 65 73 2e 0a  is iSize bytes..
ce20: 2a 2a 0a 2a 2a 20 41 64 6a 61 63 65 6e 74 20 66  **.** Adjacent f
ce30: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 63 6f  reeblocks are co
ce40: 61 6c 65 73 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e  alesced..**.** N
ce50: 6f 74 65 20 74 68 61 74 20 65 76 65 6e 20 74 68  ote that even th
ce60: 6f 75 67 68 20 74 68 65 20 66 72 65 65 62 6c 6f  ough the freeblo
ce70: 63 6b 20 6c 69 73 74 20 77 61 73 20 63 68 65 63  ck list was chec
ce80: 6b 65 64 20 62 79 20 62 74 72 65 65 49 6e 69 74  ked by btreeInit
ce90: 50 61 67 65 28 29 2c 0a 2a 2a 20 74 68 61 74 20  Page(),.** that 
cea0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6e 6f 74  routine will not
ceb0: 20 64 65 74 65 63 74 20 6f 76 65 72 6c 61 70 20   detect overlap 
cec0: 62 65 74 77 65 65 6e 20 63 65 6c 6c 73 20 6f 72  between cells or
ced0: 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 20 4e 6f   freeblocks.  No
cee0: 72 0a 2a 2a 20 64 6f 65 73 20 69 74 20 64 65 74  r.** does it det
cef0: 65 63 74 20 63 65 6c 6c 73 20 6f 72 20 66 72 65  ect cells or fre
cf00: 65 62 6c 6f 63 6b 73 20 74 68 61 74 20 65 6e 63  eblocks that enc
cf10: 72 6f 75 63 68 20 69 6e 74 6f 20 74 68 65 20 72  rouch into the r
cf20: 65 73 65 72 76 65 64 20 62 79 74 65 73 0a 2a 2a  eserved bytes.**
cf30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
cf40: 68 65 20 70 61 67 65 2e 20 20 53 6f 20 64 6f 20  he page.  So do 
cf50: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 72 72 75  additional corru
cf60: 70 74 69 6f 6e 20 63 68 65 63 6b 73 20 69 6e 73  ption checks ins
cf70: 69 64 65 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  ide this.** rout
cf80: 69 6e 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ine and return S
cf90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
cfa0: 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 20 61 72   any problems ar
cfb0: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
cfc0: 69 63 20 69 6e 74 20 66 72 65 65 53 70 61 63 65  ic int freeSpace
cfd0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
cfe0: 20 75 31 36 20 69 53 74 61 72 74 2c 20 75 31 36   u16 iStart, u16
cff0: 20 69 53 69 7a 65 29 7b 0a 20 20 75 31 36 20 69   iSize){.  u16 i
d000: 50 74 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ptr;            
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 70   /* Address of p
d030: 74 72 20 74 6f 20 6e 65 78 74 20 66 72 65 65 62  tr to next freeb
d040: 6c 6f 63 6b 20 2a 2f 0a 20 20 75 31 36 20 69 46  lock */.  u16 iF
d050: 72 65 65 42 6c 6b 3b 20 20 20 20 20 20 20 20 20  reeBlk;         
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
d080: 65 20 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b  e next freeblock
d090: 20 2a 2f 0a 20 20 75 38 20 68 64 72 3b 20 20 20   */.  u8 hdr;   
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d0c0: 61 67 65 20 68 65 61 64 65 72 20 73 69 7a 65 2e  age header size.
d0d0: 20 20 30 20 6f 72 20 31 30 30 20 2a 2f 0a 20 20    0 or 100 */.  
d0e0: 75 38 20 6e 46 72 61 67 20 3d 20 30 3b 20 20 20  u8 nFrag = 0;   
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 2f 2a 20 52 65 64 75 63 74 69        /* Reducti
d110: 6f 6e 20 69 6e 20 66 72 61 67 6d 65 6e 74 61 74  on in fragmentat
d120: 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 69 4f 72  ion */.  u16 iOr
d130: 69 67 53 69 7a 65 20 3d 20 69 53 69 7a 65 3b 20  igSize = iSize; 
d140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d150: 2a 20 4f 72 69 67 69 6e 61 6c 20 76 61 6c 75 65  * Original value
d160: 20 6f 66 20 69 53 69 7a 65 20 2a 2f 0a 20 20 75   of iSize */.  u
d170: 33 32 20 69 4c 61 73 74 20 3d 20 70 50 61 67 65  32 iLast = pPage
d180: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d190: 65 2d 34 3b 20 2f 2a 20 4c 61 72 67 65 73 74 20  e-4; /* Largest 
d1a0: 70 6f 73 73 69 62 6c 65 20 66 72 65 65 62 6c 6f  possible freeblo
d1b0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 20 20 75  ck offset */.  u
d1c0: 33 32 20 69 45 6e 64 20 3d 20 69 53 74 61 72 74  32 iEnd = iStart
d1d0: 20 2b 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   + iSize;       
d1e0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
d1f0: 74 65 20 70 61 73 74 20 74 68 65 20 69 53 74 61  te past the iSta
d200: 72 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 75  rt buffer */.  u
d210: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
d220: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
d230: 61 3b 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e  a;   /* Page con
d240: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
d250: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
d260: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d270: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
d280: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
d290: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
d2a0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
d2b0: 20 69 53 74 61 72 74 3e 3d 70 50 61 67 65 2d 3e   iStart>=pPage->
d2c0: 68 64 72 4f 66 66 73 65 74 2b 36 2b 70 50 61 67  hdrOffset+6+pPag
d2d0: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
d2e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d2f0: 52 55 50 54 5f 44 42 20 7c 7c 20 69 45 6e 64 20  RUPT_DB || iEnd 
d300: 3c 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  <= pPage->pBt->u
d310: 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 61  sableSize );.  a
d320: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
d330: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
d340: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
d350: 20 20 61 73 73 65 72 74 28 20 69 53 69 7a 65 3e    assert( iSize>
d360: 3d 34 20 29 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d  =4 );   /* Minim
d370: 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20  um cell size is 
d380: 34 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  4 */.  assert( i
d390: 53 74 61 72 74 3c 3d 69 4c 61 73 74 20 29 3b 0a  Start<=iLast );.
d3a0: 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65 20  .  /* Overwrite 
d3b0: 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74  deleted informat
d3c0: 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 20 77  ion with zeros w
d3d0: 68 65 6e 20 74 68 65 20 73 65 63 75 72 65 5f 64  hen the secure_d
d3e0: 65 6c 65 74 65 0a 20 20 2a 2a 20 6f 70 74 69 6f  elete.  ** optio
d3f0: 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
d400: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74    if( pPage->pBt
d410: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
d420: 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29  _SECURE_DELETE )
d430: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61  {.    memset(&da
d440: 74 61 5b 69 53 74 61 72 74 5d 2c 20 30 2c 20 69  ta[iStart], 0, i
d450: 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
d460: 20 54 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65   The list of fre
d470: 65 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20  eblocks must be 
d480: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
d490: 65 72 2e 20 20 46 69 6e 64 20 74 68 65 20 0a 20  er.  Find the . 
d4a0: 20 2a 2a 20 73 70 6f 74 20 6f 6e 20 74 68 65 20   ** spot on the 
d4b0: 6c 69 73 74 20 77 68 65 72 65 20 69 53 74 61 72  list where iStar
d4c0: 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65  t should be inse
d4d0: 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  rted..  */.  hdr
d4e0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
d4f0: 73 65 74 3b 0a 20 20 69 50 74 72 20 3d 20 68 64  set;.  iPtr = hd
d500: 72 20 2b 20 31 3b 0a 20 20 69 66 28 20 64 61 74  r + 1;.  if( dat
d510: 61 5b 69 50 74 72 2b 31 5d 3d 3d 30 20 26 26 20  a[iPtr+1]==0 && 
d520: 64 61 74 61 5b 69 50 74 72 5d 3d 3d 30 20 29 7b  data[iPtr]==0 ){
d530: 0a 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20  .    iFreeBlk = 
d540: 30 3b 20 20 2f 2a 20 53 68 6f 72 74 63 75 74 20  0;  /* Shortcut 
d550: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
d560: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
d570: 73 20 65 6d 70 74 79 20 2a 2f 0a 20 20 7d 65 6c  s empty */.  }el
d580: 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  se{.    while( (
d590: 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74 32 62  iFreeBlk = get2b
d5a0: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 29  yte(&data[iPtr])
d5b0: 29 3e 30 20 26 26 20 69 46 72 65 65 42 6c 6b 3c  )>0 && iFreeBlk<
d5c0: 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  iStart ){.      
d5d0: 69 66 28 20 69 46 72 65 65 42 6c 6b 3c 69 50 74  if( iFreeBlk<iPt
d5e0: 72 2b 34 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r+4 ) return SQL
d5f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
d600: 3b 0a 20 20 20 20 20 20 69 50 74 72 20 3d 20 69  ;.      iPtr = i
d610: 46 72 65 65 42 6c 6b 3b 0a 20 20 20 20 7d 0a 20  FreeBlk;.    }. 
d620: 20 20 20 69 66 28 20 69 46 72 65 65 42 6c 6b 3e     if( iFreeBlk>
d630: 69 4c 61 73 74 20 29 20 72 65 74 75 72 6e 20 53  iLast ) return S
d640: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d650: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
d660: 69 46 72 65 65 42 6c 6b 3e 69 50 74 72 20 7c 7c  iFreeBlk>iPtr ||
d670: 20 69 46 72 65 65 42 6c 6b 3d 3d 30 20 29 3b 0a   iFreeBlk==0 );.
d680: 20 20 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69    .    /* At thi
d690: 73 20 70 6f 69 6e 74 3a 0a 20 20 20 20 2a 2a 20  s point:.    ** 
d6a0: 20 20 20 69 46 72 65 65 42 6c 6b 3a 20 20 20 46     iFreeBlk:   F
d6b0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 61  irst freeblock a
d6c0: 66 74 65 72 20 69 53 74 61 72 74 2c 20 6f 72 20  fter iStart, or 
d6d0: 7a 65 72 6f 20 69 66 20 6e 6f 6e 65 0a 20 20 20  zero if none.   
d6e0: 20 2a 2a 20 20 20 20 69 50 74 72 3a 20 20 20 20   **    iPtr:    
d6f0: 20 20 20 54 68 65 20 61 64 64 72 65 73 73 20 6f     The address o
d700: 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  f a pointer to i
d710: 46 72 65 65 42 6c 6b 0a 20 20 20 20 2a 2a 0a 20  FreeBlk.    **. 
d720: 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
d730: 65 65 20 69 66 20 69 46 72 65 65 42 6c 6b 20 73  ee if iFreeBlk s
d740: 68 6f 75 6c 64 20 62 65 20 63 6f 61 6c 65 73 63  hould be coalesc
d750: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
d760: 6f 66 20 69 53 74 61 72 74 2e 0a 20 20 20 20 2a  of iStart..    *
d770: 2f 0a 20 20 20 20 69 66 28 20 69 46 72 65 65 42  /.    if( iFreeB
d780: 6c 6b 20 26 26 20 69 45 6e 64 2b 33 3e 3d 69 46  lk && iEnd+3>=iF
d790: 72 65 65 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  reeBlk ){.      
d7a0: 6e 46 72 61 67 20 3d 20 69 46 72 65 65 42 6c 6b  nFrag = iFreeBlk
d7b0: 20 2d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69   - iEnd;.      i
d7c0: 66 28 20 69 45 6e 64 3e 69 46 72 65 65 42 6c 6b  f( iEnd>iFreeBlk
d7d0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d7e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
d7f0: 20 20 20 20 20 69 45 6e 64 20 3d 20 69 46 72 65       iEnd = iFre
d800: 65 42 6c 6b 20 2b 20 67 65 74 32 62 79 74 65 28  eBlk + get2byte(
d810: 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 2b 32  &data[iFreeBlk+2
d820: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45  ]);.      if( iE
d830: 6e 64 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  nd > pPage->pBt-
d840: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 20 72 65  >usableSize ) re
d850: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d860: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
d870: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
d880: 53 74 61 72 74 3b 0a 20 20 20 20 20 20 69 46 72  Start;.      iFr
d890: 65 65 42 6c 6b 20 3d 20 67 65 74 32 62 79 74 65  eeBlk = get2byte
d8a0: 28 26 64 61 74 61 5b 69 46 72 65 65 42 6c 6b 5d  (&data[iFreeBlk]
d8b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
d8c0: 2f 2a 20 49 66 20 69 50 74 72 20 69 73 20 61 6e  /* If iPtr is an
d8d0: 6f 74 68 65 72 20 66 72 65 65 62 6c 6f 63 6b 20  other freeblock 
d8e0: 28 74 68 61 74 20 69 73 2c 20 69 66 20 69 50 74  (that is, if iPt
d8f0: 72 20 69 73 20 6e 6f 74 20 74 68 65 20 66 72 65  r is not the fre
d900: 65 6c 69 73 74 0a 20 20 20 20 2a 2a 20 70 6f 69  elist.    ** poi
d910: 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67 65  nter in the page
d920: 20 68 65 61 64 65 72 29 20 74 68 65 6e 20 63 68   header) then ch
d930: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 53  eck to see if iS
d940: 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65 0a 20  tart should be. 
d950: 20 20 20 2a 2a 20 63 6f 61 6c 65 73 63 65 64 20     ** coalesced 
d960: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
d970: 69 50 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  iPtr..    */.   
d980: 20 69 66 28 20 69 50 74 72 3e 68 64 72 2b 31 20   if( iPtr>hdr+1 
d990: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 50 74  ){.      int iPt
d9a0: 72 45 6e 64 20 3d 20 69 50 74 72 20 2b 20 67 65  rEnd = iPtr + ge
d9b0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
d9c0: 72 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  r+2]);.      if(
d9d0: 20 69 50 74 72 45 6e 64 2b 33 3e 3d 69 53 74 61   iPtrEnd+3>=iSta
d9e0: 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rt ){.        if
d9f0: 28 20 69 50 74 72 45 6e 64 3e 69 53 74 61 72 74  ( iPtrEnd>iStart
da00: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
da10: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
da20: 20 20 20 20 20 20 20 6e 46 72 61 67 20 2b 3d 20         nFrag += 
da30: 69 53 74 61 72 74 20 2d 20 69 50 74 72 45 6e 64  iStart - iPtrEnd
da40: 3b 0a 20 20 20 20 20 20 20 20 69 53 69 7a 65 20  ;.        iSize 
da50: 3d 20 69 45 6e 64 20 2d 20 69 50 74 72 3b 0a 20  = iEnd - iPtr;. 
da60: 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
da70: 69 50 74 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iPtr;.      }.  
da80: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 46 72 61    }.    if( nFra
da90: 67 3e 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 20  g>data[hdr+7] ) 
daa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
dab0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
dac0: 64 61 74 61 5b 68 64 72 2b 37 5d 20 2d 3d 20 6e  data[hdr+7] -= n
dad0: 46 72 61 67 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Frag;.  }.  if( 
dae0: 69 53 74 61 72 74 3d 3d 67 65 74 32 62 79 74 65  iStart==get2byte
daf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29  (&data[hdr+5]) )
db00: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77  {.    /* The new
db10: 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 61 74   freeblock is at
db20: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
db30: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
db40: 6e 74 20 61 72 65 61 2c 0a 20 20 20 20 2a 2a 20  nt area,.    ** 
db50: 73 6f 20 6a 75 73 74 20 65 78 74 65 6e 64 20 74  so just extend t
db60: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
db70: 61 72 65 61 20 72 61 74 68 65 72 20 74 68 61 6e  area rather than
db80: 20 63 72 65 61 74 65 20 61 6e 6f 74 68 65 72 0a   create another.
db90: 20 20 20 20 2a 2a 20 66 72 65 65 6c 69 73 74 20      ** freelist 
dba0: 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  entry */.    if(
dbb0: 20 69 50 74 72 21 3d 68 64 72 2b 31 20 29 20 72   iPtr!=hdr+1 ) r
dbc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dbd0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70  RUPT_BKPT;.    p
dbe0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dbf0: 72 2b 31 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  r+1], iFreeBlk);
dc00: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
dc10: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 69 45 6e 64  ata[hdr+5], iEnd
dc20: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dc30: 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
dc40: 77 20 66 72 65 65 62 6c 6f 63 6b 20 69 6e 74 6f  w freeblock into
dc50: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
dc60: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
dc70: 61 74 61 5b 69 50 74 72 5d 2c 20 69 53 74 61 72  ata[iPtr], iStar
dc80: 74 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  t);.    put2byte
dc90: 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c 20  (&data[iStart], 
dca0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
dcb0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53  ut2byte(&data[iS
dcc0: 74 61 72 74 2b 32 5d 2c 20 69 53 69 7a 65 29 3b  tart+2], iSize);
dcd0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 46  .  }.  pPage->nF
dce0: 72 65 65 20 2b 3d 20 69 4f 72 69 67 53 69 7a 65  ree += iOrigSize
dcf0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dd00: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
dd10: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
dd20: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
dd30: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
dd40: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
dd50: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
dd60: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
dd70: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
dd80: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
dd90: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
dda0: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
ddb0: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
ddc0: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
ddd0: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
dde0: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
ddf0: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
de00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
de10: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
de20: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
de30: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
de40: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
de50: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
de60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
de70: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
de80: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
de90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
dea0: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
deb0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
dec0: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
ded0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
dee0: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
def0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
df00: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
df10: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
df20: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
df30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
df40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
df50: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
df60: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
df70: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
df80: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
df90: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
dfa0: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
dfb0: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
dfc0: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
dfd0: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
dfe0: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 50 61 67  ge->leaf;.  pPag
dff0: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20 63  e->xCellSize = c
e000: 65 6c 6c 53 69 7a 65 50 74 72 3b 0a 20 20 70 42  ellSizePtr;.  pB
e010: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
e020: 20 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d    if( flagByte==
e030: 28 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20  (PTF_LEAFDATA | 
e040: 50 54 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20  PTF_INTKEY) ){. 
e050: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e060: 46 3a 20 52 2d 30 33 36 34 30 2d 31 33 34 31 35  F: R-03640-13415
e070: 20 41 20 76 61 6c 75 65 20 6f 66 20 35 20 6d 65   A value of 5 me
e080: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e090: 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20 20  an interior.    
e0a0: 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  ** table b-tree 
e0b0: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e0c0: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e0d0: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e0e0: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e0f0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 30 35 30 31  ENCE-OF: R-20501
e100: 2d 36 31 37 39 36 20 41 20 76 61 6c 75 65 20 6f  -61796 A value o
e110: 66 20 31 33 20 6d 65 61 6e 73 20 74 68 65 20 70  f 13 means the p
e120: 61 67 65 20 69 73 20 61 20 6c 65 61 66 0a 20 20  age is a leaf.  
e130: 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d 74 72 65    ** table b-tre
e140: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  e page. */.    a
e150: 73 73 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46  ssert( (PTF_LEAF
e160: 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 7c  DATA|PTF_INTKEY|
e170: 50 54 46 5f 4c 45 41 46 29 3d 3d 31 33 20 29 3b  PTF_LEAF)==13 );
e180: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b  .    pPage->intK
e190: 65 79 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  ey = 1;.    if( 
e1a0: 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
e1b0: 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
e1c0: 65 79 4c 65 61 66 20 3d 20 31 3b 0a 20 20 20 20  eyLeaf = 1;.    
e1d0: 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c 6f    pPage->noPaylo
e1e0: 61 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ad = 0;.      pP
e1f0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e200: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e210: 50 74 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Ptr;.    }else{.
e220: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74        pPage->int
e230: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e240: 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79 6c     pPage->noPayl
e250: 6f 61 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  oad = 1;.      p
e260: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20  Page->xCellSize 
e270: 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  = cellSizePtrNoP
e280: 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50  ayload;.      pP
e290: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e2a0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e2b0: 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20  PtrNoPayload;.  
e2c0: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d    }.    pPage->m
e2d0: 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  axLocal = pBt->m
e2e0: 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67  axLeaf;.    pPag
e2f0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
e300: 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65  t->minLeaf;.  }e
e310: 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65  lse if( flagByte
e320: 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29  ==PTF_ZERODATA )
e330: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e340: 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33  E-OF: R-27225-53
e350: 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32  936 A value of 2
e360: 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65 20   means the page 
e370: 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20  is an interior. 
e380: 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72     ** index b-tr
e390: 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ee page. */.    
e3a0: 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52  assert( (PTF_ZER
e3b0: 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20  ODATA)==2 );.   
e3c0: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e3d0: 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41   R-16571-11615 A
e3e0: 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61   value of 10 mea
e3f0: 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61  ns the page is a
e400: 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64   leaf.    ** ind
e410: 65 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ex b-tree page. 
e420: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e430: 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46  PTF_ZERODATA|PTF
e440: 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20  _LEAF)==10 );.  
e450: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
e460: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e470: 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a  intKeyLeaf = 0;.
e480: 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79      pPage->noPay
e490: 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  load = 0;.    pP
e4a0: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20  age->xParseCell 
e4b0: 3d 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  = btreeParseCell
e4c0: 50 74 72 49 6e 64 65 78 3b 0a 20 20 20 20 70 50  PtrIndex;.    pP
e4d0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
e4e0: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
e4f0: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
e500: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
e510: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
e520: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
e530: 20 52 2d 34 37 36 30 38 2d 35 36 34 36 39 20 41   R-47608-56469 A
e540: 6e 79 20 6f 74 68 65 72 20 76 61 6c 75 65 20 66  ny other value f
e550: 6f 72 20 74 68 65 20 62 2d 74 72 65 65 20 70 61  or the b-tree pa
e560: 67 65 20 74 79 70 65 20 69 73 0a 20 20 20 20 2a  ge type is.    *
e570: 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a 2f 0a 20  * an error. */. 
e580: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e590: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
e5a0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d 61 78 31   }.  pPage->max1
e5b0: 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 70 42  bytePayload = pB
e5c0: 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
e5d0: 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ad;.  return SQL
e5e0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
e5f0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e600: 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d  auxiliary inform
e610: 61 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b  ation for a disk
e620: 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   block..**.** Re
e630: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
e640: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 77  n success.  If w
e650: 65 20 73 65 65 20 74 68 61 74 20 74 68 65 20 70  e see that the p
e660: 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  age does.** not 
e670: 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66  contain a well-f
e680: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 70  ormed database p
e690: 61 67 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  age, then return
e6a0: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
e6b0: 55 50 54 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  UPT.  Note that 
e6c0: 61 20 72 65 74 75 72 6e 20 6f 66 20 53 51 4c 49  a return of SQLI
e6d0: 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a  TE_OK does not.*
e6e0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
e6f0: 20 74 68 65 20 70 61 67 65 20 69 73 20 77 65 6c   the page is wel
e700: 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e  l-formed.  It on
e710: 6c 79 20 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a  ly shows that.**
e720: 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 64 65   we failed to de
e730: 74 65 63 74 20 61 6e 79 20 63 6f 72 72 75 70 74  tect any corrupt
e740: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
e750: 6e 74 20 62 74 72 65 65 49 6e 69 74 50 61 67 65  nt btreeInitPage
e760: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
e770: 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  {..  assert( pPa
e780: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
e790: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
e7a0: 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 61  Bt->db!=0 );.  a
e7b0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
e7c0: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
e7d0: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
e7e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e7f0: 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61  >pgno==sqlite3Pa
e800: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
e810: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e820: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e830: 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   == sqlite3Pager
e840: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
e850: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
e860: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
e870: 74 61 20 3d 3d 20 73 71 6c 69 74 65 33 50 61 67  ta == sqlite3Pag
e880: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
e890: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
e8a0: 69 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e  if( !pPage->isIn
e8b0: 69 74 20 29 7b 0a 20 20 20 20 75 31 36 20 70 63  it ){.    u16 pc
e8c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e8d0: 41 64 64 72 65 73 73 20 6f 66 20 61 20 66 72 65  Address of a fre
e8e0: 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50  eblock within pP
e8f0: 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a  age->aData[] */.
e900: 20 20 20 20 75 38 20 68 64 72 3b 20 20 20 20 20      u8 hdr;     
e910: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
e920: 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66   to beginning of
e930: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
e940: 20 20 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20      u8 *data;   
e950: 20 20 20 20 20 20 20 2f 2a 20 45 71 75 61 6c 20         /* Equal 
e960: 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  to pPage->aData 
e970: 2a 2f 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  */.    BtShared 
e980: 2a 70 42 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  *pBt;        /* 
e990: 54 68 65 20 6d 61 69 6e 20 62 74 72 65 65 20 73  The main btree s
e9a0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
e9b0: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
e9c0: 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20 6f 66 20     /* Amount of 
e9d0: 75 73 61 62 6c 65 20 73 70 61 63 65 20 6f 6e 20  usable space on 
e9e0: 65 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 20  each page */.   
e9f0: 20 75 31 36 20 63 65 6c 6c 4f 66 66 73 65 74 3b   u16 cellOffset;
ea00: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 66 72      /* Offset fr
ea10: 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61 67 65  om start of page
ea20: 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c 20 70   to first cell p
ea30: 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ointer */.    in
ea40: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
ea50: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
ea60: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
ea70: 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  e page */.    in
ea80: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
ea90: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
eaa0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
eab0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 20 20 69  nt area */.    i
eac0: 6e 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20  nt iCellFirst;  
ead0: 20 20 2f 2a 20 46 69 72 73 74 20 61 6c 6c 6f 77    /* First allow
eae0: 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20 66 72 65  able cell or fre
eaf0: 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a 2f  eblock offset */
eb00: 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 4c 61  .    int iCellLa
eb10: 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61 73 74 20  st;     /* Last 
eb20: 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 6f 72  possible cell or
eb30: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
eb40: 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20  t */..    pBt = 
eb50: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20  pPage->pBt;..   
eb60: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
eb70: 72 4f 66 66 73 65 74 3b 0a 20 20 20 20 64 61 74  rOffset;.    dat
eb80: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
eb90: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
eba0: 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34 2d 30 32  E-OF: R-28594-02
ebb0: 38 39 30 20 54 68 65 20 6f 6e 65 2d 62 79 74 65  890 The one-byte
ebc0: 20 66 6c 61 67 20 61 74 20 6f 66 66 73 65 74 20   flag at offset 
ebd0: 30 20 69 6e 64 69 63 61 74 69 6e 67 0a 20 20 20  0 indicating.   
ebe0: 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 70   ** the b-tree p
ebf0: 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20  age type. */.   
ec00: 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67 73   if( decodeFlags
ec10: 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64 72  (pPage, data[hdr
ec20: 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ]) ) return SQLI
ec30: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
ec40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
ec50: 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
ec60: 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
ec70: 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 20 20 70  <=65536 );.    p
ec80: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
ec90: 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
eca0: 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 20 20 70  Size - 1);.    p
ecb0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
ecc0: 3d 20 30 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  = 0;.    usableS
ecd0: 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
ece0: 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
ecf0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
ed00: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
ed10: 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  + 8 + pPage->chi
ed20: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 70  ldPtrSize;.    p
ed30: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
ed40: 20 26 64 61 74 61 5b 75 73 61 62 6c 65 53 69 7a   &data[usableSiz
ed50: 65 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  e];.    pPage->a
ed60: 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b  CellIdx = &data[
ed70: 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a 20 20 20  cellOffset];.   
ed80: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
ed90: 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
eda0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
edb0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
edc0: 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34 38 31 37  OF: R-58015-4817
edd0: 35 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69  5 The two-byte i
ede0: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
edf0: 20 35 20 64 65 73 69 67 6e 61 74 65 73 0a 20 20   5 designates.  
ee00: 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74 20 6f    ** the start o
ee10: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
ee20: 6e 74 20 61 72 65 61 2e 20 41 20 7a 65 72 6f 20  nt area. A zero 
ee30: 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 69  value for this i
ee40: 6e 74 65 67 65 72 20 69 73 0a 20 20 20 20 2a 2a  nteger is.    **
ee50: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
ee60: 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20 20 74 6f  65536. */.    to
ee70: 70 20 3d 20 67 65 74 32 62 79 74 65 4e 6f 74 5a  p = get2byteNotZ
ee80: 65 72 6f 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  ero(&data[hdr+5]
ee90: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
eea0: 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30 32 2d 33  CE-OF: R-37002-3
eeb0: 32 37 37 34 20 54 68 65 20 74 77 6f 2d 62 79 74  2774 The two-byt
eec0: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
eed0: 73 65 74 20 33 20 67 69 76 65 73 20 74 68 65 0a  set 3 gives the.
eee0: 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66      ** number of
eef0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
ef00: 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65  ge. */.    pPage
ef10: 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79  ->nCell = get2by
ef20: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
ef30: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
ef40: 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70  >nCell>MX_CELL(p
ef50: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
ef60: 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73 20 66 6f  To many cells fo
ef70: 72 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 2e  r a single page.
ef80: 20 20 54 68 65 20 70 61 67 65 20 6d 75 73 74 20    The page must 
ef90: 62 65 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20  be corrupt */.  
efa0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
efb0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
efc0: 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61      }.    testca
efd0: 73 65 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  se( pPage->nCell
efe0: 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  ==MX_CELL(pBt) )
eff0: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
f000: 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39 2d 35 37  E-OF: R-24089-57
f010: 39 37 39 20 49 66 20 61 20 70 61 67 65 20 63 6f  979 If a page co
f020: 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20  ntains no cells 
f030: 28 77 68 69 63 68 20 69 73 20 6f 6e 6c 79 0a 20  (which is only. 
f040: 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65 20 66     ** possible f
f050: 6f 72 20 61 20 72 6f 6f 74 20 70 61 67 65 20 6f  or a root page o
f060: 66 20 61 20 74 61 62 6c 65 20 74 68 61 74 20 63  f a table that c
f070: 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 73 29  ontains no rows)
f080: 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a   then the.    **
f090: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   offset to the c
f0a0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
f0b0: 20 77 69 6c 6c 20 65 71 75 61 6c 20 74 68 65 20   will equal the 
f0c0: 70 61 67 65 20 73 69 7a 65 20 6d 69 6e 75 73 20  page size minus 
f0d0: 74 68 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 73  the.    ** bytes
f0e0: 20 6f 66 20 72 65 73 65 72 76 65 64 20 73 70 61   of reserved spa
f0f0: 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ce. */.    asser
f100: 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
f110: 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61 62 6c 65  0 || top==usable
f120: 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Size || CORRUPT_
f130: 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 20  DB );..    /* A 
f140: 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74 61 62 61  malformed databa
f150: 73 65 20 70 61 67 65 20 6d 69 67 68 74 20 63 61  se page might ca
f160: 75 73 65 20 75 73 20 74 6f 20 72 65 61 64 20 70  use us to read p
f170: 61 73 74 20 74 68 65 20 65 6e 64 0a 20 20 20 20  ast the end.    
f180: 2a 2a 20 6f 66 20 70 61 67 65 20 77 68 65 6e 20  ** of page when 
f190: 70 61 72 73 69 6e 67 20 61 20 63 65 6c 6c 2e 20  parsing a cell. 
f1a0: 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
f1b0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
f1c0: 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63 68 65 63  ock of code chec
f1d0: 6b 73 20 65 61 72 6c 79 20 74 6f 20 73 65 65 20  ks early to see 
f1e0: 69 66 20 61 20 63 65 6c 6c 20 65 78 74 65 6e 64  if a cell extend
f1f0: 73 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  s.    ** past th
f200: 65 20 65 6e 64 20 6f 66 20 61 20 70 61 67 65 20  e end of a page 
f210: 62 6f 75 6e 64 61 72 79 20 61 6e 64 20 63 61 75  boundary and cau
f220: 73 65 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  ses SQLITE_CORRU
f230: 50 54 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  PT to be .    **
f240: 20 72 65 74 75 72 6e 65 64 20 69 66 20 69 74 20   returned if it 
f250: 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  does..    */.   
f260: 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63 65   iCellFirst = ce
f270: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
f280: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 69  ge->nCell;.    i
f290: 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73 61 62 6c  CellLast = usabl
f2a0: 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 69  eSize - 4;.    i
f2b0: 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67  f( pBt->db->flag
f2c0: 73 20 26 20 53 51 4c 49 54 45 5f 43 65 6c 6c 53  s & SQLITE_CellS
f2d0: 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20 20 20 69  izeCk ){.      i
f2e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
f2f0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74   /* Index into t
f300: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
f310: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 69  array */.      i
f320: 6e 74 20 73 7a 3b 20 20 20 20 20 20 20 20 20 20  nt sz;          
f330: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 20 63 65   /* Size of a ce
f340: 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  ll */..      if(
f350: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20   !pPage->leaf ) 
f360: 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a 20 20 20  iCellLast--;.   
f370: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50     for(i=0; i<pP
f380: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29  age->nCell; i++)
f390: 7b 0a 20 20 20 20 20 20 20 20 70 63 20 3d 20 67  {.        pc = g
f3a0: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
f3b0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 2b  data[cellOffset+
f3c0: 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 74  i*2]);.        t
f3d0: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
f3e0: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 20  llFirst );.     
f3f0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
f400: 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20  =iCellLast );.  
f410: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f420: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f430: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f440: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f450: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f460: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f470: 20 20 20 73 7a 20 3d 20 70 50 61 67 65 2d 3e 78     sz = pPage->x
f480: 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20  CellSize(pPage, 
f490: 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20  &data[pc]);.    
f4a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
f4b0: 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20  +sz==usableSize 
f4c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f4d0: 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69 7a 65 20  c+sz>usableSize 
f4e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f4f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f500: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f510: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f520: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f530: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2b 2b 3b  f ) iCellLast++;
f540: 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20 20 2f 2a  .    }  ..    /*
f550: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74   Compute the tot
f560: 61 6c 20 66 72 65 65 20 73 70 61 63 65 20 6f 6e  al free space on
f570: 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
f580: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f590: 32 33 35 38 38 2d 33 34 34 35 30 20 54 68 65 20  23588-34450 The 
f5a0: 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72  two-byte integer
f5b0: 20 61 74 20 6f 66 66 73 65 74 20 31 20 67 69 76   at offset 1 giv
f5c0: 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74  es the.    ** st
f5d0: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
f5e0: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e 20 74 68   freeblock on th
f5f0: 65 20 70 61 67 65 2c 20 6f 72 20 69 73 20 7a 65  e page, or is ze
f600: 72 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20  ro if there are 
f610: 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65 65 62 6c  no.    ** freebl
f620: 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20 70 63 20  ocks. */.    pc 
f630: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
f640: 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46  [hdr+1]);.    nF
f650: 72 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  ree = data[hdr+7
f660: 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20 49 6e 69  ] + top;  /* Ini
f670: 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f 6e 2d 66  t nFree to non-f
f680: 72 65 65 62 6c 6f 63 6b 20 66 72 65 65 20 73 70  reeblock free sp
f690: 61 63 65 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  ace */.    while
f6a0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f6b0: 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u16 next, size;.
f6c0: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f6d0: 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63 3e 69 43  llFirst || pc>iC
f6e0: 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20 20 20 20  ellLast ){.     
f6f0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f700: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f710: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f720: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f730: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f740: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f750: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f760: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f770: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f780: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
f790: 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72 65 65 62  ** Or, the freeb
f7a0: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
f7b0: 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67 65 0a  end of the page.
f7c0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f7d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f7e0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
f7f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 65        }.      ne
f800: 78 74 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  xt = get2byte(&d
f810: 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
f820: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
f830: 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20  &data[pc+2]);.  
f840: 20 20 20 20 69 66 28 20 28 6e 65 78 74 3e 30 20      if( (next>0 
f850: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
f860: 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  +3) || pc+size>u
f870: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
f880: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
f890: 63 6b 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61  cks must be in a
f8a0: 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20  scending order. 
f8b0: 41 6e 64 20 74 68 65 20 6c 61 73 74 20 62 79 74  And the last byt
f8c0: 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  e of.        ** 
f8d0: 74 68 65 20 66 72 65 65 2d 62 6c 6f 63 6b 20 6d  the free-block m
f8e0: 75 73 74 20 6c 69 65 20 6f 6e 20 74 68 65 20 64  ust lie on the d
f8f0: 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20 2a  atabase page.  *
f900: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
f910: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f920: 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20  BKPT; .      }. 
f930: 20 20 20 20 20 6e 46 72 65 65 20 3d 20 6e 46 72       nFree = nFr
f940: 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20 20 20 20  ee + size;.     
f950: 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20   pc = next;.    
f960: 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69  }..    /* At thi
f970: 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65 65 20 63  s point, nFree c
f980: 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 75 6d 20  ontains the sum 
f990: 6f 66 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  of the offset to
f9a0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 20 20 2a   the start.    *
f9b0: 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f  * of the cell-co
f9c0: 6e 74 65 6e 74 20 61 72 65 61 20 70 6c 75 73 20  ntent area plus 
f9d0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
f9e0: 65 65 20 62 79 74 65 73 20 77 69 74 68 69 6e 0a  ee bytes within.
f9f0: 20 20 20 20 2a 2a 20 74 68 65 20 63 65 6c 6c 2d      ** the cell-
fa00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 49 66  content area. If
fa10: 20 74 68 69 73 20 69 73 20 67 72 65 61 74 65 72   this is greater
fa20: 20 74 68 61 6e 20 74 68 65 20 75 73 61 62 6c 65   than the usable
fa30: 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20 6f 66 20  -size.    ** of 
fa40: 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74  the page, then t
fa50: 68 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20  he page must be 
fa60: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
fa70: 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20 20 20 2a  check also.    *
fa80: 2a 20 73 65 72 76 65 73 20 74 6f 20 76 65 72 69  * serves to veri
fa90: 66 79 20 74 68 61 74 20 74 68 65 20 6f 66 66 73  fy that the offs
faa0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  et to the start 
fab0: 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63 6f 6e 74  of the cell-cont
fac0: 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72 65 61 2c  ent.    ** area,
fad0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
fae0: 65 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 6c  e page header, l
faf0: 69 65 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  ies within the p
fb00: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
fb10: 69 66 28 20 6e 46 72 65 65 3e 75 73 61 62 6c 65  if( nFree>usable
fb20: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
fb30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fb40: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
fb50: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
fb60: 65 20 3d 20 28 75 31 36 29 28 6e 46 72 65 65 20  e = (u16)(nFree 
fb70: 2d 20 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20  - iCellFirst);. 
fb80: 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
fb90: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
fba0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fbb0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 61 20  ./*.** Set up a 
fbc0: 72 61 77 20 70 61 67 65 20 73 6f 20 74 68 61 74  raw page so that
fbd0: 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61   it looks like a
fbe0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 68   database page h
fbf0: 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74  olding.** no ent
fc00: 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ries..*/.static 
fc10: 76 6f 69 64 20 7a 65 72 6f 50 61 67 65 28 4d 65  void zeroPage(Me
fc20: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
fc30: 74 20 66 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69  t flags){.  unsi
fc40: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20  gned char *data 
fc50: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
fc60: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
fc70: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
fc80: 75 38 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  u8 hdr = pPage->
fc90: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 31 36  hdrOffset;.  u16
fca0: 20 66 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72   first;..  asser
fcb0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
fcc0: 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d  agenumber(pPage-
fcd0: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
fce0: 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65  ->pgno );.  asse
fcf0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
fd00: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
fd10: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
fd20: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73  d*)pPage );.  as
fd30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
fd40: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
fd50: 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74  >pDbPage) == dat
fd60: 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
fd70: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
fd80: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
fd90: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
fda0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
fdb0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
fdc0: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  x) );.  if( pBt-
fdd0: 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
fde0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
fdf0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 61 74  .    memset(&dat
fe00: 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e  a[hdr], 0, pBt->
fe10: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 68 64 72  usableSize - hdr
fe20: 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61 5b 68 64  );.  }.  data[hd
fe30: 72 5d 20 3d 20 28 63 68 61 72 29 66 6c 61 67 73  r] = (char)flags
fe40: 3b 0a 20 20 66 69 72 73 74 20 3d 20 68 64 72 20  ;.  first = hdr 
fe50: 2b 20 28 28 66 6c 61 67 73 26 50 54 46 5f 4c 45  + ((flags&PTF_LE
fe60: 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a 20 38 29  AF)==0 ? 12 : 8)
fe70: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
fe80: 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29 3b 0a  [hdr+1], 0, 4);.
fe90: 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20    data[hdr+7] = 
fea0: 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  0;.  put2byte(&d
feb0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42 74 2d  ata[hdr+5], pBt-
fec0: 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
fed0: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28  pPage->nFree = (
fee0: 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
fef0: 53 69 7a 65 20 2d 20 66 69 72 73 74 29 3b 0a 20  Size - first);. 
ff00: 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61   decodeFlags(pPa
ff10: 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 50  ge, flags);.  pP
ff20: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ff30: 3d 20 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65  = first;.  pPage
ff40: 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20 26 64 61  ->aDataEnd = &da
ff50: 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
ff60: 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d 3e 61 43  ze];.  pPage->aC
ff70: 65 6c 6c 49 64 78 20 3d 20 26 64 61 74 61 5b 66  ellIdx = &data[f
ff80: 69 72 73 74 5d 3b 0a 20 20 70 50 61 67 65 2d 3e  irst];.  pPage->
ff90: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ffa0: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ffb0: 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  rSize];.  pPage-
ffc0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
ffd0: 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
ffe0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
fff0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 3d 36  pBt->pageSize<=6
10000 35 35 33 36 20 29 3b 0a 20 20 70 50 61 67 65 2d  5536 );.  pPage-
10010 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28 75 31 36  >maskPage = (u16
10020 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
10030 2d 20 31 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  - 1);.  pPage->n
10040 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
10050 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
10060 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
10070 20 61 20 44 62 50 61 67 65 20 6f 62 74 61 69 6e   a DbPage obtain
10080 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ed from the page
10090 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50 61 67 65  r into a MemPage
100a0 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20   used by.** the 
100b0 62 74 72 65 65 20 6c 61 79 65 72 2e 0a 2a 2f 0a  btree layer..*/.
100c0 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20 2a  static MemPage *
100d0 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50  btreePageFromDbP
100e0 61 67 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  age(DbPage *pDbP
100f0 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  age, Pgno pgno, 
10100 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
10110 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
10120 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 73 71 6c   = (MemPage*)sql
10130 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
10140 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50  a(pDbPage);.  pP
10150 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
10160 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10170 28 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61  (pDbPage);.  pPa
10180 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44  ge->pDbPage = pD
10190 62 50 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e  bPage;.  pPage->
101a0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61  pBt = pBt;.  pPa
101b0 67 65 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  ge->pgno = pgno;
101c0 0a 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  .  pPage->hdrOff
101d0 73 65 74 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20  set = pgno==1 ? 
101e0 31 30 30 20 3a 20 30 3b 0a 20 20 72 65 74 75 72  100 : 0;.  retur
101f0 6e 20 70 50 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a  n pPage; .}../*.
10200 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10210 6f 6d 20 74 68 65 20 70 61 67 65 72 2e 20 20 49  om the pager.  I
10220 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
10230 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
10240 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
10250 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10260 64 2e 20 20 53 65 65 20 61 6c 73 6f 3a 20 62 74  d.  See also: bt
10270 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
10280 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ()..**.** If the
10290 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
102a0 54 45 4e 54 20 66 6c 61 67 20 69 73 20 73 65 74  TENT flag is set
102b0 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
102c0 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 0a 2a  we do not care.*
102d0 2a 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  * about the cont
102e0 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
102f0 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
10300 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
10310 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
10320 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
10330 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
10340 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
10350 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
10360 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
10370 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
10380 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
10390 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
103a0 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
103b0 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
103c0 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
103d0 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
103e0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
103f0 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
10400 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61  at point..*/.sta
10410 74 69 63 20 69 6e 74 20 62 74 72 65 65 47 65 74  tic int btreeGet
10420 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
10430 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
10440 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
10450 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
10460 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10470 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
10480 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
10490 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
104a0 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
104b0 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
104c0 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
104d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
104e0 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
104f0 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f  NT or PAGER_GET_
10500 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20  READONLY */.){. 
10510 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61 67   int rc;.  DbPag
10520 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61  e *pDbPage;..  a
10530 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 30 20  ssert( flags==0 
10540 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f  || flags==PAGER_
10550 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 7c 7c  GET_NOCONTENT ||
10560 20 66 6c 61 67 73 3d 3d 50 41 47 45 52 5f 47 45   flags==PAGER_GE
10570 54 5f 52 45 41 44 4f 4e 4c 59 20 29 3b 0a 20 20  T_READONLY );.  
10580 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10590 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
105a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
105b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71   sqlite3PagerAcq
105c0 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67 65 72  uire(pBt->pPager
105d0 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
105e0 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
105f0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
10600 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
10610 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
10620 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
10630 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
10640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10650 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
10660 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
10670 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10680 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
10690 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
106a0 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
106b0 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
106c0 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
106d0 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
106e0 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
106f0 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
10700 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
10710 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
10720 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
10730 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
10740 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
10750 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
10760 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10770 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10780 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
10790 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
107a0 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
107b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
107c0 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
107d0 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
107e0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
107f0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10800 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10810 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
10820 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
10830 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10840 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
10850 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
10860 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
10870 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
10880 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
10890 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
108a0 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
108b0 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
108c0 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
108d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
108e0 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
108f0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10900 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10910 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
10920 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
10930 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
10940 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
10950 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
10960 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
10970 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10980 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
10990 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
109a0 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
109b0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
109c0 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
109d0 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
109e0 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
109f0 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
10a00 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
10a10 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
10a20 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
10a30 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
10a40 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10a50 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
10a60 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
10a70 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
10a80 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
10a90 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
10aa0 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
10ab0 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
10ac0 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
10ad0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10ae0 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
10af0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
10b00 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
10b10 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
10b20 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
10b30 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
10b40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
10b50 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
10b60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
10b90 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
10ba0 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
10bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10bc0 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
10bd0 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
10be0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c00 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
10c10 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
10c20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
10c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c40 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
10c50 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
10c60 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
10c70 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
10c80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10c90 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
10ca0 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
10cb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
10cc0 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
10cd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10ce0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10cf0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10d00 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
10d10 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
10d20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
10d30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10d40 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
10d50 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
10d60 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
10d70 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10d80 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
10d90 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
10da0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
10db0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10dc0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
10dd0 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
10de0 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
10df0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
10e00 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65 28  te3PagerAcquire(
10e10 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
10e20 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
10e30 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
10e40 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
10e50 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
10e60 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
10e70 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 62 74  }.  *ppPage = bt
10e80 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
10e90 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
10ea0 20 70 42 74 29 3b 0a 20 20 69 66 28 20 28 2a 70   pBt);.  if( (*p
10eb0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
10ec0 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  0 ){.    rc = bt
10ed0 72 65 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50  reeInitPage(*ppP
10ee0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
10ef0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10f00 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
10f10 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20  (*ppPage);.     
10f20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
10f30 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20  Page_error;.    
10f40 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  }.  }..  /* If o
10f50 62 74 61 69 6e 69 6e 67 20 61 20 63 68 69 6c 64  btaining a child
10f60 20 70 61 67 65 20 66 6f 72 20 61 20 63 75 72 73   page for a curs
10f70 6f 72 2c 20 77 65 20 6d 75 73 74 20 76 65 72 69  or, we must veri
10f80 66 79 20 74 68 61 74 20 74 68 65 20 70 61 67 65  fy that the page
10f90 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69   is.  ** compati
10fa0 62 6c 65 20 77 69 74 68 20 74 68 65 20 72 6f 6f  ble with the roo
10fb0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28  t page. */.  if(
10fc0 20 70 43 75 72 0a 20 20 20 26 26 20 28 28 2a 70   pCur.   && ((*p
10fd0 70 50 61 67 65 29 2d 3e 6e 43 65 6c 6c 3c 31 20  pPage)->nCell<1 
10fe0 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 6e  || (*ppPage)->in
10ff0 74 4b 65 79 21 3d 70 43 75 72 2d 3e 63 75 72 49  tKey!=pCur->curI
11000 6e 74 4b 65 79 29 0a 20 20 29 7b 0a 20 20 20 20  ntKey).  ){.    
11010 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
11020 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
11030 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
11040 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  e);.    goto get
11050 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
11060 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  r;.  }.  return 
11070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67 65 74 41  SQLITE_OK;..getA
11080 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
11090 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 20 70  :.  if( pCur ) p
110a0 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
110b0 74 65 73 74 63 61 73 65 28 20 70 67 6e 6f 3d 3d  testcase( pgno==
110c0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
110d0 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  gno!=0 || rc==SQ
110e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 3b 0a  LITE_CORRUPT );.
110f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11100 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
11110 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
11120 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
11130 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
11140 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 62  ior.** call to b
11150 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a 2f 0a  treeGetPage..*/.
11160 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
11170 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 4d  asePageNotNull(M
11180 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
11190 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
111a0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
111b0 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
111c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
111d0 65 2d 3e 70 44 62 50 61 67 65 21 3d 30 20 29 3b  e->pDbPage!=0 );
111e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
111f0 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11200 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
11210 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
11220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11230 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
11240 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
11250 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ==pPage->aData )
11260 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11270 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11280 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11290 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ) );.  sqlite3Pa
112a0 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75 6c 6c 28  gerUnrefNotNull(
112b0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
112c0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  .}.static void r
112d0 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61  eleasePage(MemPa
112e0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66  ge *pPage){.  if
112f0 28 20 70 50 61 67 65 20 29 20 72 65 6c 65 61 73  ( pPage ) releas
11300 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61  ePageNotNull(pPa
11310 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ge);.}../*.** Ge
11320 74 20 61 6e 20 75 6e 75 73 65 64 20 70 61 67 65  t an unused page
11330 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72  ..**.** This wor
11340 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20 62 74 72  ks just like btr
11350 65 65 47 65 74 50 61 67 65 28 29 20 77 69 74 68  eeGetPage() with
11360 20 74 68 65 20 61 64 64 69 74 69 6f 6e 3a 0a 2a   the addition:.*
11370 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20 74 68 65  *.**   *  If the
11380 20 70 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   page is already
11390 20 69 6e 20 75 73 65 20 66 6f 72 20 73 6f 6d 65   in use for some
113a0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2c 20   other purpose, 
113b0 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
113c0 20 20 20 20 72 65 6c 65 61 73 65 20 69 74 20 61      release it a
113d0 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  nd return an SQL
113e0 49 54 45 5f 43 55 52 52 55 50 54 20 65 72 72 6f  ITE_CURRUPT erro
113f0 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61 6b 65 20  r..**   *  Make 
11400 73 75 72 65 20 74 68 65 20 69 73 49 6e 69 74 20  sure the isInit 
11410 66 6c 61 67 20 69 73 20 63 6c 65 61 72 0a 2a 2f  flag is clear.*/
11420 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
11430 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 0a  eGetUnusedPage(.
11440 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
11450 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
11460 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
11470 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
11480 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
11490 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
114a0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
114b0 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
114c0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
114d0 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
114e0 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
114f0 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47        /* PAGER_G
11500 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20  ET_NOCONTENT or 
11510 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
11520 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  LY */.){.  int r
11530 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
11540 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50 61  (pBt, pgno, ppPa
11550 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 69 66  ge, flags);.  if
11560 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11570 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
11580 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
11590 75 6e 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  unt((*ppPage)->p
115a0 44 62 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20  DbPage)>1 ){.   
115b0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
115c0 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a  ppPage);.      *
115d0 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  ppPage = 0;.    
115e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
115f0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11600 20 20 7d 0a 20 20 20 20 28 2a 70 70 50 61 67 65    }.    (*ppPage
11610 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  )->isInit = 0;. 
11620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 50   }else{.    *ppP
11630 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  age = 0;.  }.  r
11640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
11650 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
11660 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
11670 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
11680 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
11690 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
116a0 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
116b0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
116c0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
116d0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
116e0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
116f0 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
11700 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
11710 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11720 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
11730 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
11740 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
11750 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
11760 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
11770 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
11780 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
11790 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
117a0 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
117b0 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
117c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
117d0 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
117e0 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
117f0 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
11800 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ta);.  assert( s
11810 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
11820 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 30  efcount(pData)>0
11830 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
11840 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 61  >isInit ){.    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 50 61 67 65 2d  utex_held(pPage-
11870 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
11880 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
11890 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73  t = 0;.    if( s
118a0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
118b0 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e 31  efcount(pData)>1
118c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70 50 61   ){.      /* pPa
118d0 67 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ge might not be 
118e0 61 20 62 74 72 65 65 20 70 61 67 65 3b 20 20 69  a btree page;  i
118f0 74 20 6d 69 67 68 74 20 62 65 20 61 6e 20 6f 76  t might be an ov
11900 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20  erflow page.    
11910 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61 70 20 70    ** or ptrmap p
11920 61 67 65 20 6f 72 20 61 20 66 72 65 65 20 70 61  age or a free pa
11930 67 65 2e 20 20 49 6e 20 74 68 6f 73 65 20 63 61  ge.  In those ca
11940 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ses, the followi
11950 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  ng.      ** call
11960 20 74 6f 20 62 74 72 65 65 49 6e 69 74 50 61 67   to btreeInitPag
11970 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  e() will likely 
11980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
11990 52 52 55 50 54 2e 0a 20 20 20 20 20 20 2a 2a 20  RRUPT..      ** 
119a0 42 75 74 20 6e 6f 20 68 61 72 6d 20 69 73 20 64  But no harm is d
119b0 6f 6e 65 20 62 79 20 74 68 69 73 2e 20 20 41 6e  one by this.  An
119c0 64 20 69 74 20 69 73 20 76 65 72 79 20 69 6d 70  d it is very imp
119d0 6f 72 74 61 6e 74 20 74 68 61 74 0a 20 20 20 20  ortant that.    
119e0 20 20 2a 2a 20 62 74 72 65 65 49 6e 69 74 50 61    ** btreeInitPa
119f0 67 65 28 29 20 62 65 20 63 61 6c 6c 65 64 20 6f  ge() be called o
11a00 6e 20 65 76 65 72 79 20 62 74 72 65 65 20 70 61  n every btree pa
11a10 67 65 20 73 6f 20 77 65 20 6d 61 6b 65 0a 20 20  ge so we make.  
11a20 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
11a30 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 74  for every page t
11a40 68 61 74 20 63 6f 6d 65 73 20 69 6e 20 66 6f 72  hat comes in for
11a50 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20 2a 2f 0a   re-initing. */.
11a60 20 20 20 20 20 20 62 74 72 65 65 49 6e 69 74 50        btreeInitP
11a70 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
11a80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
11a90 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
11aa0 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72  andler for a btr
11ab0 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ee..*/.static in
11ac0 74 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  t btreeInvokeBus
11ad0 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70  yHandler(void *p
11ae0 41 72 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64  Arg){.  BtShared
11af0 20 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65   *pBt = (BtShare
11b00 64 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72  d*)pArg;.  asser
11b10 74 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20  t( pBt->db );.  
11b20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11b30 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11b40 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
11b50 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e  return sqlite3In
11b60 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11b70 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61  &pBt->db->busyHa
11b80 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ndler);.}../*.**
11b90 20 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65   Open a database
11ba0 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46   file..** .** zF
11bb0 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e  ilename is the n
11bc0 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
11bd0 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46  ase file.  If zF
11be0 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a  ilename is NULL.
11bf0 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70 68 65 6d  ** then an ephem
11c00 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  eral database is
11c10 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 65   created.  The e
11c20 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11c30 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 65 78  e might.** be ex
11c40 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 6d 65 6d  clusively in mem
11c50 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69 67 68 74  ory, or it might
11c60 20 75 73 65 20 61 20 64 69 73 6b 2d 62 61 73 65   use a disk-base
11c70 64 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 0a  d memory cache..
11c80 2a 2a 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  ** Either way, t
11c90 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
11ca0 61 62 61 73 65 20 77 69 6c 6c 20 62 65 20 61 75  abase will be au
11cb0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
11cc0 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20 73 71 6c  ted .** when sql
11cd0 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29  ite3BtreeClose()
11ce0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
11cf0 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69  * If zFilename i
11d00 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65  s ":memory:" the
11d10 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n an in-memory d
11d20 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61 74  atabase is creat
11d30 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61 75  ed.** that is au
11d40 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73 74  tomatically dest
11d50 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69 73  royed when it is
11d60 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
11d70 68 65 20 22 66 6c 61 67 73 22 20 70 61 72 61 6d  he "flags" param
11d80 65 74 65 72 20 69 73 20 61 20 62 69 74 6d 61 73  eter is a bitmas
11d90 6b 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f 6e  k that might con
11da0 74 61 69 6e 20 62 69 74 73 20 6c 69 6b 65 0a 2a  tain bits like.*
11db0 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f 55  * BTREE_OMIT_JOU
11dc0 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42 54 52 45  RNAL and/or BTRE
11dd0 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a 20  E_MEMORY..**.** 
11de0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
11df0 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  is already opene
11e00 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61  d in the same da
11e10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
11e20 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20  n.** and we are 
11e30 69 6e 20 73 68 61 72 65 64 20 63 61 63 68 65 20  in shared cache 
11e40 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6f  mode, then the o
11e50 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  pen will fail wi
11e60 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  th an.** SQLITE_
11e70 43 4f 4e 53 54 52 41 49 4e 54 20 65 72 72 6f 72  CONSTRAINT error
11e80 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  .  We cannot all
11e90 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 42  ow two or more B
11ea0 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62 6a 65 63  tShared.** objec
11eb0 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64  ts in the same d
11ec0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
11ed0 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73  on since doing s
11ee0 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a 2a 20 74  o will lead.** t
11ef0 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20  o problems with 
11f00 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
11f10 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
11f20 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
11f30 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 56  *pVfs,      /* V
11f40 46 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  FS to use for th
11f50 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 63  is b-tree */.  c
11f60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
11f70 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
11f80 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
11f90 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
11fa0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
11fb0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
11fc0 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
11fd0 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
11fe0 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
11ff0 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
12000 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
12010 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
12020 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
12030 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
12040 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
12050 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
12060 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
12070 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
12080 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
12090 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
120a0 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
120b0 64 20 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20  d *pBt = 0;     
120c0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
120d0 64 20 70 61 72 74 20 6f 66 20 62 74 72 65 65 20  d part of btree 
120e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 42  structure */.  B
120f0 74 72 65 65 20 2a 70 3b 20 20 20 20 20 20 20 20  tree *p;        
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12110 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
12120 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  n */.  sqlite3_m
12130 75 74 65 78 20 2a 6d 75 74 65 78 4f 70 65 6e 20  utex *mutexOpen 
12140 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76 65 6e 74  = 0;  /* Prevent
12150 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
12160 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33 35 33 37  on. Ticket #3537
12170 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
12180 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
12190 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
121a0 6f 64 65 20 66 72 6f 6d 20 74 68 69 73 20 66 75  ode from this fu
121b0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 6e  nction */.  u8 n
121c0 52 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20  Reserve;        
121d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
121e0 74 65 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  te of unused spa
121f0 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
12200 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
12210 61 72 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30  ar zDbHeader[100
12220 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20  ];  /* Database 
12230 68 65 61 64 65 72 20 63 6f 6e 74 65 6e 74 20 2a  header content *
12240 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20 69 66 20  /..  /* True if 
12250 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70 68 65 6d  opening an ephem
12260 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61 72 79 20  eral, temporary 
12270 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
12280 6e 73 74 20 69 6e 74 20 69 73 54 65 6d 70 44 62  nst int isTempDb
12290 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20   = zFilename==0 
122a0 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
122b0 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68  =0;..  /* Set th
122c0 65 20 76 61 72 69 61 62 6c 65 20 69 73 4d 65 6d  e variable isMem
122d0 64 62 20 74 6f 20 74 72 75 65 20 66 6f 72 20 61  db to true for a
122e0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
122f0 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66  base, or .  ** f
12300 61 6c 73 65 20 66 6f 72 20 61 20 66 69 6c 65 2d  alse for a file-
12310 62 61 73 65 64 20 64 61 74 61 62 61 73 65 2e 0a  based database..
12320 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
12330 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
12340 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d  .  const int isM
12350 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  emdb = 0;.#else.
12360 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65    const int isMe
12370 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e 61 6d 65  mdb = (zFilename
12380 20 26 26 20 73 74 72 63 6d 70 28 7a 46 69 6c 65   && strcmp(zFile
12390 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22  name, ":memory:"
123a0 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
123b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
123c0 28 69 73 54 65 6d 70 44 62 20 26 26 20 73 71 6c  (isTempDb && sql
123d0 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79  ite3TempInMemory
123e0 28 64 62 29 29 0a 20 20 20 20 20 20 20 20 20 20  (db)).          
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
12400 28 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49  (vfsFlags & SQLI
12410 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 21  TE_OPEN_MEMORY)!
12420 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  =0;.#endif..  as
12430 73 65 72 74 28 20 64 62 21 3d 30 20 29 3b 0a 20  sert( db!=0 );. 
12440 20 61 73 73 65 72 74 28 20 70 56 66 73 21 3d 30   assert( pVfs!=0
12450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
12460 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
12470 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
12480 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 26   assert( (flags&
12490 30 78 66 66 29 3d 3d 66 6c 61 67 73 20 29 3b 20  0xff)==flags ); 
124a0 20 20 2f 2a 20 66 6c 61 67 73 20 66 69 74 20 69    /* flags fit i
124b0 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a 20 20 2f  n 8 bits */..  /
124c0 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45 45 5f 53  * Only a BTREE_S
124d0 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 63  INGLE database c
124e0 61 6e 20 62 65 20 42 54 52 45 45 5f 55 4e 4f 52  an be BTREE_UNOR
124f0 44 45 52 45 44 20 2a 2f 0a 20 20 61 73 73 65 72  DERED */.  asser
12500 74 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  t( (flags & BTRE
12510 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d 3d 30 20  E_UNORDERED)==0 
12520 7c 7c 20 28 66 6c 61 67 73 20 26 20 42 54 52 45  || (flags & BTRE
12530 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20 29 3b 0a  E_SINGLE)!=0 );.
12540 0a 20 20 2f 2a 20 41 20 42 54 52 45 45 5f 53 49  .  /* A BTREE_SI
12550 4e 47 4c 45 20 64 61 74 61 62 61 73 65 20 69 73  NGLE database is
12560 20 61 6c 77 61 79 73 20 61 20 74 65 6d 70 6f 72   always a tempor
12570 61 72 79 20 61 6e 64 2f 6f 72 20 65 70 68 65 6d  ary and/or ephem
12580 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  eral */.  assert
12590 28 20 28 66 6c 61 67 73 20 26 20 42 54 52 45 45  ( (flags & BTREE
125a0 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c 7c 20 69  _SINGLE)==0 || i
125b0 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20 20 69 66  sTempDb );..  if
125c0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
125d0 20 66 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f   flags |= BTREE_
125e0 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20 20 69 66  MEMORY;.  }.  if
125f0 28 20 28 76 66 73 46 6c 61 67 73 20 26 20 53 51  ( (vfsFlags & SQ
12600 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12610 42 29 21 3d 30 20 26 26 20 28 69 73 4d 65 6d 64  B)!=0 && (isMemd
12620 62 20 7c 7c 20 69 73 54 65 6d 70 44 62 29 20 29  b || isTempDb) )
12630 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d  {.    vfsFlags =
12640 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51   (vfsFlags & ~SQ
12650 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
12660 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  B) | SQLITE_OPEN
12670 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20  _TEMP_DB;.  }.  
12680 70 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  p = sqlite3Mallo
12690 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 72  cZero(sizeof(Btr
126a0 65 65 29 29 3b 0a 20 20 69 66 28 20 21 70 20 29  ee));.  if( !p )
126b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
126c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
126d0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
126e0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64  ANS_NONE;.  p->d
126f0 62 20 3d 20 64 62 3b 0a 23 69 66 6e 64 65 66 20  b = db;.#ifndef 
12700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
12710 45 44 5f 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f  ED_CACHE.  p->lo
12720 63 6b 2e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  ck.pBtree = p;. 
12730 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20   p->lock.iTable 
12740 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  = 1;.#endif..#if
12750 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
12760 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
12770 48 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  HE) && !defined(
12780 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
12790 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66  IO).  /*.  ** If
127a0 20 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61   this Btree is a
127b0 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73   candidate for s
127c0 68 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79  hared cache, try
127d0 20 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a   to find an.  **
127e0 20 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72   existing BtShar
127f0 65 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77  ed object that w
12800 65 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68  e can share with
12810 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 54 65  .  */.  if( isTe
12820 6d 70 44 62 3d 3d 30 20 26 26 20 28 69 73 4d 65  mpDb==0 && (isMe
12830 6d 64 62 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c  mdb==0 || (vfsFl
12840 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
12850 55 52 49 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  URI)!=0) ){.    
12860 69 66 28 20 76 66 73 46 6c 61 67 73 20 26 20 53  if( vfsFlags & S
12870 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
12880 44 43 41 43 48 45 20 29 7b 0a 20 20 20 20 20 20  DCACHE ){.      
12890 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20  int nFilename = 
128a0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
128b0 7a 46 69 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20  zFilename)+1;.  
128c0 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
128d0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
128e0 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
128f0 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
12900 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
12910 61 6c 6c 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50  alloc(MAX(nFullP
12920 61 74 68 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d  athname,nFilenam
12930 65 29 29 3b 0a 20 20 20 20 20 20 4d 55 54 45 58  e));.      MUTEX
12940 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f  _LOGIC( sqlite3_
12950 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
12960 65 64 3b 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e  ed; )..      p->
12970 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
12980 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
12990 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
129a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
129b0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
129c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
129d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
129e0 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20  ( isMemdb ){.   
129f0 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c       memcpy(zFul
12a00 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65  lPathname, zFile
12a10 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29  name, nFilename)
12a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12a30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12a40 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
12a50 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
12a60 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a80 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e        nFullPathn
12a90 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
12aa0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  me);.        if(
12ab0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
12ac0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
12ad0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
12ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
12af0 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
12b00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12b20 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41  #if SQLITE_THREA
12b30 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74 65  DSAFE.      mute
12b40 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d  xOpen = sqlite3M
12b50 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
12b60 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f 50  _MUTEX_STATIC_OP
12b70 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  EN);.      sqlit
12b80 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d  e3_mutex_enter(m
12b90 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20  utexOpen);.     
12ba0 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
12bb0 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
12bc0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
12bd0 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20  ATIC_MASTER);.  
12be0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12bf0 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
12c00 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  red);.#endif.   
12c10 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41     for(pBt=GLOBA
12c20 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
12c30 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
12c40 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70 42  st); pBt; pBt=pB
12c50 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  t->pNext){.     
12c60 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
12c70 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20  nRef>0 );.      
12c80 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28    if( 0==strcmp(
12c90 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73  zFullPathname, s
12ca0 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
12cb0 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ame(pBt->pPager,
12cc0 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20   0)).           
12cd0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12ce0 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
12cf0 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
12d00 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 62           int iDb
12d10 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
12d20 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69  iDb=db->nDb-1; i
12d30 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20  Db>=0; iDb--){. 
12d40 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65 65             Btree
12d50 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64 62   *pExisting = db
12d60 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a  ->aDb[iDb].pBt;.
12d70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
12d80 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45 78  pExisting && pEx
12d90 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74  isting->pBt==pBt
12da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12db0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12dc0 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65  leave(mutexShare
12dd0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
12de0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
12df0 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29  leave(mutexOpen)
12e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
12e10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
12e20 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
12e30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12e40 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
12e50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12e60 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
12e70 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  NT;.            
12e80 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
12e90 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
12ea0 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
12eb0 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
12ec0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
12ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12ef0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
12f00 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
12f10 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
12f20 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
12f30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12f40 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
12f50 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
12f60 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
12f70 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
12f80 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
12f90 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
12fa0 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
12fb0 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
12fc0 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
12fd0 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
12fe0 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
12ff0 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
13000 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
13010 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
13020 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
13030 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
13040 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
13050 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
13060 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
13070 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
13080 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
13090 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
130a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
130b0 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
130c0 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
130d0 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
130e0 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
130f0 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
13100 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
13110 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
13120 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
13130 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
13140 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
13150 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
13160 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
13170 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
13180 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13190 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29 3d  rt( sizeof(u64)=
131a0 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =8 );.    assert
131b0 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34  ( sizeof(u32)==4
131c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
131d0 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29  sizeof(u16)==2 )
131e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
131f0 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b  zeof(Pgno)==4 );
13200 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71  .  .    pBt = sq
13210 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13220 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b   sizeof(*pBt) );
13230 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20  .    if( pBt==0 
13240 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13250 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
13260 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65    goto btree_ope
13270 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  n_out;.    }.   
13280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
13290 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26 70 42  erOpen(pVfs, &pB
132a0 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69 6c 65  t->pPager, zFile
132b0 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
132c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132d0 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c 61 67  EXTRA_SIZE, flag
132e0 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70 61 67  s, vfsFlags, pag
132f0 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20 69 66  eReinit);.    if
13300 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13310 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13320 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69  PagerSetMmapLimi
13330 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 64  t(pBt->pPager, d
13340 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20 20 20  b->szMmap);.    
13350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13360 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
13370 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69  r(pBt->pPager,si
13380 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c  zeof(zDbHeader),
13390 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20  zDbHeader);.    
133a0 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
133b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
133c0 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
133d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
133e0 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  pBt->openFlags =
133f0 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20 20 20   (u8)flags;.    
13400 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20  pBt->db = db;.  
13410 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
13420 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70 42 74  tBusyhandler(pBt
13430 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65 65 49  ->pPager, btreeI
13440 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
13450 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70  , pBt);.    p->p
13460 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20  Bt = pBt;.  .   
13470 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
13480 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61 67  0;.    pBt->pPag
13490 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e1 = 0;.    if( 
134a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65  sqlite3PagerIsre
134b0 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67  adonly(pBt->pPag
134c0 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  er) ) pBt->btsFl
134d0 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f  ags |= BTS_READ_
134e0 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53 51 4c  ONLY;.#ifdef SQL
134f0 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  ITE_SECURE_DELET
13500 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c  E.    pBt->btsFl
13510 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52  ags |= BTS_SECUR
13520 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64 69 66  E_DELETE;.#endif
13530 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
13540 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36  -OF: R-51873-396
13550 31 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  18 The page size
13560 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20   for a database 
13570 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64  file is.    ** d
13580 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
13590 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20   2-byte integer 
135a0 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66  located at an of
135b0 66 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73  fset of 16 bytes
135c0 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65   from.    ** the
135d0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
135e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
135f0 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   */.    pBt->pag
13600 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65 61 64  eSize = (zDbHead
13610 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 7a 44  er[16]<<8) | (zD
13620 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31 36 29  bHeader[17]<<16)
13630 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
13640 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
13650 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
13660 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
13670 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
13680 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
13690 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
136a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
136b0 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 23  >pageSize = 0;.#
136c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
136d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
136e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61      /* If the ma
136f0 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
13700 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20  y:" will create 
13710 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
13720 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20  abase, then.    
13730 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61    ** leave the a
13740 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61  utoVacuum mode a
13750 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f  t 0 (do not auto
13760 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69  -vacuum), even i
13770 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  f.      ** SQLIT
13780 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13790 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e  CUUM is true. On
137a0 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
137b0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
137c0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
137d0 42 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e  B has been defin
137e0 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72  ed, then ":memor
137f0 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20  y:" is just a.  
13800 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66      ** regular f
13810 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69  ile-name. In thi
13820 73 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d  s case the auto-
13830 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61  vacuum applies a
13840 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20  s per normal..  
13850 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13860 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69   zFilename && !i
13870 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
13880 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
13890 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41  m = (SQLITE_DEFA
138a0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f  ULT_AUTOVACUUM ?
138b0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20   1 : 0);.       
138c0 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
138d0 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
138e0 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32  LT_AUTOVACUUM==2
138f0 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13900 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
13910 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20  nReserve = 0;.  
13920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
13930 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
13940 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
13950 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
13960 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
13970 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69        ** determi
13980 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62  ned by the one-b
13990 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  yte unsigned int
139a0 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e  eger found at an
139b0 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20   offset of 20.  
139c0 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
139d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
139e0 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 6e  ader. */.      n
139f0 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61  Reserve = zDbHea
13a00 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70  der[20];.      p
13a10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
13a20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
13a30 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
13a40 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13a50 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75  UM.      pBt->au
13a60 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  toVacuum = (get4
13a70 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
13a80 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
13a90 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72  .      pBt->incr
13aa0 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79  Vacuum = (get4by
13ab0 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36  te(&zDbHeader[36
13ac0 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23   + 7*4])?1:0);.#
13ad0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
13ae0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
13af0 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
13b00 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
13b10 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65 72  pageSize, nReser
13b20 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ve);.    if( rc 
13b30 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65  ) goto btree_ope
13b40 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74 2d 3e  n_out;.    pBt->
13b50 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
13b60 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
13b70 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72  serve;.    asser
13b80 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  t( (pBt->pageSiz
13b90 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20 2f 2a  e & 7)==0 );  /*
13ba0 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
13bb0 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20 2a 2f  t of pageSize */
13bc0 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  .   .#if !define
13bd0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
13be0 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
13bf0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
13c00 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20  MIT_DISKIO).    
13c10 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 42  /* Add the new B
13c20 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
13c30 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
13c40 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68 61  t sharable BtSha
13c50 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  reds..    */.   
13c60 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
13c70 20 29 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f   ){.      MUTEX_
13c80 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
13c90 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65  utex *mutexShare
13ca0 64 3b 20 29 0a 20 20 20 20 20 20 70 42 74 2d 3e  d; ).      pBt->
13cb0 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20  nRef = 1;.      
13cc0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
13cd0 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
13ce0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
13cf0 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
13d00 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
13d10 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
13d20 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
13d30 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
13d40 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
13d50 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
13d60 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
13d70 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
13d80 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
13d90 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
13da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
13db0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13dc0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d  .          db->m
13dd0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
13de0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
13df0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a  btree_open_out;.
13e00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e10 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13e20 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
13e30 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13e40 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f  pBt->pNext = GLO
13e50 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13e60 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13e70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f  List);.      GLO
13e80 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
13e90 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
13ea0 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20  List) = pBt;.   
13eb0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13ec0 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13ed0 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ed);.    }.#endi
13ee0 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69  f.  }..#if !defi
13ef0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13f00 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13f10 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13f20 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13f30 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42 74  /* If the new Bt
13f40 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72 61  ree uses a shara
13f50 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20 74  ble pBtShared, t
13f60 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77  hen link the new
13f70 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f  .  ** Btree into
13f80 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
13f90 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65 73   sharable Btrees
13fa0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f   for the same co
13fb0 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nnection..  ** T
13fc0 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20  he list is kept 
13fd0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
13fe0 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65 73  er by pBt addres
13ff0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  s..  */.  if( p-
14000 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
14010 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65   int i;.    Btre
14020 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72  e *pSib;.    for
14030 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
14040 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
14050 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62   (pSib = db->aDb
14060 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70  [i].pBt)!=0 && p
14070 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  Sib->sharable ){
14080 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
14090 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70  pSib->pPrev ){ p
140a0 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65  Sib = pSib->pPre
140b0 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28  v; }.        if(
140c0 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70 42   p->pBt<pSib->pB
140d0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t ){.          p
140e0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b 0a  ->pNext = pSib;.
140f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14100 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ev = 0;.        
14110 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d 20    pSib->pPrev = 
14120 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
14130 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  {.          whil
14140 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 26  e( pSib->pNext &
14150 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  & pSib->pNext->p
14160 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20  Bt<p->pBt ){.   
14170 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d 20           pSib = 
14180 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSib->pNext;.   
14190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
141a0 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
141b0 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ib->pNext;.     
141c0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20       p->pPrev = 
141d0 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pSib;.          
141e0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a  if( p->pNext ){.
141f0 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70              p->p
14200 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b  Next->pPrev = p;
14210 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14220 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e 65         pSib->pNe
14230 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  xt = p;.        
14240 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
14250 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14260 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 42   }.#endif.  *ppB
14270 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65  tree = p;..btree
14280 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28  _open_out:.  if(
14290 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
142a0 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  {.    if( pBt &&
142b0 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a   pBt->pPager ){.
142c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
142d0 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
142e0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
142f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
14300 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14310 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
14320 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
14330 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
14340 20 42 2d 54 72 65 65 20 77 61 73 20 73 75 63 63   B-Tree was succ
14350 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e 65 64 2c  essfully opened,
14360 20 73 65 74 20 74 68 65 20 70 61 67 65 72 2d 63   set the pager-c
14370 61 63 68 65 20 73 69 7a 65 20 74 6f 20 74 68 65  ache size to the
14380 0a 20 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20  .    ** default 
14390 76 61 6c 75 65 2e 20 45 78 63 65 70 74 2c 20 77  value. Except, w
143a0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f 6e 20 61  hen opening on a
143b0 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65  n existing share
143c0 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c 0a 20  d pager-cache,. 
143d0 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 63 68 61     ** do not cha
143e0 6e 67 65 20 74 68 65 20 70 61 67 65 72 2d 63 61  nge the pager-ca
143f0 63 68 65 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  che size..    */
14400 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
14410 42 74 72 65 65 53 63 68 65 6d 61 28 70 2c 20 30  BtreeSchema(p, 0
14420 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
14430 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
14440 43 61 63 68 65 73 69 7a 65 28 70 2d 3e 70 42 74  Cachesize(p->pBt
14450 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49 54 45  ->pPager, SQLITE
14460 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
14470 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  IZE);.    }.  }.
14480 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e 20    if( mutexOpen 
14490 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
144a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
144b0 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b 0a  d(mutexOpen) );.
144c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
144d0 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
144e0 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
144f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
14500 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
14510 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
14520 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
14530 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
14540 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
14550 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
14560 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
14570 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
14580 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
14590 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
145a0 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
145b0 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
145c0 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
145d0 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
145e0 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
145f0 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
14600 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
14610 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14620 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14630 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14640 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
14650 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
14660 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
14670 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
14680 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14690 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
146a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
146b0 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
146c0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
146d0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
146e0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
146f0 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
14700 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
14710 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
14720 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
14730 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
14740 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
14750 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
14760 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
14770 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
14780 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14790 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
147a0 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
147b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
147c0 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
147d0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
147e0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
147f0 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
14800 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14810 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
14820 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
14830 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
14840 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
14850 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
14860 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
14870 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
14880 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
14890 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
148a0 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
148b0 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
148c0 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
148d0 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
148e0 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
148f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14900 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
14910 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
14920 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
14930 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
14940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14950 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
14960 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
14970 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
14980 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
14990 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
149a0 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
149b0 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
149c0 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
149d0 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
149e0 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
149f0 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14a00 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
14a10 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
14a20 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
14a30 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
14a40 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
14a50 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
14a60 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
14a70 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
14a80 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
14a90 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
14aa0 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
14ab0 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
14ac0 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
14ad0 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
14ae0 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
14af0 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
14b00 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
14b10 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
14b20 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
14b30 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
14b40 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
14b50 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
14b60 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
14b70 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
14b80 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
14b90 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
14ba0 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
14bb0 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
14bc0 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
14bd0 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
14be0 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
14bf0 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
14c00 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
14c10 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
14c20 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
14c30 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
14c40 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
14c50 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
14c60 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
14c70 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
14c80 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
14c90 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
14ca0 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
14cb0 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
14cc0 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
14cd0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
14ce0 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
14cf0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
14d00 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
14d10 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
14d20 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
14d30 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
14d40 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
14d50 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
14d60 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
14d70 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
14d80 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
14d90 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
14da0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
14db0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
14dc0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
14dd0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
14de0 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
14df0 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
14e00 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
14e10 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
14e20 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
14e30 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
14e40 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
14e50 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
14e60 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
14e70 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
14e80 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
14e90 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14ea0 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
14eb0 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
14ec0 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
14ed0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
14ee0 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
14ef0 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
14f00 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
14f10 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
14f20 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
14f30 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
14f40 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
14f50 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
14f60 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
14f70 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
14f80 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
14f90 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
14fa0 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
14fb0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
14fc0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
14fd0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
14fe0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14ff0 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
15000 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
15010 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
15020 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
15030 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
15040 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
15050 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
15060 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15070 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
15080 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
15090 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
150a0 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
150b0 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
150c0 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
150d0 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
150e0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
150f0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
15100 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
15110 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
15120 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
15130 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
15140 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
15150 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
15160 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15170 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
15180 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
15190 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
151a0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
151b0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
151c0 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
151d0 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
151e0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
151f0 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
15200 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
15210 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
15220 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
15230 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
15240 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
15250 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
15260 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
15270 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
15280 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
15290 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
152a0 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
152b0 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
152c0 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
152d0 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
152e0 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
152f0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
15300 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
15310 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
15320 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
15330 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
15340 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
15350 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
15360 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
15370 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
15380 78 46 72 65 65 53 63 68 65 6d 61 20 26 26 20 70  xFreeSchema && p
15390 42 74 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20  Bt->pSchema ){. 
153a0 20 20 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53       pBt->xFreeS
153b0 63 68 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65  chema(pBt->pSche
153c0 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ma);.    }.    s
153d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 30 2c 20  qlite3DbFree(0, 
153e0 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
153f0 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65     freeTempSpace
15400 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
15410 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
15420 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
15430 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
15440 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
15450 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
15460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
15470 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
15480 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
15490 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
154a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
154b0 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
154c0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
154d0 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
154e0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
154f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15500 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
15510 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
15520 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
15530 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
15540 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
15550 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
15560 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
15570 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
15580 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
15590 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
155a0 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
155b0 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
155c0 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
155d0 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
155e0 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
155f0 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
15600 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
15610 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
15620 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
15630 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
15640 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
15650 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
15660 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
15670 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
15680 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
15690 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
156a0 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
156b0 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
156c0 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
156d0 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
156e0 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
156f0 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
15700 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
15710 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
15720 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
15730 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
15740 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
15750 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
15760 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
15770 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
15780 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
15790 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
157a0 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
157b0 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
157c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
157d0 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
157e0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
157f0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
15800 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15810 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15820 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15830 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15840 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15850 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
15860 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15870 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
15880 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
15890 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
158a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
158b0 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
158c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
158d0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
158e0 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
158f0 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15900 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15910 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15920 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15930 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15940 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15950 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15960 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15970 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15980 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15990 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
159a0 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
159b0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
159c0 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
159d0 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
159e0 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
159f0 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15a00 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15a10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15a20 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15a30 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15a40 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15a50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15a60 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15a70 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15a80 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15a90 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15aa0 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15ab0 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15ac0 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15ad0 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15ae0 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15af0 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15b00 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15b10 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15b20 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15b30 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15b40 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15b50 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15b60 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15b70 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15b80 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15b90 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15ba0 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15bb0 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15bc0 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15bd0 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15be0 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15bf0 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15c00 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15c10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15c20 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15c30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15c40 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15c50 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15c60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15c70 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15c80 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15c90 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15ca0 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15cb0 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15cc0 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15cd0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15ce0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15cf0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15d00 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15d10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15d20 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15d30 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
15d40 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
15d50 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
15d60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15d70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15d80 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
15d90 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15da0 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
15db0 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
15dc0 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
15dd0 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
15de0 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
15df0 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
15e00 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
15e10 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
15e20 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
15e30 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
15e40 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15e50 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
15e60 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
15e70 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
15e80 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
15e90 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
15ea0 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
15eb0 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
15ec0 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
15ed0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
15ee0 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
15ef0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15f00 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
15f10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
15f20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
15f30 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
15f40 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
15f50 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
15f60 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
15f70 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
15f80 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15f90 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
15fa0 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
15fb0 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
15fc0 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
15fd0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
15fe0 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
15ff0 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
16000 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
16010 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
16020 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
16030 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
16040 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
16050 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
16060 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
16070 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
16080 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
16090 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
160a0 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
160b0 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
160c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
160d0 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
160e0 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
160f0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
16100 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
16110 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
16120 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
16130 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
16140 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
16150 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
16160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
16170 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
16180 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16190 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
161a0 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
161b0 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
161c0 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
161d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
161e0 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
161f0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16200 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
16210 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
16220 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
16230 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
16240 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
16250 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
16260 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
16270 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
16280 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
16290 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
162a0 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
162b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
162c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
162d0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
162e0 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
162f0 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
16300 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16310 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
16320 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
16330 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
16340 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16350 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
16360 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
16370 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16380 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
16390 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
163a0 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
163b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
163c0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
163d0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
163e0 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
163f0 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
16400 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
16410 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
16420 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
16430 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
16440 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
16450 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
16460 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
16470 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
16480 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
16490 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
164a0 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
164b0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
164c0 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
164d0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
164e0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
164f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
16500 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
16510 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
16520 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
16530 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
16540 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
16550 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
16560 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
16570 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
16580 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
16590 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
165a0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
165b0 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
165c0 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
165d0 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
165e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
165f0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16600 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
16610 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
16620 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
16630 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
16640 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
16650 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
16660 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
16670 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
16680 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16690 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
166a0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
166b0 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
166c0 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
166d0 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
166e0 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
166f0 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
16700 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
16710 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
16720 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
16730 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
16740 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
16750 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
16760 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
16770 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
16780 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
16790 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
167a0 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
167b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
167c0 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
167d0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
167e0 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
167f0 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
16800 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
16810 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
16820 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
16830 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
16840 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
16850 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
16860 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
16870 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
16880 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16890 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
168a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
168b0 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
168c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
168d0 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
168e0 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
168f0 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
16900 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
16910 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16920 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16930 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16940 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
16950 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
16960 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
16970 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
16980 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
16990 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
169a0 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
169b0 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
169c0 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
169d0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
169e0 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
169f0 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
16a00 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
16a10 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
16a20 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
16a30 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
16a40 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
16a50 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
16a60 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
16a70 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
16a80 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
16a90 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16aa0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16ab0 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
16ac0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16ad0 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
16ae0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16af0 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
16b00 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
16b10 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
16b20 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16b30 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16b40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16b50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
16b60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
16b70 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16b80 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
16b90 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
16ba0 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
16bb0 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
16bc0 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
16bd0 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
16be0 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
16bf0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
16c00 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
16c10 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16c20 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
16c30 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
16c40 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
16c50 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
16c60 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16c70 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
16c90 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
16ca0 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16cb0 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16cc0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16cd0 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16ce0 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
16cf0 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
16d00 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
16d10 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
16d20 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
16d30 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
16d40 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
16d50 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
16d60 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
16d70 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
16d80 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
16d90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16da0 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
16db0 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16dc0 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
16dd0 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
16de0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
16df0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16e00 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
16e10 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
16e20 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
16e30 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
16e40 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
16e50 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
16e60 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
16e70 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
16e80 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
16e90 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
16ea0 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
16eb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
16ec0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
16ed0 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
16ee0 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
16ef0 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
16f00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
16f10 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
16f20 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
16f30 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
16f40 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
16f50 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
16f60 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
16f70 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
16f80 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
16f90 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
16fa0 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
16fb0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
16fc0 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
16fd0 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
16fe0 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
16ff0 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
17000 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
17010 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
17020 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17030 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17040 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17050 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
17060 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17070 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
17080 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17090 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
170a0 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
170b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
170c0 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
170d0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
170e0 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
170f0 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
17100 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
17110 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
17120 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
17130 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
17140 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
17150 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
17160 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
17170 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
17180 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17190 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
171a0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
171b0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
171c0 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
171d0 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
171e0 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
171f0 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
17200 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
17210 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
17220 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
17230 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
17240 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
17250 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17260 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
17270 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
17280 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
17290 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
172a0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
172b0 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
172c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
172d0 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
172e0 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
172f0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
17300 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17310 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
17320 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
17330 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
17340 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
17350 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
17360 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
17370 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
17380 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
17390 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
173a0 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
173b0 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
173c0 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
173d0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
173e0 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
173f0 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
17400 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
17410 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
17420 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
17430 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
17440 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
17450 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
17460 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
17470 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
17480 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
17490 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
174a0 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
174b0 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
174c0 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
174d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
174e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
174f0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17500 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
17510 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
17520 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
17530 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
17540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17550 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
17560 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17570 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17580 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
17590 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
175a0 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
175b0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
175c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
175d0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
175e0 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
175f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
17600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
17610 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
17620 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
17630 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
17640 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
17650 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
17660 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
17670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
17680 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
17690 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
176a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
176b0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
176c0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
176d0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
176e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
176f0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17700 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
17710 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
17720 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
17730 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
17740 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
17750 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
17760 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
17770 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
17780 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
17790 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
177a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
177b0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
177c0 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
177d0 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
177e0 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
177f0 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
17800 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
17810 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
17820 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
17830 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
17840 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
17850 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
17860 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
17870 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
17880 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
17890 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
178a0 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
178b0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
178c0 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
178d0 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
178e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
178f0 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
17900 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
17910 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
17920 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
17930 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
17940 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
17950 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
17960 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
17970 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
17980 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
17990 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
179a0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
179b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
179c0 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
179d0 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
179e0 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
179f0 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17a00 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17a10 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
17a20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17a30 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17a40 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
17a50 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
17a60 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
17a70 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
17a80 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
17a90 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
17aa0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17ab0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17ac0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17ad0 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
17ae0 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
17af0 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
17b00 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
17b10 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
17b20 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
17b30 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
17b40 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
17b50 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
17b60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17b70 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
17b80 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
17b90 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
17ba0 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
17bb0 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
17bc0 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
17bd0 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
17be0 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
17bf0 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
17c00 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
17c10 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
17c20 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
17c30 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
17c40 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
17c50 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
17c60 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
17c70 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
17c80 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17c90 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
17ca0 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
17cb0 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
17cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
17cd0 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
17ce0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17cf0 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
17d00 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
17d10 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
17d20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17d30 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
17d40 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17d50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
17d60 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66 64  sOpen==0 ){.#ifd
17d70 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
17d80 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45  T_WAL_SAFETYLEVE
17d90 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65 66  L.        /* Def
17da0 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69 65  ault to specifie
17db0 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  d safety_level f
17dc0 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20  or WAL mode */. 
17dd0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e         if( pBt->
17de0 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64 62  db!=0 && pBt->db
17df0 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20 20  ->aDb!=0 ){.    
17e00 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
17e10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17e20 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b 0a   *db = pBt->db;.
17e30 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61 44            Db *aD
17e40 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 20  b = db->aDb;.   
17e50 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c 20         u8 level 
17e60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  = 0;.          f
17e70 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64 62  or(iDb=0; iDb<db
17e80 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20  ->nDb; iDb++){. 
17e90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
17ea0 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20 61  Db[iDb].pBt && a
17eb0 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42 74  Db[iDb].pBt->pBt
17ec0 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a 20  ==pBt ) break;. 
17ed0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17ee0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44 62       assert( iDb
17ef0 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20 20  <db->nDb );.    
17f00 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64 62        level = db
17f10 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74  ->aDb[iDb].safet
17f20 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 20  y_level;.       
17f30 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f 44     if( !SQLITE_D
17f40 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46 69  bSafetyLevelIsFi
17f50 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a 20  xed(level) && . 
17f60 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
17f70 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76 65  ITE_DbSafetyLeve
17f80 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21 3d  lValue(level) !=
17f90 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17fa0 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c 29  WAL_SAFETYLEVEL)
17fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17fc0 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79 5f  aDb[iDb].safety_
17fd0 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f 44  level = SQLITE_D
17fe0 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45 54  EFAULT_WAL_SAFET
17ff0 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20 20  YLEVEL;.        
18000 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18010 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70  SetSafetyLevel(p
18020 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c 49  Bt->pPager, SQLI
18030 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53  TE_DEFAULT_WAL_S
18040 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20 20  AFETYLEVEL, .   
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18070 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26 53      (db->flags&S
18080 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63 29  QLITE_FullFSync)
18090 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  !=0,.           
180a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180b0 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d              (db-
180c0 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43 6b  >flags&SQLITE_Ck
180d0 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30 29  ptFullFSync)!=0)
180e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
180f0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
18100 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
18110 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
18120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18130 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
18140 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18150 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65  NOTADB;.    }.#e
18160 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49  ndif..    /* EVI
18170 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36  DENCE-OF: R-1546
18180 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78 69  5-20813 The maxi
18190 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20  mum and minimum 
181a0 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61 64  embedded payload
181b0 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e  .    ** fraction
181c0 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20 70  s and the leaf p
181d0 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e 20  ayload fraction 
181e0 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 36  values must be 6
181f0 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20  4, 32, and 32.. 
18200 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
18210 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
18220 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
18230 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
18240 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
18250 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
18260 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
18270 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
18280 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
18290 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
182a0 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
182b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
182c0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
182d0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
182e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
182f0 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68 65  -51873-39618 The
18300 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20 61   page size for a
18310 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
18320 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69  s.    ** determi
18330 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79 74  ned by the 2-byt
18340 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74 65  e integer locate
18350 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
18360 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d 0a  f 16 bytes from.
18370 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69 6e      ** the begin
18380 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
18390 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  base file. */.  
183a0 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70 61    pageSize = (pa
183b0 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70  ge1[16]<<8) | (p
183c0 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20  age1[17]<<16);. 
183d0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
183e0 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38 38  F: R-25008-21688
183f0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 70   The size of a p
18400 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20 6f  age is a power o
18410 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74  f two.    ** bet
18420 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
18430 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f  36 inclusive. */
18440 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
18450 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
18460 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67 65  !=0.     || page
18470 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
18480 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20 20  PAGE_SIZE .     
18490 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35 36  || pageSize<=256
184a0 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67   .    ){.      g
184b0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
184c0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
184d0 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
184e0 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
184f0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18500 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35 20  : R-59310-51205 
18510 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73 70  The "reserved sp
18520 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68 65  ace" size in the
18530 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20 69   1-byte.    ** i
18540 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
18550 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62 65   20 is the numbe
18560 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
18570 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
18580 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70 61  f.    ** each pa
18590 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  ge to reserve fo
185a0 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20  r extensions. . 
185b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49     **.    ** EVI
185c0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
185d0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
185e0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
185f0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a   region is.    *
18600 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  * determined by 
18610 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73  the one-byte uns
18620 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f  igned integer fo
18630 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74  und at an offset
18640 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e   of 20.    ** in
18650 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
18660 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
18670 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
18680 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65   pageSize - page
18690 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 28  1[20];.    if( (
186a0 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70 42  u32)pageSize!=pB
186b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
186c0 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
186d0 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
186e0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
186f0 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
18700 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
18710 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
18720 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
18730 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
18740 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
18750 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
18760 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
18770 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
18780 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
18790 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
187a0 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
187b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
187c0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
187d0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
187e0 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
187f0 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
18800 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
18810 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
18820 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
18830 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
18840 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
18850 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67  ;.      pBt->pag
18860 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
18870 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d 70  ;.      freeTemp
18880 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
18890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
188a0 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
188b0 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
188c0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
188d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
188e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
188f0 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53 69  ageSize-usableSi
18900 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
18910 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
18920 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c  if( (pBt->db->fl
18930 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 63  ags & SQLITE_Rec
18940 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26  overyMode)==0 &&
18950 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c 65   nPage>nPageFile
18960 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
18970 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18980 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70  PT;.      goto p
18990 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
189a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
189b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38  VIDENCE-OF: R-28
189c0 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76 65  312-64704 Howeve
189d0 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73 69  r, the usable si
189e0 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  ze is not allowe
189f0 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c  d to.    ** be l
18a00 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49 6e  ess than 480. In
18a10 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
18a20 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
18a30 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65 0a  s 512, then the.
18a40 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64 20      ** reserved 
18a50 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f  space size canno
18a60 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a  t exceed 32. */.
18a70 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
18a80 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20 20  ze<480 ){.      
18a90 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18aa0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18ab0 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
18ac0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
18ad0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18ae0 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69  = usableSize;.#i
18af0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18b00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
18b10 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
18b20 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61   = (get4byte(&pa
18b30 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  ge1[36 + 4*4])?1
18b40 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  :0);.    pBt->in
18b50 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
18b60 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b  byte(&page1[36 +
18b70 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e   7*4])?1:0);.#en
18b80 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61  dif.  }..  /* ma
18b90 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61  xLocal is the ma
18ba0 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20  ximum amount of 
18bb0 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65  payload to store
18bc0 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a   locally for.  *
18bd0 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20  * a cell.  Make 
18be0 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c  sure it is small
18bf0 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20   enough so that 
18c00 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f  at least minFano
18c10 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61  ut.  ** cells ca
18c20 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e  n will fit on on
18c30 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75  e page.  We assu
18c40 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67  me a 10-byte pag
18c50 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42  e header..  ** B
18c60 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f  esides the paylo
18c70 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73  ad, the cell mus
18c80 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20  t store:.  **   
18c90 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72    2-byte pointer
18ca0 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a   to the cell.  *
18cb0 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69  *     4-byte chi
18cc0 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ld pointer.  ** 
18cd0 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20      9-byte nKey 
18ce0 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
18cf0 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75  -byte nData valu
18d00 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18d10 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
18d20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20  pointer.  ** So 
18d30 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  a cell consists 
18d40 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e  of a 2-byte poin
18d50 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77 68  ter, a header wh
18d60 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20 61  ich is as much a
18d70 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20  s.  ** 17 bytes 
18d80 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74  long, 0 to N byt
18d90 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61  es of payload, a
18da0 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34  nd an optional 4
18db0 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20   byte overflow. 
18dc0 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72   ** page pointer
18dd0 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61  ..  */.  pBt->ma
18de0 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  xLocal = (u16)((
18df0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18e00 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33 29  12)*64/255 - 23)
18e10 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61  ;.  pBt->minLoca
18e20 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d 3e  l = (u16)((pBt->
18e30 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
18e40 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20 70  2/255 - 23);.  p
18e50 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75  Bt->maxLeaf = (u
18e60 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  16)(pBt->usableS
18e70 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42 74  ize - 35);.  pBt
18e80 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31 36  ->minLeaf = (u16
18e90 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
18ea0 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20  ze-12)*32/255 - 
18eb0 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  23);.  if( pBt->
18ec0 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a  maxLocal>127 ){.
18ed0 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74      pBt->max1byt
18ee0 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a  ePayload = 127;.
18ef0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
18f00 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61  ->max1bytePayloa
18f10 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61 78  d = (u8)pBt->max
18f20 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73  Local;.  }.  ass
18f30 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
18f40 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
18f50 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
18f60 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
18f70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50  Page1;.  pBt->nP
18f80 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72  age = nPage;.  r
18f90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18fa0 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  ..page1_init_fai
18fb0 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  led:.  releasePa
18fc0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42  ge(pPage1);.  pB
18fd0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
18fe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
18ff0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a  ifndef NDEBUG./*
19000 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19010 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73  umber of cursors
19020 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68   open on pBt. Th
19030 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a  is is for use.**
19040 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70   in assert() exp
19050 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20  ressions, so it 
19060 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64  is only compiled
19070 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
19080 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a  t.** defined..**
19090 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63  .** Only write c
190a0 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e 74  ursors are count
190b0 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73 20  ed if wrOnly is 
190c0 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79  true.  If wrOnly
190d0 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65   is.** false the
190e0 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  n all cursors ar
190f0 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  e counted..**.**
19100 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
19110 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  s of this routin
19120 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20 61  e, a cursor is a
19130 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
19140 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
19150 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
19160 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
19170 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68 61  se.  Cursors tha
19180 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 74  t.** have been t
19190 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65 20  ripped into the 
191a0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74 61  CURSOR_FAULT sta
191b0 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74  te are not count
191c0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
191d0 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73  t countValidCurs
191e0 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
191f0 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a  t, int wrOnly){.
19200 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
19210 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20  ;.  int r = 0;. 
19220 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70   for(pCur=pBt->p
19230 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43  Cursor; pCur; pC
19240 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b  ur=pCur->pNext){
19250 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c 79  .    if( (wrOnly
19260 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75  ==0 || (pCur->cu
19270 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57 72  rFlags & BTCF_Wr
19280 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20 20  iteFlag)!=0).   
19290 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74    && pCur->eStat
192a0 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e!=CURSOR_FAULT 
192b0 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65  ) r++; .  }.  re
192c0 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66  turn r;.}.#endif
192d0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ../*.** If there
192e0 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
192f0 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ing cursors and 
19300 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68  we are not in th
19310 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61  e middle.** of a
19320 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74   transaction but
19330 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64   there is a read
19340 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19350 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74  abase, then.** t
19360 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65  his routine unre
19370 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  fs the first pag
19380 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
19390 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a  e file which .**
193a0 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20   has the effect 
193b0 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  of releasing the
193c0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a   read lock..**.*
193d0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
193e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
193f0 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
19400 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
19410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19420 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
19430 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
19440 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
19450 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19460 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
19470 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
19480 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42 74  ValidCursors(pBt
19490 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69  ,0)==0 || pBt->i
194a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41  nTransaction>TRA
194b0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28  NS_NONE );.  if(
194c0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
194d0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
194e0 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
194f0 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  0 ){.    MemPage
19500 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
19510 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73 65  pPage1;.    asse
19520 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61 74  rt( pPage1->aDat
19530 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
19540 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
19550 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
19560 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42 74  r)==1 );.    pBt
19570 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
19580 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74    releasePageNot
19590 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20 20  Null(pPage1);.  
195a0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42  }.}../*.** If pB
195b0 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65  t points to an e
195c0 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20 63  mpty file then c
195d0 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70 74  onvert that empt
195e0 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61  y file.** into a
195f0 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61 62   new empty datab
19600 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  ase by initializ
19610 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
19620 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74  ge of.** the dat
19630 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
19640 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65   int newDatabase
19650 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19660 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b  .  MemPage *pP1;
19670 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
19680 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63   *data;.  int rc
19690 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
196a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
196b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
196c0 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e   if( pBt->nPage>
196d0 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
196e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
196f0 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
19700 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
19710 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
19720 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
19730 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
19740 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
19750 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
19760 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
19770 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
19780 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
19790 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
197a0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
197b0 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
197c0 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20  6 );.  data[16] 
197d0 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67  = (u8)((pBt->pag
197e0 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b  eSize>>8)&0xff);
197f0 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28 75  .  data[17] = (u
19800 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
19810 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20 20  e>>16)&0xff);.  
19820 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
19830 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
19840 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
19850 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61  bleSize<=pBt->pa
19860 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e 75  geSize && pBt->u
19870 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70  sableSize+255>=p
19880 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
19890 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38 29   data[20] = (u8)
198a0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d  (pBt->pageSize -
198b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
198c0 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d 20  );.  data[21] = 
198d0 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d  64;.  data[22] =
198e0 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20   32;.  data[23] 
198f0 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26  = 32;.  memset(&
19900 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30  data[24], 0, 100
19910 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  -24);.  zeroPage
19920 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59  (pP1, PTF_INTKEY
19930 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45  |PTF_LEAF|PTF_LE
19940 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74 2d  AFDATA );.  pBt-
19950 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
19960 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b  _PAGESIZE_FIXED;
19970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19980 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
19990 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61    assert( pBt->a
199a0 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20  utoVacuum==1 || 
199b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
199c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
199d0 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d  pBt->incrVacuum=
199e0 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56  =1 || pBt->incrV
199f0 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75  acuum==0 );.  pu
19a00 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20  t4byte(&data[36 
19a10 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74  + 4*4], pBt->aut
19a20 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34  oVacuum);.  put4
19a30 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20  byte(&data[36 + 
19a40 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56  7*4], pBt->incrV
19a50 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20  acuum);.#endif. 
19a60 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b   pBt->nPage = 1;
19a70 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b  .  data[31] = 1;
19a80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19a90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
19aa0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69 72  itialize the fir
19ab0 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
19ac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63 72  atabase file (cr
19ad0 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61 73  eating a databas
19ae0 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20  e.** consisting 
19af0 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
19b00 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f   and no schema o
19b10 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e 20  bjects). Return 
19b20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20  SQLITE_OK.** if 
19b30 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61  successful, or a
19b40 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
19b50 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  ode otherwise..*
19b60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
19b70 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a 70  eeNewDb(Btree *p
19b80 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
19b90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
19ba0 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e  (p);.  p->pBt->n
19bb0 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d  Page = 0;.  rc =
19bc0 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d 3e   newDatabase(p->
19bd0 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  pBt);.  sqlite3B
19be0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
19bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19c00 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
19c10 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
19c20 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
19c30 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
19c40 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
19c50 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
19c60 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
19c70 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
19c80 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
19c90 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
19ca0 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
19cb0 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
19cc0 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
19cd0 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
19ce0 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
19cf0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
19d00 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
19d10 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
19d20 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
19d30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
19d40 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
19d50 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
19d60 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
19d70 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
19d80 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
19d90 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
19da0 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
19db0 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
19dc0 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
19dd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
19de0 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
19df0 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
19e00 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
19e10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
19e20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
19e30 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
19e40 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
19e50 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
19e60 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
19e70 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
19e80 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
19e90 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
19ea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
19eb0 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
19ec0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
19ed0 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
19ee0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19ef0 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
19f00 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19f10 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
19f20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
19f30 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
19f40 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
19f50 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
19f60 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
19f70 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
19f80 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
19f90 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
19fa0 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
19fb0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
19fc0 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
19fd0 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
19fe0 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
19ff0 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
1a000 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
1a010 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
1a020 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
1a030 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
1a040 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
1a050 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
1a060 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
1a070 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
1a080 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
1a090 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1a0a0 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
1a0b0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
1a0c0 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
1a0d0 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
1a0e0 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
1a0f0 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
1a100 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
1a110 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
1a120 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
1a130 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1a140 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
1a150 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
1a160 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
1a170 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
1a180 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
1a190 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
1a1a0 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
1a1b0 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
1a1c0 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
1a1d0 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
1a1e0 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
1a1f0 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
1a200 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
1a210 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1a220 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
1a230 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
1a240 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
1a250 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
1a260 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
1a270 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
1a280 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
1a290 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1a2a0 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
1a2b0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
1a2c0 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65  rflag){.  sqlite
1a2d0 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20  3 *pBlock = 0;. 
1a2e0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1a2f0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
1a300 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1a310 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1a320 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1a330 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1a340 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
1a350 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
1a360 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1a370 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
1a380 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
1a390 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
1a3a0 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
1a3b0 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
1a3c0 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
1a3d0 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
1a3e0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1a3f0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
1a400 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
1a410 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
1a420 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
1a430 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1a440 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
1a450 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1a460 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66  RANS_WRITE || If
1a470 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62  NotOmitAV(pBt->b
1a480 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29  DoTruncate)==0 )
1a490 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  ;..  /* Write tr
1a4a0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
1a4b0 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
1a4c0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
1a4d0 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ase */.  if( (pB
1a4e0 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
1a4f0 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20  S_READ_ONLY)!=0 
1a500 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  && wrflag ){.   
1a510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1a520 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20  DONLY;.    goto 
1a530 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
1a540 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1a550 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1a560 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68  HE.  /* If anoth
1a570 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  er database hand
1a580 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  le has already o
1a590 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74 72  pened a write tr
1a5a0 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a 20  ansaction .  ** 
1a5b0 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62  on this shared-b
1a5c0 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61  tree structure a
1a5d0 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74  nd a second writ
1a5e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1a5f0 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c  .  ** requested,
1a600 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
1a610 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  OCKED..  */.  if
1a620 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42 74  ( (wrflag && pBt
1a630 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1a640 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20 20  =TRANS_WRITE).  
1a650 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   || (pBt->btsFla
1a660 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47  gs & BTS_PENDING
1a670 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70 42  )!=0.  ){.    pB
1a680 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72 69  lock = pBt->pWri
1a690 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  ter->db;.  }else
1a6a0 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29 7b   if( wrflag>1 ){
1a6b0 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  .    BtLock *pIt
1a6c0 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74 65  er;.    for(pIte
1a6d0 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49  r=pBt->pLock; pI
1a6e0 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72  ter; pIter=pIter
1a6f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
1a700 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65  if( pIter->pBtre
1a710 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e!=p ){.        
1a720 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e  pBlock = pIter->
1a730 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
1a740 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1a750 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
1a760 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20  f( pBlock ){.   
1a770 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
1a780 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
1a790 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72 63   pBlock);.    rc
1a7a0 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44   = SQLITE_LOCKED
1a7b0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
1a7c0 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
1a7d0 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  un;.  }.#endif..
1a7e0 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f 6e    /* Any read-on
1a7f0 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74 65  ly or read-write
1a800 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d 70   transaction imp
1a810 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  lies a read-lock
1a820 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20 31   on .  ** page 1
1a830 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74 68  . So if some oth
1a840 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  er shared-cache 
1a850 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20 68  client already h
1a860 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  as a write-lock 
1a870 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31 2c  .  ** on page 1,
1a880 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1a890 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
1a8a0 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75 65  d. */.  rc = que
1a8b0 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
1a8c0 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
1a8d0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
1a8e0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
1a8f0 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74 72  OK!=rc ) goto tr
1a900 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70 42  ans_begun;..  pB
1a910 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1a920 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d  BTS_INITIALLY_EM
1a930 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  PTY;.  if( pBt->
1a940 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d 3e  nPage==0 ) pBt->
1a950 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
1a960 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b  INITIALLY_EMPTY;
1a970 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20 43  .  do {.    /* C
1a980 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29 20  all lockBtree() 
1a990 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42 74  until either pBt
1a9a0 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70 75  ->pPage1 is popu
1a9b0 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a 20  lated or.    ** 
1a9c0 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74 75  lockBtree() retu
1a9d0 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  rns something ot
1a9e0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
1a9f0 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29 0a  OK. lockBtree().
1aa00 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75 72      ** may retur
1aa10 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20  n SQLITE_OK but 
1aa20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
1aa30 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61 66  1 set to 0 if af
1aa40 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  ter.    ** readi
1aa50 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69 73  ng page 1 it dis
1aa60 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65 20  covers that the 
1aa70 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1aa80 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20 2a   database .    *
1aa90 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70 42  * file is not pB
1aaa0 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e 20  t->pageSize. In 
1aab0 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42 74  this case lockBt
1aac0 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61 74  ree() will updat
1aad0 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70 61  e.    ** pBt->pa
1aae0 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70 61  geSize to the pa
1aaf0 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20 66  ge-size of the f
1ab00 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 20  ile on disk..   
1ab10 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70   */.    while( p
1ab20 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26 26  Bt->pPage1==0 &&
1ab30 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
1ab40 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74 29  = lockBtree(pBt)
1ab50 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ) );..    if( rc
1ab60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77  ==SQLITE_OK && w
1ab70 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69  rflag ){.      i
1ab80 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1ab90 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1aba0 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Y)!=0 ){.       
1abb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
1abc0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
1abd0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
1abe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
1abf0 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 77  in(pBt->pPager,w
1ac00 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33 54  rflag>1,sqlite3T
1ac10 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e 64  empInMemory(p->d
1ac20 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b));.        if(
1ac30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ac40 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1ac50 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
1ac60 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ac70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
1ac80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ac90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c  _OK ){.      unl
1aca0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1acb0 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
1acc0 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46 29  while( (rc&0xFF)
1acd0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
1ace0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1acf0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
1ad00 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74 72  &&.          btr
1ad10 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  eeInvokeBusyHand
1ad20 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20 69  ler(pBt) );..  i
1ad30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ad40 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69   ){.    if( p->i
1ad50 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1ad60 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  NE ){.      pBt-
1ad70 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b 3b  >nTransaction++;
1ad80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ad90 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1ada0 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73  E.      if( p->s
1adb0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
1adc0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
1add0 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26 20  ck.pBtree==p && 
1ade0 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d 3d  p->lock.iTable==
1adf0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  1 );.        p->
1ae00 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45 41  lock.eLock = REA
1ae10 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  D_LOCK;.        
1ae20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d 20  p->lock.pNext = 
1ae30 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
1ae40 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d      pBt->pLock =
1ae50 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20 20   &p->lock;.     
1ae60 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
1ae70 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d      p->inTrans =
1ae80 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57   (wrflag?TRANS_W
1ae90 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29  RITE:TRANS_READ)
1aea0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54  ;.    if( p->inT
1aeb0 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  rans>pBt->inTran
1aec0 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
1aed0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1aee0 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73  ion = p->inTrans
1aef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1af00 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1af10 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
1af20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 23  = pBt->pPage1;.#
1af30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1af40 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1af50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1af60 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20  Bt->pWriter );. 
1af70 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65       pBt->pWrite
1af80 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42 74  r = p;.      pBt
1af90 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
1afa0 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  TS_EXCLUSIVE;.  
1afb0 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e 31      if( wrflag>1
1afc0 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73   ) pBt->btsFlags
1afd0 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49 56   |= BTS_EXCLUSIV
1afe0 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  E;.#endif..     
1aff0 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73 69   /* If the db-si
1b000 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  ze header field 
1b010 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61 73  is incorrect (as
1b020 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61 6e   it may be if an
1b030 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63 6c   old.      ** cl
1b040 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77 72  ient has been wr
1b050 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
1b060 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74 65  se file), update
1b070 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a 20   it now. Doing. 
1b080 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f 6f       ** this soo
1b090 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
1b0a0 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65 20  later means the 
1b0b0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63 61  database size ca
1b0c0 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20 20  n safely .      
1b0d0 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20 64  ** re-read the d
1b0e0 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72 6f  atabase size fro
1b0f0 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73 61  m page 1 if a sa
1b100 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e 73  vepoint or trans
1b110 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  action.      ** 
1b120 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
1b130 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e 73  within the trans
1b140 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1b150 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
1b160 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65 28  nPage!=get4byte(
1b170 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  &pPage1->aData[2
1b180 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  8]) ){.        r
1b190 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b1a0 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1b1b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1b1c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b1d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
1b1e0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1b1f0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1b200 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  >nPage);.       
1b210 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b220 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
1b230 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
1b240 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
1b250 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
1b260 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
1b270 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1b280 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
1b290 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
1b2a0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
1b2b0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
1b2c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
1b2d0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
1b2e0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
1b2f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
1b300 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
1b310 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
1b320 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
1b330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b340 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
1b350 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
1b360 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
1b370 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
1b380 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
1b390 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1b3a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1b3b0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
1b3c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b3d0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
1b3e0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
1b3f0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
1b400 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
1b410 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
1b420 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
1b430 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
1b440 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
1b450 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
1b460 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
1b470 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
1b480 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
1b490 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
1b4a0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
1b4b0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
1b4c0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
1b4f0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
1b500 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
1b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b520 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b530 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
1b540 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
1b550 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b570 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1b580 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1b590 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
1b5a0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
1b5b0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
1b5c0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
1b5d0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
1b5e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b5f0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
1b600 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1b610 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50   rc = btreeInitP
1b620 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66  age(pPage);.  if
1b630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b640 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74 5f  ){.    goto set_
1b650 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
1b660 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20 3d  t;.  }.  nCell =
1b670 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
1b680 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1b690 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
1b6a0 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1b6b0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a 20  ll(pPage, i);.. 
1b6c0 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
1b6d0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
1b6e0 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66 28  , &rc);..    if(
1b6f0 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
1b700 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  .      Pgno chil
1b710 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
1b720 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 70  (pCell);.      p
1b730 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68  trmapPut(pBt, ch
1b740 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f  ildPgno, PTRMAP_
1b750 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63  BTREE, pgno, &rc
1b760 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
1b770 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1b780 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69   ){.    Pgno chi
1b790 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1b7a0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1b7b0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1b7c0 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  +8]);.    ptrmap
1b7d0 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1b7e0 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1b7f0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1b800 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  }..set_child_ptr
1b810 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67  maps_out:.  pPag
1b820 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
1b830 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e  itOrig;.  return
1b840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f   rc;.}../*.** So
1b850 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65  mewhere on pPage
1b860 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1b870 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d 6f   page iFrom.  Mo
1b880 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
1b890 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20  r so.** that it 
1b8a0 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20 50  points to iTo. P
1b8b0 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
1b8c0 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
1b8d0 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 0a  e of pointer to.
1b8e0 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ** be modified, 
1b8f0 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  as  follows:.**.
1b900 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
1b910 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
1b920 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
1b930 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
1b940 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
1b950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b960 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
1b970 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
1b980 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
1b990 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1b9a0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1b9b0 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
1b9c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b9d0 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
1b9e0 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
1b9f0 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
1ba00 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
1ba10 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
1ba20 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
1ba30 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
1ba40 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
1ba50 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
1ba60 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
1ba70 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
1ba80 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
1ba90 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
1baa0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
1bab0 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
1bac0 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
1bad0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
1bae0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1baf0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
1bb00 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1bb10 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
1bb20 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
1bb30 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
1bb40 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
1bb50 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
1bb60 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
1bb70 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
1bb80 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
1bb90 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
1bba0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
1bbb0 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
1bbc0 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
1bbd0 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
1bbe0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1bbf0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
1bc00 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
1bc10 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
1bc20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
1bc30 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
1bc40 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
1bc50 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
1bc60 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ll;.    int rc;.
1bc70 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49  .    rc = btreeI
1bc80 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
1bc90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1bca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65 6c  urn rc;.    nCel
1bcb0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1bcc0 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ;..    for(i=0; 
1bcd0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
1bce0 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d       u8 *pCell =
1bcf0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1bd00 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65   i);.      if( e
1bd10 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1bd20 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20  RFLOW1 ){.      
1bd30 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
1bd40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
1bd50 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
1bd60 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
1bd70 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e 66  .        if( inf
1bd80 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20 20  o.iOverflow.    
1bd90 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e       && pCell+in
1bda0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c 3d  fo.iOverflow+3<=
1bdb0 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1bdc0 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
1bdd0 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
1bde0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
1bdf0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
1be00 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1be10 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1be20 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
1be30 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
1be40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1be50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1be60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
1be70 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1be80 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
1be90 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
1bea0 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
1beb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bec0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1bed0 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
1bee0 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
1bef0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1bf00 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
1bf10 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
1bf20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1bf30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1bf40 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
1bf50 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1bf60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1bf70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1bf80 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
1bf90 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1bfa0 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
1bfb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
1bfc0 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
1bfd0 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
1bfe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1bff0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
1c000 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
1c010 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
1c020 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
1c030 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
1c040 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
1c050 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
1c060 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2a  emains valid..**
1c070 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69 74  .** The isCommit
1c080 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73 20   flag indicates 
1c090 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
1c0a0 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62 65   need to remembe
1c0b0 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a 6f  r that.** the jo
1c0c0 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
1c0d0 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
1c0e0 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  e database page 
1c0f0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a 2a  pDbPage->pgno .*
1c100 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e  * can be written
1c110 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72 20   to. The caller 
1c120 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f 6d  has already prom
1c130 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69 74  ised not to writ
1c140 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61 67  e to that.** pag
1c150 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c160 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a 20   relocatePage(. 
1c170 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
1c180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
1c190 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ee */.  MemPage 
1c1a0 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20 20  *pDbPage,       
1c1b0 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74 6f   /* Open page to
1c1c0 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65 54   move */.  u8 eT
1c1d0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
1c1e0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1c1f0 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79 20  ap 'type' entry 
1c200 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a 20  for pDbPage */. 
1c210 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c 20   Pgno iPtrPage, 
1c220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
1c230 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d 6e  nter map 'page-n
1c240 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  o' entry for pDb
1c250 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
1c260 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20 20  FreePage,       
1c270 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74 69     /* The locati
1c280 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50 61  on to move pDbPa
1c290 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  ge to */.  int i
1c2a0 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 20  sCommit         
1c2b0 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74 20      /* isCommit 
1c2c0 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20 73  flag passed to s
1c2d0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1c2e0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50  age */.){.  MemP
1c2f0 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20 20  age *pPtrPage;  
1c300 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68 61   /* The page tha
1c310 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
1c320 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65 20  nter to pDbPage 
1c330 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61 67  */.  Pgno iDbPag
1c340 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67 6e  e = pDbPage->pgn
1c350 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  o;.  Pager *pPag
1c360 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 72  er = pBt->pPager
1c370 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1c380 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50 54  ssert( eType==PT
1c390 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c  RMAP_OVERFLOW2 |
1c3a0 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
1c3b0 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20  OVERFLOW1 || .  
1c3c0 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d 41      eType==PTRMA
1c3d0 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
1c3e0 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
1c3f0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  E );.  assert( s
1c400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1c410 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1c420 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50 61  .  assert( pDbPa
1c430 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a  ge->pBt==pBt );.
1c440 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20  .  /* Move page 
1c450 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74 73  iDbPage from its
1c460 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
1c470 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  n to page number
1c480 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20 20   iFreePage */.  
1c490 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43 55  TRACE(("AUTOVACU
1c4a0 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f  UM: Moving %d to
1c4b0 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28 70   free page %d (p
1c4c0 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65 20  tr page %d type 
1c4d0 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69  %d)\n", .      i
1c4e0 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
1c4f0 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54 79  e, iPtrPage, eTy
1c500 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pe));.  rc = sql
1c510 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
1c520 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61 67  e(pPager, pDbPag
1c530 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72 65  e->pDbPage, iFre
1c540 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29  ePage, isCommit)
1c550 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1c570 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
1c580 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
1c590 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
1c5a0 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
1c5b0 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
1c5c0 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
1c5d0 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
1c5e0 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
1c5f0 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1c600 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
1c610 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
1c620 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
1c630 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
1c640 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
1c650 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
1c660 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1c670 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
1c680 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
1c690 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
1c6a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
1c6b0 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
1c6c0 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
1c6d0 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
1c6e0 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
1c6f0 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
1c700 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
1c710 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
1c720 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
1c730 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1c740 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
1c750 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
1c760 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
1c770 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
1c780 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
1c790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c7a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1c7b0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
1c7c0 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
1c7d0 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
1c7e0 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
1c7f0 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
1c800 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  fl!=0 ){.      p
1c810 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
1c820 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
1c830 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
1c840 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 20  age, &rc);.     
1c850 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c860 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1c870 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1c880 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c890 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
1c8a0 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
1c8b0 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
1c8c0 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
1c8d0 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
1c8e0 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
1c8f0 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
1c900 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
1c910 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
1c920 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
1c930 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
1c940 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1c950 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74     rc = btreeGet
1c960 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50 61  Page(pBt, iPtrPa
1c970 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20 30  ge, &pPtrPage, 0
1c980 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c990 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c9a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1c9b0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
1c9c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1c9d0 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  trPage->pDbPage)
1c9e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1c9f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ca00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 74   releasePage(pPt
1ca10 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65  rPage);.      re
1ca20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1ca30 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50 61     rc = modifyPa
1ca40 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50 61  gePointer(pPtrPa
1ca50 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46 72  ge, iDbPage, iFr
1ca60 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b 0a  eePage, eType);.
1ca70 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1ca80 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 69  pPtrPage);.    i
1ca90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1caa0 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70   ){.      ptrmap
1cab0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
1cac0 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
1cad0 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 7d  age, &rc);.    }
1cae0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1caf0 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
1cb00 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71 75  declaration requ
1cb10 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63 75  ired by incrVacu
1cb20 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61  umStep(). */.sta
1cb30 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1cb40 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61 72  BtreePage(BtShar
1cb50 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a  ed *, MemPage **
1cb60 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20  , Pgno *, Pgno, 
1cb70 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66  u8);../*.** Perf
1cb80 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74 65  orm a single ste
1cb90 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  p of an incremen
1cba0 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20 73  tal-vacuum. If s
1cbb0 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75 72  uccessful, retur
1cbc0 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  n.** SQLITE_OK. 
1cbd0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  If there is no w
1cbe0 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20 74  ork to do (and t
1cbf0 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69 6e  herefore no poin
1cc00 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e 67  t in .** calling
1cc10 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1cc20 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53 51  gain), return SQ
1cc30 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20 69  LITE_DONE. Or, i
1cc40 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
1cc50 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73 6f  ccurs, return so
1cc60 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1cc70 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ode..**.** More 
1cc80 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74 68  specifically, th
1cc90 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
1cca0 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
1ccb0 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ize the database
1ccc0 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68 65   so .** that the
1ccd0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
1cce0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
1ccf0 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c 6f   in use is no lo
1cd00 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  nger in use..**.
1cd10 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46 69  ** Parameter nFi
1cd20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  n is the number 
1cd30 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1cd40 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75 6c  is database woul
1cd50 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65 72  d contain.** wer
1cd60 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
1cd70 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74 20  called until it 
1cd80 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44  returns SQLITE_D
1cd90 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ONE..**.** If th
1cda0 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d 65  e bCommit parame
1cdb0 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
1cdc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   this function a
1cdd0 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65 20  ssumes that the 
1cde0 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  .** caller will 
1cdf0 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e 63  keep calling inc
1ce00 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75 6e  rVacuumStep() un
1ce10 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20 53  til it returns S
1ce20 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20 6f  QLITE_DONE .** o
1ce30 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f 6d  r an error. bCom
1ce40 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74 72  mit is passed tr
1ce50 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76  ue for an auto-v
1ce60 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74 20  acuum-on-commit 
1ce70 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6f  .** operation, o
1ce80 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20 69  r false for an i
1ce90 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
1cea0 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  m..*/.static int
1ceb0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1cec0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
1ced0 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20 69  gno nFin, Pgno i
1cee0 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f 6d  LastPg, int bCom
1cef0 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46 72  mit){.  Pgno nFr
1cf00 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
1cf10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
1cf20 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
1cf30 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 20  e free-list */. 
1cf40 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1cf50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1cf60 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1cf70 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1cf80 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b 0a  iLastPg>nFin );.
1cf90 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f 49  .  if( !PTRMAP_I
1cfa0 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73 74  SPAGE(pBt, iLast
1cfb0 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21 3d  Pg) && iLastPg!=
1cfc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1cfd0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75 38  E(pBt) ){.    u8
1cfe0 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
1cff0 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
1d000 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
1d010 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1d020 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
1d030 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
1d040 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1d050 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
1d060 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
1d070 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
1d080 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
1d090 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
1d0a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d0b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1d0c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d0d0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1d0e0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
1d0f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d100 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1d110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1d120 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
1d130 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
1d140 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1d150 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
1d160 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
1d170 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
1d180 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
1d190 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
1d1a0 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d 69      ** if bCommi
1d1b0 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49  t is non-zero. I
1d1c0 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65  n that case, the
1d1d0 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20   free-list will 
1d1e0 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72  be.        ** tr
1d1f0 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20  uncated to zero 
1d200 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1d210 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20  ion returns, so 
1d220 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20  it doesn't .    
1d230 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66      ** matter if
1d240 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69   it still contai
1d250 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  ns some garbage 
1d260 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20  entries..       
1d270 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
1d280 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20   iFreePg;.      
1d290 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65    MemPage *pFree
1d2a0 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Pg;.        rc =
1d2b0 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1d2c0 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67  ge(pBt, &pFreePg
1d2d0 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73  , &iFreePg, iLas
1d2e0 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58 41  tPg, BTALLOC_EXA
1d2f0 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CT);.        if(
1d300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d310 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1d320 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1d330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1d340 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
1d350 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
1d360 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
1d370 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1d380 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
1d390 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
1d3a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1d3b0 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
1d3c0 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
1d3d0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
1d3e0 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20 20  e *pLastPg;.    
1d3f0 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54 41    u8 eMode = BTA
1d400 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20 4d  LLOC_ANY;   /* M
1d410 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66 6f  ode parameter fo
1d420 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1d430 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 50  age() */.      P
1d440 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20 20  gno iNear = 0;  
1d450 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61 72           /* near
1d460 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  by parameter for
1d470 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
1d480 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20 72  ge() */..      r
1d490 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
1d4a0 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26  (pBt, iLastPg, &
1d4b0 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20  pLastPg, 0);.   
1d4c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d4d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d4e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d4f0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
1d500 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f 2c  bCommit is zero,
1d510 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
1d520 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
1d530 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
1d540 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
1d550 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
1d560 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
1d570 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
1d580 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
1d590 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
1d5a0 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43 6f  her hand, if bCo
1d5b0 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72 20  mmit is greater 
1d5c0 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
1d5d0 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f  keep.      ** lo
1d5e0 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66 72  oping until a fr
1d5f0 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64 20  ee-page located 
1d600 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73 74  within the first
1d610 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20 20   nFin pages.    
1d620 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65    ** of the file
1d630 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20   is found..     
1d640 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 43   */.      if( bC
1d650 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1d660 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41 4c      eMode = BTAL
1d670 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20  LOC_LE;.        
1d680 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20 20  iNear = nFin;.  
1d690 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20 7b      }.      do {
1d6a0 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65  .        MemPage
1d6b0 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20 20   *pFreePg;.     
1d6c0 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65     rc = allocate
1d6d0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
1d6e0 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65 50  pFreePg, &iFreeP
1d6f0 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65 29  g, iNear, eMode)
1d700 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1d710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1d720 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
1d730 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20  Page(pLastPg);. 
1d740 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d750 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
1d760 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1d770 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20  e(pFreePg);.    
1d780 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d 69    }while( bCommi
1d790 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69  t && iFreePg>nFi
1d7a0 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  n );.      asser
1d7b0 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74  t( iFreePg<iLast
1d7c0 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20  Pg );.      .   
1d7d0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
1d7e0 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
1d7f0 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
1d800 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43 6f  ge, iFreePg, bCo
1d810 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65 6c  mmit);.      rel
1d820 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
1d830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1d840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d850 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d870 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69   }..  if( bCommi
1d880 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20 7b  t==0 ){.    do {
1d890 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d  .      iLastPg--
1d8a0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 4c  ;.    }while( iL
1d8b0 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
1d8c0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c 7c  YTE_PAGE(pBt) ||
1d8d0 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1d8e0 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b 0a  Bt, iLastPg) );.
1d8f0 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75 6e      pBt->bDoTrun
1d900 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70 42  cate = 1;.    pB
1d910 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73 74  t->nPage = iLast
1d920 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  Pg;.  }.  return
1d930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1d940 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61 73  *.** The databas
1d950 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  e opened by the 
1d960 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1d970 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
1d980 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f 72   database.** nOr
1d990 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a 65  ig pages in size
1d9a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72 65   containing nFre
1d9b0 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52 65  e free pages. Re
1d9c0 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74 65  turn the expecte
1d9d0 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68  d .** size of th
1d9e0 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70 61  e database in pa
1d9f0 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e  ges following an
1da00 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70 65   auto-vacuum ope
1da10 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
1da20 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53 69  c Pgno finalDbSi
1da30 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ze(BtShared *pBt
1da40 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50 67  , Pgno nOrig, Pg
1da50 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e 74  no nFree){.  int
1da60 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20 20   nEntry;        
1da70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1da80 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1da90 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70 20  s on one ptrmap 
1daa0 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  page */.  Pgno n
1dab0 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20 20  Ptrmap;         
1dac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1dad0 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70 61  ber of PtrMap pa
1dae0 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  ges to be freed 
1daf0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20  */.  Pgno nFin; 
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1db20 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74 72  alue */..  nEntr
1db30 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  y = pBt->usableS
1db40 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61 70  ize/5;.  nPtrmap
1db50 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
1db60 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
1db70 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72 79  t, nOrig)+nEntry
1db80 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69 6e  )/nEntry;.  nFin
1db90 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
1dba0 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69 66   - nPtrmap;.  if
1dbb0 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47 5f  ( nOrig>PENDING_
1dbc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 26  BYTE_PAGE(pBt) &
1dbd0 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f 42  & nFin<PENDING_B
1dbe0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1dbf0 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d  .    nFin--;.  }
1dc00 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50  .  while( PTRMAP
1dc10 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69  _ISPAGE(pBt, nFi
1dc20 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44  n) || nFin==PEND
1dc30 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1dc40 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d  t) ){.    nFin--
1dc50 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1dc60 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  nFin;.}../*.** A
1dc70 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1dc80 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
1dc90 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
1dca0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
1dcb0 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
1dcc0 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
1dcd0 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
1dce0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1dcf0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
1dd00 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1dd10 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
1dd20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
1dd30 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
1dd40 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
1dd50 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
1dd60 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
1dd70 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
1dd80 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  urred,.** SQLITE
1dd90 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1dda0 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
1ddb0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
1ddc0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
1ddd0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
1dde0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
1ddf0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
1de00 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
1de10 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1de20 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
1de30 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
1de40 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1de50 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
1de60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1de70 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
1de80 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
1de90 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
1dea0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e    }else{.    Pgn
1deb0 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50  o nOrig = btreeP
1dec0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1ded0 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d 20     Pgno nFree = 
1dee0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1def0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1df00 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e  );.    Pgno nFin
1df10 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 70   = finalDbSize(p
1df20 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65  Bt, nOrig, nFree
1df30 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72 69  );..    if( nOri
1df40 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20 20  g<nFin ){.      
1df50 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
1df60 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65  UPT_BKPT;.    }e
1df70 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30 20  lse if( nFree>0 
1df80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 61  ){.      rc = sa
1df90 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
1dfa0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
1dfb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dfc0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 61   ){.        inva
1dfd0 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1dfe0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
1dff0 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1e000 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1e010 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a 20  in, nOrig, 0);. 
1e020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e040 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1e050 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e060 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1e070 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1e080 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e090 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1e0a0 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20  , pBt->nPage);. 
1e0b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
1e0c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e0d0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
1e0e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
1e0f0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
1e100 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1e110 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1e120 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
1e130 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
1e140 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
1e150 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
1e160 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20 61  mmitted for an a
1e170 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1e180 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
1e190 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1e1a0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
1e1b0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
1e1c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1e1d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1e1e0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
1e1f0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
1e200 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
1e210 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
1e220 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1e230 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
1e240 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
1e250 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
1e260 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
1e270 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
1e280 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
1e290 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
1e2a0 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  *pBt){.  int rc 
1e2b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1e2c0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1e2d0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56 56  Bt->pPager;.  VV
1e2e0 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65 66  A_ONLY( int nRef
1e2f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
1e300 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
1e310 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71   )..  assert( sq
1e320 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1e330 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1e340 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
1e350 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
1e360 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74 2d  );.  assert(pBt-
1e370 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
1e380 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56 61  if( !pBt->incrVa
1e390 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
1e3a0 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20 2f   nFin;         /
1e3b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
1e3c0 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61 66  s in database af
1e3d0 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69 6e  ter autovacuumin
1e3e0 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 46  g */.    Pgno nF
1e3f0 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e  ree;        /* N
1e400 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
1e410 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  n the freelist i
1e420 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20 20  nitially */.    
1e430 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20 20  Pgno iFree;     
1e440 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70     /* The next p
1e450 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64 20  age to be freed 
1e460 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  */.    Pgno nOri
1e470 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  g;        /* Dat
1e480 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f 72  abase size befor
1e490 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20 20  e freeing */..  
1e4a0 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65 50    nOrig = btreeP
1e4b0 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20  agecount(pBt);. 
1e4c0 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53     if( PTRMAP_IS
1e4d0 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29  PAGE(pBt, nOrig)
1e4e0 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49   || nOrig==PENDI
1e4f0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1e500 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 74  ) ){.      /* It
1e510 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
1e520 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61 74   to create a dat
1e530 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68 20  abase for which 
1e540 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a 20  the final page. 
1e550 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68 65       ** is eithe
1e560 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  r a pointer-map 
1e570 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e 64  page or the pend
1e580 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20 49  ing-byte page. I
1e590 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 69  f one.      ** i
1e5a0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74  s encountered, t
1e5b0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63 6f  his indicates co
1e5c0 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20  rruption..      
1e5d0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1e5e0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e5f0 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
1e600 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1e610 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e620 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 6e  Data[36]);.    n
1e630 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a  Fin = finalDbSiz
1e640 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46  e(pBt, nOrig, nF
1e650 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 46  ree);.    if( nF
1e660 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75 72  in>nOrig ) retur
1e670 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e680 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20 6e  _BKPT;.    if( n
1e690 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20 20  Fin<nOrig ){.   
1e6a0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1e6b0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1e6c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1e6d0 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69 46  (iFree=nOrig; iF
1e6e0 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d 3d  ree>nFin && rc==
1e6f0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65 65  SQLITE_OK; iFree
1e700 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
1e710 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70  incrVacuumStep(p
1e720 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65 2c  Bt, nFin, iFree,
1e730 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   1);.    }.    i
1e740 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  f( (rc==SQLITE_D
1e750 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ONE || rc==SQLIT
1e760 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e 30  E_OK) && nFree>0
1e770 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e780 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e790 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44  (pBt->pPage1->pD
1e7a0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75  bPage);.      pu
1e7b0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1e7c0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1e7d0 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  0);.      put4by
1e7e0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e7f0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a  >aData[36], 0);.
1e800 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1e810 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1e820 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a 20  ta[28], nFin);. 
1e830 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75       pBt->bDoTru
1e840 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  ncate = 1;.     
1e850 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 46   pBt->nPage = nF
1e860 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  in;.    }.    if
1e870 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e880 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1e890 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50  PagerRollback(pP
1e8a0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1e8b0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 66  ..  assert( nRef
1e8c0 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  >=sqlite3PagerRe
1e8d0 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29  fcount(pPager) )
1e8e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1e8f0 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64 65  ..#else /* ifnde
1e900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e910 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64 65  TOVACUUM */.# de
1e920 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74 72  fine setChildPtr
1e930 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f 4f  maps(x) SQLITE_O
1e940 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  K.#endif../*.** 
1e950 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65  This routine doe
1e960 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73  s the first phas
1e970 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65  e of a two-phase
1e980 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72   commit.  This r
1e990 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73  outine.** causes
1e9a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
1e9b0 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65  nal to be create
1e9c0 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f  d (if it does no
1e9d0 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 29  t already exist)
1e9e0 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  .** and populate
1e9f0 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e  d with enough in
1ea00 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
1ea10 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73  t if a power los
1ea20 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20  s occurs.** the 
1ea30 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65 20  database can be 
1ea40 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
1ea50 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62  original state b
1ea60 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a  y playing back.*
1ea70 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  * the journal.  
1ea80 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  Then the content
1ea90 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
1eaa0 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74   are flushed out
1eab0 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e   to.** the disk.
1eac0 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72    After the jour
1ead0 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e  nal is safely on
1eae0 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e   oxide, the chan
1eaf0 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61  ges to the.** da
1eb00 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74 74  tabase are writt
1eb10 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  en into the data
1eb20 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c  base file and fl
1eb30 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a  ushed to oxide..
1eb40 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66  ** At the end of
1eb50 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20   this call, the 
1eb60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1eb70 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e   still exists on
1eb80 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64   the.** disk and
1eb90 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f   we are still ho
1eba0 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c  lding all locks,
1ebb0 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   so the transact
1ebc0 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63  ion has not.** c
1ebd0 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73  ommitted.  See s
1ebe0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1ebf0 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72 20  tPhaseTwo() for 
1ec00 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65  the second phase
1ec10 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d 69   of the.** commi
1ec20 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
1ec30 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20   This call is a 
1ec40 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69 74  no-op if no writ
1ec50 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
1ec60 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76   currently activ
1ec70 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a 20  e on pBt..**.** 
1ec80 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63 20  Otherwise, sync 
1ec90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eca0 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65 20  e for the btree 
1ecb0 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  pBt. zMaster poi
1ecc0 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61  nts to.** the na
1ecd0 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  me of a master j
1ece0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1ecf0 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1ed00 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 69  en into the.** i
1ed10 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
1ed20 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e 55  l file, or is NU
1ed30 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  LL, indicating n
1ed40 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
1ed50 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67 6c   file .** (singl
1ed60 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
1ed70 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57  action)..**.** W
1ed80 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
1ed90 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ed, the master j
1eda0 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61 6c  ournal should al
1edb0 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 0a  ready have been.
1edc0 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70 75  ** created, popu
1edd0 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  lated with this 
1ede0 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20  journal pointer 
1edf0 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64 69  and synced to di
1ee00 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74  sk..**.** Once t
1ee10 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20 68  his is routine h
1ee20 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  as returned, the
1ee30 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71 75   only thing requ
1ee40 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a 2a  ired to commit.*
1ee50 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61 6e  * the write-tran
1ee60 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  saction for this
1ee70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1ee80 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
1ee90 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74 20  journal..*/.int 
1eea0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1eeb0 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65 65  itPhaseOne(Btree
1eec0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1eed0 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
1eee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1eef0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
1ef00 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ef10 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a  {.    BtShared *
1ef20 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1ef30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ef40 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66 20  ter(p);.#ifndef 
1ef50 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ef60 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1ef70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1ef80 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
1ef90 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
1efa0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
1efb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1efc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
1efd0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
1efe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1eff0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f000 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54 72    if( pBt->bDoTr
1f010 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20  uncate ){.      
1f020 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1f030 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e 70  cateImage(pBt->p
1f040 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61 67  Pager, pBt->nPag
1f050 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
1f060 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f070 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1f080 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72  eOne(pBt->pPager
1f090 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20  , zMaster, 0);. 
1f0a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1f0b0 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
1f0c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1f0d0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1f0e0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
1f0f0 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69 74  both BtreeCommit
1f100 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20 42  PhaseTwo() and B
1f110 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a 2a  treeRollback().*
1f120 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  * at the conclus
1f130 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61 63  ion of a transac
1f140 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1f150 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72 61  void btreeEndTra
1f160 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20 2a  nsaction(Btree *
1f170 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
1f180 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1f190 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
1f1a0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
1f1b0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
1f1c0 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69 66  Mutex(p) );..#if
1f1d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1f1e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70 42  _AUTOVACUUM.  pB
1f1f0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1f200 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28   0;.#endif.  if(
1f210 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e   p->inTrans>TRAN
1f220 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e 56  S_NONE && db->nV
1f230 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20 20  dbeRead>1 ){.   
1f240 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
1f250 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73 74   other active st
1f260 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62 65  atements that be
1f270 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61 74  long to this dat
1f280 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61 6e  abase.    ** han
1f290 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20 74  dle, downgrade t
1f2a0 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74 72  o a read-only tr
1f2b0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 6f  ansaction. The o
1f2c0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 0a  ther statements.
1f2d0 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c 6c      ** may still
1f2e0 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f 6d   be reading from
1f2f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1f300 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64 65  */.    downgrade
1f310 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
1f320 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20  bleLocks(p);.   
1f330 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1f340 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ANS_READ;.  }els
1f350 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  e{.    /* If the
1f360 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79 20   handle had any 
1f370 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
1f380 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
1f390 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ent the .    ** 
1f3a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1f3b0 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64 20  t of the shared 
1f3c0 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74 72  btree. If the tr
1f3d0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20  ansaction count 
1f3e0 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73 20  .    ** reaches 
1f3f0 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72 65  0, set the share
1f400 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
1f410 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63  _NONE. The unloc
1f420 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29  kBtreeIfUnused()
1f430 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65 6c  .    ** call bel
1f440 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ow will unlock t
1f450 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20 20  he pager.  */.  
1f460 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1f470 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
1f480 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53 68        clearAllSh
1f490 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
1f4a0 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70 42  cks(p);.      pB
1f4b0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d  t->nTransaction-
1f4c0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  -;.      if( 0==
1f4d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1f4e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  n ){.        pBt
1f4f0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
1f500 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
1f510 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f520 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72 72   /* Set the curr
1f530 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1f540 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
1f550 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ONE and unlock t
1f560 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65 72  he .    ** pager
1f570 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
1f580 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
1f590 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1f5a0 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  saction.  */.   
1f5b0 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
1f5c0 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75 6e  ANS_NONE;.    un
1f5d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1f5e0 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  d(pBt);.  }..  b
1f5f0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1f600 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1f610 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
1f620 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70  n currently in p
1f630 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  rogress..**.** T
1f640 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
1f650 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e  ements the secon
1f660 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70  d phase of a 2-p
1f670 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68  hase commit.  Th
1f680 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  e.** sqlite3Btre
1f690 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1f6a0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
1f6b0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
1f6c0 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  nd should.** be 
1f6d0 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74 6f  invoked prior to
1f6e0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
1f6f0 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
1f700 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
1f710 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75 74  aseOne().** rout
1f720 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65 20  ine did all the 
1f730 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20  work of writing 
1f740 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20  information out 
1f750 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73  to disk and flus
1f760 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  hing the.** cont
1f770 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65  ents so that the
1f780 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e  y are written on
1f790 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74  to the disk plat
1f7a0 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a  ter.  All this.*
1f7b0 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f  * routine has to
1f7c0 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72   do is delete or
1f7d0 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65 72   truncate or zer
1f7e0 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e 20  o the header in 
1f7f0 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  the.** the rollb
1f800 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68 69  ack journal (whi
1f810 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
1f820 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
1f830 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f 70  mit) and.** drop
1f840 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f   locks..**.** No
1f850 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72  rmally, if an er
1f860 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
1f870 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
1f880 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74   is attempting t
1f890 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20 74  o .** finalize t
1f8a0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a 6f  he underlying jo
1f8b0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69 73  urnal file, this
1f8c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1f8d0 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a 2a  s an error and.*
1f8e0 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  * the upper laye
1f8f0 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20 61  r will attempt a
1f900 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65 76   rollback. Howev
1f910 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  er, if the secon
1f920 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73  d argument.** is
1f930 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20 74   non-zero then t
1f940 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e 73  his b-tree trans
1f950 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  action is part o
1f960 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 0a  f a multi-file .
1f970 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1f980 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68  In this case, th
1f990 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1f9a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1f9b0 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62 79  ommitted .** (by
1f9c0 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73 74   deleting a mast
1f9d0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er journal file)
1f9e0 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72 20   and the caller 
1f9f0 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69 73  will ignore this
1fa00 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 72   .** functions r
1fa10 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c 20  eturn code. So, 
1fa20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72  even if an error
1fa30 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 70   occurs in the p
1fa40 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20 72  ager layer,.** r
1fa50 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65 20  eset the b-tree 
1fa60 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61 6c  objects internal
1fa70 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63 61   state to indica
1fa80 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69 74  te that the writ
1fa90 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
1faa0 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65 64   has been closed
1fab0 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65 20  . This is quite 
1fac0 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61 67  safe, as the pag
1fad0 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a 20  er will have.** 
1fae0 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f 20  transitioned to 
1faf0 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
1fb00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
1fb10 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
1fb20 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
1fb30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
1fb40 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
1fb50 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
1fb60 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
1fb70 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
1fb80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fb90 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1fba0 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  Two(Btree *p, in
1fbb0 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20 20  t bCleanup){..  
1fbc0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1fbd0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65 74  TRANS_NONE ) ret
1fbe0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1fbf0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1fc00 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e  er(p);.  btreeIn
1fc10 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
1fc20 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1fc30 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e  has a write-tran
1fc40 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f  saction open, co
1fc50 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d  mmit the shared-
1fc60 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61  btrees .  ** tra
1fc70 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74  nsaction and set
1fc80 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1fc90 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e  e to TRANS_READ.
1fca0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69  .  */.  if( p->i
1fcb0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
1fcc0 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ITE ){.    int r
1fcd0 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  c;.    BtShared 
1fce0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1fcf0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
1fd00 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
1fd10 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
1fd20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
1fd30 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b  Transaction>0 );
1fd40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1fd50 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
1fd60 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65 72  eTwo(pBt->pPager
1fd70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1fd80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c 65  QLITE_OK && bCle
1fd90 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  anup==0 ){.     
1fda0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1fdb0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74  ve(p);.      ret
1fdc0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1fdd0 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69 6f    p->iDataVersio
1fde0 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e 73  n--;  /* Compens
1fdf0 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d 3e  ate for pPager->
1fe00 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b 20  iDataVersion++; 
1fe10 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  */.    pBt->inTr
1fe20 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1fe30 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72 65  S_READ;.    btre
1fe40 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74  eClearHasContent
1fe50 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  (pBt);.  }..  bt
1fe60 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f  reeEndTransactio
1fe70 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  n(p);.  sqlite3B
1fe80 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1fe90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1fea0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f  ;.}../*.** Do bo
1feb0 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20 63  th phases of a c
1fec0 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ommit..*/.int sq
1fed0 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1fee0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1fef0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
1ff00 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1ff10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ff20 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
1ff30 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  p, 0);.  if( rc=
1ff40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ff50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1ff60 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1ff70 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  o(p, 0);.  }.  s
1ff80 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1ff90 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
1ffa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ffb0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
1ffc0 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
1ffd0 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
1ffe0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
1fff0 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
20000 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79 20  y cursor on any 
20010 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
20020 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
20030 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20 77  es.  Or if the w
20040 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69 73  riteOnly flag is
20050 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e 20   set to 1, then 
20060 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72 69  only.** trip wri
20070 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20 6c  te cursors and l
20080 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f 72  eave read cursor
20090 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  s unchanged..**.
200a0 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20  ** Every cursor 
200b0 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 74  is a candidate t
200c0 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69 6e  o be tripped, in
200d0 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73 0a  cluding cursors.
200e0 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ** that belong t
200f0 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  o other database
20100 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61   connections tha
20110 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a 2a  t happen to be.*
20120 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63 61  * sharing the ca
20130 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65 2e  che with pBtree.
20140 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
20150 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64 20  ine gets called 
20160 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20  when a rollback 
20170 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20 77  occurs. If the w
20180 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61 67  riteOnly.** flag
20190 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
201a0 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f 72  nly write-cursor
201b0 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70 65  s need be trippe
201c0 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a 2a  d - read-only.**
201d0 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74 68   cursors save th
201e0 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73 69  eir current posi
201f0 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74 68  tions so that th
20200 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65 20  ey may continue 
20210 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  .** following th
20220 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c 20  e rollback. Or, 
20230 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20  if writeOnly is 
20240 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73 6f  false, all curso
20250 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70 70  rs are .** tripp
20260 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c 20  ed. In general, 
20270 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
20280 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  se if the transa
20290 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20 72  ction being.** r
202a0 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69 66  olled back modif
202b0 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ied the database
202c0 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69 73   schema. In this
202d0 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f 6f   case b-tree roo
202e0 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20 62  t.** pages may b
202f0 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65 74  e moved or delet
20300 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ed from the data
20310 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72 2c  base altogether,
20320 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75 6e   making.** it un
20330 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63 75  safe for read cu
20340 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e 75  rsors to continu
20350 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
20360 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
20370 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65 72  s true and an er
20380 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
20390 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61 76  ed while .** sav
203a0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
203b0 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72 65  position of a re
203c0 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c 20  ad-only cursor, 
203d0 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a 2a  all cursors, .**
203e0 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20 72   including all r
203f0 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65 20  ead-cursors are 
20400 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  tripped..**.** S
20410 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
20420 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73 66  rned if successf
20430 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  ul, or if an err
20440 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 0a  or occurs while.
20450 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72 73  ** saving a curs
20460 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e 20  or position, an 
20470 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
20480 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
20490 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
204a0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
204b0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 2c  ee, int errCode,
204c0 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b   int writeOnly){
204d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
204e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
204f0 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
20500 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 7c   (writeOnly==0 |
20510 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29 20  | writeOnly==1) 
20520 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61  && BTCF_WriteFla
20530 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 42  g==1 );.  if( pB
20540 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  tree ){.    sqli
20550 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
20560 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28 70  tree);.    for(p
20570 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
20580 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
20590 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e 74  Next){.      int
205a0 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77 72   i;.      if( wr
205b0 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e 63  iteOnly && (p->c
205c0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
205d0 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b 0a  riteFlag)==0 ){.
205e0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65          if( p->e
205f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
20600 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74 65  LID || p->eState
20610 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  ==CURSOR_SKIPNEX
20620 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  T ){.          r
20630 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50 6f  c = saveCursorPo
20640 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20  sition(p);.     
20650 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20660 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20670 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c 69        (void)sqli
20680 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
20690 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20 72  ursors(pBtree, r
206a0 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  c, 0);.         
206b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
206c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
206d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
206e0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
206f0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29 3b  eClearCursor(p);
20700 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74 61  .        p->eSta
20710 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c  te = CURSOR_FAUL
20720 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 6b  T;.        p->sk
20730 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64 65  ipNext = errCode
20740 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
20750 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69  for(i=0; i<=p->i
20760 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
20770 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
20780 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  p->apPage[i]);. 
20790 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67 65         p->apPage
207a0 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [i] = 0;.      }
207b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
207c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
207d0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
207e0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
207f0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
20800 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
20810 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ress..**.** If t
20820 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53  ripCode is not S
20830 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63 75  QLITE_OK then cu
20840 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
20850 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70 70  validated (tripp
20860 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69  ed)..** Only wri
20870 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 74  te cursors are t
20880 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65 4f  ripped if writeO
20890 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74 20  nly is true but 
208a0 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 0a  all cursors are.
208b0 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77 72  ** tripped if wr
208c0 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65  iteOnly is false
208d0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
208e0 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70 70  o use.** a tripp
208f0 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 72  ed cursor will r
20900 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
20910 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
20920 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
20930 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
20940 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20950 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
20960 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
20970 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
20980 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
20990 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
209a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
209b0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74 72  Btree *p, int tr
209c0 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69 74  ipCode, int writ
209d0 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  eOnly){.  int rc
209e0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
209f0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65  t = p->pBt;.  Me
20a00 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a  mPage *pPage1;..
20a10 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65 4f    assert( writeO
20a20 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65 4f  nly==1 || writeO
20a30 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  nly==0 );.  asse
20a40 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  rt( tripCode==SQ
20a50 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
20a60 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65 3d  ACK || tripCode=
20a70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
20a80 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
20a90 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69 70  r(p);.  if( trip
20aa0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
20ab0 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69 70  ){.    rc = trip
20ac0 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43 75  Code = saveAllCu
20ad0 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29  rsors(pBt, 0, 0)
20ae0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 77  ;.    if( rc ) w
20af0 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  riteOnly = 0;.  
20b00 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
20b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
20b20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29 7b   if( tripCode ){
20b30 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 73  .    int rc2 = s
20b40 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41  qlite3BtreeTripA
20b50 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72 69  llCursors(p, tri
20b60 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c 79  pCode, writeOnly
20b70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
20b80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
20b90 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26 26  (writeOnly==0 &&
20ba0 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   rc2==SQLITE_OK)
20bb0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21   );.    if( rc2!
20bc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
20bd0 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74 72  = rc2;.  }.  btr
20be0 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
20bf0 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
20c00 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
20c10 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
20c20 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e      assert( TRAN
20c30 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e  S_WRITE==pBt->in
20c40 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20  Transaction );. 
20c50 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33     rc2 = sqlite3
20c60 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42  PagerRollback(pB
20c70 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
20c80 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
20c90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
20ca0 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   rc2;.    }..   
20cb0 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b   /* The rollback
20cc0 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f   may have destro
20cd0 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e  yed the pPage1->
20ce0 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f  aData value.  So
20cf0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74 72  .    ** call btr
20d00 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20 70  eeGetPage() on p
20d10 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20 6d  age 1 again to m
20d20 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
20d30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69 73  pPage1->aData is
20d40 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e 20   set correctly. 
20d50 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65 65  */.    if( btree
20d60 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20  GetPage(pBt, 1, 
20d70 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c  &pPage1, 0)==SQL
20d80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20d90 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74 34  int nPage = get4
20da0 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
20db0 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  ge1->aData);.   
20dc0 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61     testcase( nPa
20dd0 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ge==0 );.      i
20de0 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73 71  f( nPage==0 ) sq
20df0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
20e00 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
20e10 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &nPage);.      
20e20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e 6e  testcase( pBt->n
20e30 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a 20  Page!=nPage );. 
20e40 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
20e50 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20 72  = nPage;.      r
20e60 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
20e70 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  1);.    }.    as
20e80 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69 64  sert( countValid
20e90 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29 3d  Cursors(pBt, 1)=
20ea0 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  =0 );.    pBt->i
20eb0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54  nTransaction = T
20ec0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62  RANS_READ;.    b
20ed0 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
20ee0 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  ent(pBt);.  }.. 
20ef0 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63   btreeEndTransac
20f00 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74  tion(p);.  sqlit
20f10 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
20f20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20f30 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
20f40 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
20f50 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62  saction. The sub
20f60 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 20  transaction can 
20f70 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  be rolled.** bac
20f80 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
20f90 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
20fa0 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75 73  saction. You mus
20fb0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
20fc0 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72 65  ction .** before
20fd0 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74   starting a subt
20fe0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
20ff0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
21000 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69  s ended automati
21010 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68 65  cally .** if the
21020 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
21030 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c  n commits or rol
21040 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  ls back..**.** S
21050 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
21060 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
21070 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
21080 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
21090 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
210a0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
210b0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
210c0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
210d0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
210e0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
210f0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
21100 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
21110 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
21120 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
21130 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
21140 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
21150 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
21160 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
21170 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d 74   statement sub-t
21180 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69 6d  ransaction is im
21190 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e 20  plemented as an 
211a0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
211b0 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c 75  int. The.** valu
211c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
211d0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
211e0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75   is the total nu
211f0 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e  mber of savepoin
21200 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ts,.** including
21210 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f   the new anonymo
21220 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f 70  us savepoint, op
21230 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65 65  en on the B-Tree
21240 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65 0a  . i.e. if there.
21250 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
21260 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64 20   savepoints and 
21270 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  no other stateme
21280 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  nt-transactions 
21290 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65 6d  open,.** iStatem
212a0 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20 61  ent is 1. This a
212b0 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f 69  nonymous savepoi
212c0 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61 73  nt can be releas
212d0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
212e0 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73  k.** using the s
212f0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
21300 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e 2e  oint() function.
21310 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
21320 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42 74  treeBeginStmt(Bt
21330 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74 61  ree *p, int iSta
21340 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72  tement){.  int r
21350 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
21360 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
21370 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21380 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  (p);.  assert( p
21390 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
213a0 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65  _WRITE );.  asse
213b0 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
213c0 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
213d0 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  LY)==0 );.  asse
213e0 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e 30  rt( iStatement>0
213f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
21400 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e  tatement>p->db->
21410 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20  nSavepoint );.  
21420 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
21430 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
21440 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a 20  S_WRITE );.  /* 
21450 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65 76  At the pager lev
21460 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74 20  el, a statement 
21470 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
21480 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a   savepoint with.
21490 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72    ** an index gr
214a0 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73  eater than all s
214b0 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65  avepoints create
214c0 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69  d explicitly usi
214d0 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ng.  ** SQL stat
214e0 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69 6c  ements. It is il
214f0 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20 72  legal to open, r
21500 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61  elease or rollba
21510 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68  ck any.  ** such
21520 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69 6c   savepoints whil
21530 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  e the statement 
21540 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76 65  transaction save
21550 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65 2e  point is active.
21560 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
21570 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
21580 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
21590 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29 3b  er, iStatement);
215a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
215b0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
215c0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
215d0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
215e0 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
215f0 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77 61  ion, op, is alwa
21600 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  ys SAVEPOINT_ROL
21610 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56 45  LBACK.** or SAVE
21620 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 54  POINT_RELEASE. T
21630 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69 74  his function eit
21640 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72 20  her releases or 
21650 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a 2a  rolls back the.*
21660 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65 6e  * savepoint iden
21670 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
21680 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c 20  ter iSavepoint, 
21690 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  depending on the
216a0 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f 70   value .** of op
216b0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
216c0 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73 20  , iSavepoint is 
216d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
216e0 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20 48  equal to zero. H
216f0 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69 73  owever, if op is
21700 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  .** SAVEPOINT_RO
21710 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53 61  LLBACK, then iSa
21720 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73 6f  vepoint may also
21730 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73 20   be -1. In this 
21740 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  case the .** con
21750 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e 74  tents of the ent
21760 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ire transaction 
21770 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  are rolled back.
21780 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
21790 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f 72  nt.** from a nor
217a0 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  mal transaction 
217b0 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f 20  rollback, as no 
217c0 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61 73  locks are releas
217d0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74 72  ed and the.** tr
217e0 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69 6e  ansaction remain
217f0 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  s open..*/.int s
21800 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
21810 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  oint(Btree *p, i
21820 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65  nt op, int iSave
21830 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  point){.  int rc
21840 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
21850 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54 72  if( p && p->inTr
21860 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
21870 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
21880 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
21890 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
218a0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
218b0 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  E || op==SAVEPOI
218c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 20  NT_ROLLBACK );. 
218d0 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65     assert( iSave
218e0 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53 61  point>=0 || (iSa
218f0 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20 6f  vepoint==-1 && o
21900 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
21910 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73 71  LBACK) );.    sq
21920 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
21930 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  p);.    rc = sql
21940 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
21950 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
21960 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
21970 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
21980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21990 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c 30  if( iSavepoint<0
219a0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
219b0 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41 4c  gs & BTS_INITIAL
219c0 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b 0a  LY_EMPTY)!=0 ){.
219d0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61          pBt->nPa
219e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
219f0 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61        rc = newDa
21a00 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20  tabase(pBt);.   
21a10 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
21a20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70 42  get4byte(28 + pB
21a30 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
21a40 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  );..      /* The
21a50 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 77   database size w
21a60 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
21a70 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f 66  the offset 28 of
21a80 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20 20   the header.    
21a90 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74 72    ** when the tr
21aa0 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
21ab0 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74 68  d, so we know th
21ac0 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74 20  at the value at 
21ad0 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a 20  offset.      ** 
21ae0 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20 2a  28 is nonzero. *
21af0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
21b00 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b 0a  pBt->nPage>0 );.
21b10 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21b20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
21b30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21b40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
21b50 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f   a new cursor fo
21b60 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f 73  r the BTree whos
21b70 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  e root is on the
21b80 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e   page.** iTable.
21b90 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   If a read-only 
21ba0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
21bb0 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ted, it is assum
21bc0 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
21bd0 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68 61  aller already ha
21be0 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65 61  s at least a rea
21bf0 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69  d-only transacti
21c00 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74 68  on open.** on th
21c10 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65 61  e database alrea
21c20 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d 63  dy. If a write-c
21c30 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73 74  ursor is request
21c40 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ed, then.** the 
21c50 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d 65  caller is assume
21c60 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70 65  d to have an ope
21c70 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  n write transact
21c80 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72  ion..**.** If wr
21c90 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68  Flag==0, then th
21ca0 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c  e cursor can onl
21cb0 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72 65  y be used for re
21cc0 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46  ading..** If wrF
21cd0 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65  lag==1, then the
21ce0 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 75   cursor can be u
21cf0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20  sed for reading 
21d00 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e  or for.** writin
21d10 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
21d20 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
21d30 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20  g are also met. 
21d40 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74 68   These.** are th
21d50 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
21d60 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
21d70 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74 69   order for writi
21d80 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f  ng to.** be allo
21d90 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
21da0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
21db0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
21dc0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a  with wrFlag==1.*
21dd0 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20 64  *.** 2:  Other d
21de0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21df0 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20 74  ons that share t
21e00 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63 61  he same pager ca
21e10 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20 77  che.**     but w
21e20 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e 20  hich are not in 
21e30 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49  the READ_UNCOMMI
21e40 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20 6e  TTED state may n
21e50 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 63  ot have.**     c
21e60 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74 68  ursors open with
21e70 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68   wrFlag==0 on th
21e80 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f  e same table.  O
21e90 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20 20  therwise.**     
21ea0 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65  the changes made
21eb0 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20 63   by this write c
21ec0 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20 76  ursor would be v
21ed0 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20  isible to.**    
21ee0 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f 72   the read cursor
21ef0 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20 64  s in the other d
21f00 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21f10 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68  on..**.** 3:  Th
21f20 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
21f30 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f 74  be writable (not
21f40 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65   on read-only me
21f50 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54  dia).**.** 4:  T
21f60 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e 20  here must be an 
21f70 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69  active transacti
21f80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  on..**.** No che
21f90 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
21fa0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
21fb0 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
21fc0 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
21fd0 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
21fe0 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
21ff0 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
22000 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
22010 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
22020 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
22030 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
22040 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
22050 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
22060 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
22070 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
22080 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
22090 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
220a0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
220b0 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
220c0 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
220d0 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
220e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22100 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
22110 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
22140 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
22150 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
22160 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22180 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
22190 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
221a0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
221b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
221c0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
221d0 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
221e0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
221f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
22220 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
22230 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
22240 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
22250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22260 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
22270 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
22280 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222a0 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
222b0 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
222c0 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
222d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
222e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
222f0 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22300 30 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 31 20 29  0 || wrFlag==1 )
22310 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
22320 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
22330 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
22340 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
22350 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
22360 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
22370 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
22380 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
22390 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
223a0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
223b0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
223c0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
223d0 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
223e0 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
223f0 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
22400 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
22410 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
22420 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
22430 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 77  , pKeyInfo!=0, w
22440 72 46 6c 61 67 2b 31 29 20 29 3b 0a 20 20 61 73  rFlag+1) );.  as
22450 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22460 7c 7c 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c  || !hasReadConfl
22470 69 63 74 73 28 70 2c 20 69 54 61 62 6c 65 29 20  icts(p, iTable) 
22480 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
22490 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
224a0 68 61 73 20 6f 70 65 6e 65 64 20 74 68 65 20 72  has opened the r
224b0 65 71 75 69 72 65 64 20 74 72 61 6e 73 61 63 74  equired transact
224c0 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ion. */.  assert
224d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
224e0 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73  NS_NONE );.  ass
224f0 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c  ert( wrFlag==0 |
22500 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  | p->inTrans==TR
22510 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
22520 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
22530 65 31 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  e1 && pBt->pPage
22540 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73  1->aData );.  as
22550 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20  sert( wrFlag==0 
22560 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
22570 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
22580 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  Y)==0 );..  if( 
22590 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 6c  wrFlag ){.    al
225a0 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28  locateTempSpace(
225b0 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 70 42  pBt);.    if( pB
225c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d 3d 30 20  t->pTmpSpace==0 
225d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
225e0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
225f0 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74   iTable==1 && bt
22600 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
22610 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  )==0 ){.    asse
22620 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b  rt( wrFlag==0 );
22630 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b  .    iTable = 0;
22640 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74  .  }..  /* Now t
22650 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72  hat no other err
22660 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66  ors can occur, f
22670 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e  inish filling in
22680 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20   the BtCursor.  
22690 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64  ** variables and
226a0 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
226b0 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
226c0 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70  ed list.  */.  p
226d0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20  Cur->pgnoRoot = 
226e0 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20  (Pgno)iTable;.  
226f0 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31  pCur->iPage = -1
22700 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ;.  pCur->pKeyIn
22710 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
22720 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
22730 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
22740 20 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20   pBt;.  assert( 
22750 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46  wrFlag==0 || wrF
22760 6c 61 67 3d 3d 42 54 43 46 5f 57 72 69 74 65 46  lag==BTCF_WriteF
22770 6c 61 67 20 29 3b 0a 20 20 70 43 75 72 2d 3e 63  lag );.  pCur->c
22780 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
22790 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
227a0 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
227b0 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
227c0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
227d0 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
227e0 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
227f0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
22800 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
22810 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
22820 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
22830 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
22840 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
22850 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
22860 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
22870 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
22880 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
22890 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
228a0 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
228b0 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
228c0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
228d0 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
228e0 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
228f0 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
22900 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
22910 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
22920 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
22930 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
22940 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
22950 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
22960 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
22970 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229a0 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
229b0 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229e0 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
229f0 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
22a00 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
22a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22a30 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
22a40 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
22a50 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
22a60 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
22a70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
22a80 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
22a90 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
22aa0 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22ad0 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
22ae0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
22af0 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
22b00 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22b10 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
22b30 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22b40 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
22b50 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
22b60 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
22b70 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
22b80 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22b90 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
22ba0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22bb0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
22bc0 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
22bd0 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
22be0 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
22bf0 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
22c00 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
22c10 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
22c20 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
22c30 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
22c40 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
22c50 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
22c60 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
22c70 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
22c80 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
22c90 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
22ca0 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
22cb0 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
22cc0 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
22cd0 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22ce0 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
22cf0 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
22d00 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
22d10 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
22d20 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
22d30 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
22d40 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
22d50 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
22d60 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
22d70 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
22d80 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
22d90 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
22da0 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
22db0 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
22dc0 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
22dd0 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
22de0 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
22df0 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
22e00 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
22e10 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
22e20 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
22e30 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
22e40 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
22e50 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
22e60 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
22e70 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
22e80 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
22e90 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
22ea0 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
22eb0 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
22ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
22ed0 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
22ee0 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
22ef0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
22f00 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
22f10 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
22f20 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
22f30 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
22f40 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
22f50 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
22f60 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
22f70 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
22f80 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
22f90 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
22fa0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
22fb0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
22fc0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
22fd0 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
22fe0 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
22ff0 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
23000 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
23010 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
23020 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
23030 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
23040 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
23050 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
23060 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
23070 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
23080 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
23090 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
230a0 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
230b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
230c0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
230d0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
230e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
230f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
23100 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
23110 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
23120 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
23130 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
23140 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
23150 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
23160 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
23170 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
23180 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
23190 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
231a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
231b0 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
231c0 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
231d0 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
231e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
231f0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
23200 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23220 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
23230 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
23240 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
23250 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
23260 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
23270 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
23280 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
23290 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
232a0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
232b0 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
232c0 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
232d0 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
232e0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
232f0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
23300 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
23310 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
23320 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
23330 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
23340 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
23350 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
23360 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
23370 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
23380 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
23390 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
233a0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
233b0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
233c0 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
233d0 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
233e0 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
233f0 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
23400 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
23410 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
23420 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
23430 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
23440 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
23450 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
23460 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
23470 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
23480 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
23490 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
234a0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
234b0 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
234c0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
234d0 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  {.  if( pCur->in
234e0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
234f0 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
23500 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
23510 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
23520 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
23530 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
23540 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
23550 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
23560 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
23570 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
23580 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c  e{.    assertCel
23590 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d  lInfo(pCur);.  }
235a0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
235b0 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
235c0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
235d0 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
235e0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
235f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
23600 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
23610 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
23620 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
23630 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
23640 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
23650 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
23660 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
23670 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
23680 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
23690 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
236a0 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
236b0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
236c0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
236d0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
236e0 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
236f0 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
23700 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
23710 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23720 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
23730 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  EBUG */../*.** S
23740 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
23750 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
23760 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  fer needed to ho
23770 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ld the value of.
23780 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74  ** the key for t
23790 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
237a0 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
237b0 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
237c0 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65  .** to a valid e
237d0 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20  ntry, *pSize is 
237e0 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  set to 0. .**.**
237f0 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74   For a table wit
23800 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61  h the INTKEY fla
23810 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74  g set, this rout
23820 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
23830 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e  key.** itself, n
23840 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
23850 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
23860 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
23870 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f  ler must positio
23880 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69  n the cursor pri
23890 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
238a0 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
238b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
238c0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49   cannot fail.  I
238d0 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
238e0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f   SQLITE_OK.  .*/
238f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23900 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
23910 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
23920 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
23930 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
23940 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23950 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
23960 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
23970 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
23980 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
23990 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
239a0 79 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  y;.  return SQLI
239b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
239c0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
239d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
239e0 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
239f0 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
23a00 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
23a10 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
23a20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
23a30 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
23a40 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
23a50 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e  nting to a non-N
23a60 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74  ULL.** valid ent
23a70 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
23a80 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  rds, the calling
23a90 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
23aa0 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61  guarantee.** tha
23ab0 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  t the cursor has
23ac0 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d   Cursor.eState==
23ad0 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
23ae0 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
23af0 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  ot possible.  Th
23b00 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
23b10 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
23b20 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68  E_OK..** It migh
23b30 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62  t just as well b
23b40 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72  e a procedure (r
23b50 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62  eturning void) b
23b60 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a  ut we continue.*
23b70 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69  * to return an i
23b80 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f  nteger result co
23b90 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  de for historica
23ba0 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e  l reasons..*/.in
23bb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
23bc0 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
23bd0 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
23be0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
23bf0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
23c00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
23c10 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
23c20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
23c30 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
23c40 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73  iPage>=0 );.  as
23c50 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
23c60 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  e<BTCURSOR_MAX_D
23c70 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  EPTH );.  assert
23c80 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
23c90 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74  Cur->iPage]->int
23ca0 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20  KeyLeaf==1 );.  
23cb0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
23cc0 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43  );.  *pSize = pC
23cd0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
23ce0 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  d;.  return SQLI
23cf0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23d00 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
23d10 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
23d20 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
23d30 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
23d40 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
23d50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
23d60 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
23d70 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
23d80 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
23d90 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
23da0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
23db0 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
23dc0 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
23dd0 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
23de0 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
23df0 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
23e00 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
23e10 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
23e20 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
23e30 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
23e40 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
23e50 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
23e60 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
23e70 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23e80 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
23e90 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
23ea0 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
23eb0 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
23ec0 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
23ed0 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
23ee0 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
23ef0 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
23f00 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
23f10 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
23f20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
23f30 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
23f40 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
23f50 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
23f60 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
23f70 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
23f80 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
23f90 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
23fa0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
23fb0 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
23fc0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
23fd0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
23fe0 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
23ff0 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
24000 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
24010 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
24020 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
24030 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
24040 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
24050 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
24060 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
24070 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
24080 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
24090 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
240a0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
240b0 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
240c0 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
240d0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
240e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
240f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
24100 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20    Pgno ovfl,    
24110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24120 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c  * Current overfl
24130 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
24140 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70  /.  MemPage **pp
24150 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
24160 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65   /* OUT: MemPage
24170 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20   handle (may be 
24180 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20  NULL) */.  Pgno 
24190 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20  *pPgnoNext      
241a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
241b0 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  Next overflow pa
241c0 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a  ge number */.){.
241d0 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b    Pgno next = 0;
241e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
241f0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  e = 0;.  int rc 
24200 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
24210 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
24220 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
24230 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
24240 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a  rt(pPgnoNext);..
24250 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
24260 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
24270 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
24280 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
24290 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
242a0 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  st using the.  *
242b0 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69  * autovacuum poi
242c0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20  nter-map pages. 
242d0 47 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e  Guess that the n
242e0 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a  ext page in .  *
242f0 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c  * the overflow l
24300 69 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62  ist is page numb
24310 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20  er (ovfl+1). If 
24320 74 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73  that guess turns
24330 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65   .  ** out to be
24340 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63   wrong, fall bac
24350 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65  k to loading the
24360 20 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20   data of page . 
24370 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20   ** number ovfl 
24380 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
24390 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65   next page numbe
243a0 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  r..  */.  if( pB
243b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
243c0 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  .    Pgno pgno;.
243d0 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20      Pgno iGuess 
243e0 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38  = ovfl+1;.    u8
243f0 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69   eType;..    whi
24400 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
24410 45 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c  E(pBt, iGuess) |
24420 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e  | iGuess==PENDIN
24430 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
24440 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73   ){.      iGuess
24450 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ++;.    }..    i
24460 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65  f( iGuess<=btree
24470 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
24480 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  {.      rc = ptr
24490 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65  mapGet(pBt, iGue
244a0 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e  ss, &eType, &pgn
244b0 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
244c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65  ==SQLITE_OK && e
244d0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
244e0 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d  RFLOW2 && pgno==
244f0 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  ovfl ){.        
24500 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20  next = iGuess;. 
24510 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24520 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  TE_DONE;.      }
24530 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
24540 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78  f..  assert( nex
24550 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  t==0 || rc==SQLI
24560 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28  TE_DONE );.  if(
24570 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24580 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  {.    rc = btree
24590 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66  GetPage(pBt, ovf
245a0 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61  l, &pPage, (ppPa
245b0 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47  ge==0) ? PAGER_G
245c0 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29  ET_READONLY : 0)
245d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
245e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
245f0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Page==0 );.    i
24600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
24610 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d   ){.      next =
24620 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d   get4byte(pPage-
24630 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20  >aData);.    }. 
24640 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74   }..  *pPgnoNext
24650 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70   = next;.  if( p
24660 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70  pPage ){.    *pp
24670 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
24680 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61  }else{.    relea
24690 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
246a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d   }.  return (rc=
246b0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53  =SQLITE_DONE ? S
246c0 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a  QLITE_OK : rc);.
246d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
246e0 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
246f0 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
24700 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
24710 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
24720 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
24730 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
24740 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
24750 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
24760 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
24770 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
24780 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
24790 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
247a0 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
247b0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
247c0 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
247d0 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
247e0 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
247f0 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
24800 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
24810 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
24820 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
24830 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
24840 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
24850 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
24860 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
24870 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
24880 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
24890 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
248a0 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
248b0 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
248c0 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
248d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
248e0 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
248f0 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
24900 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
24910 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
24920 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
24930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24940 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
24950 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
24960 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
24970 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
24980 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
24990 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
249a0 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
249b0 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
249c0 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
249d0 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
249e0 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
249f0 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
24a00 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
24a10 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
24a20 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
24a30 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
24a40 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
24a50 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
24a60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24a70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24a80 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
24a90 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
24aa0 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
24ab0 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
24ac0 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
24ad0 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
24ae0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
24af0 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
24b00 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
24b10 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
24b20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
24b30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24b40 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
24b50 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
24b60 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
24b70 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
24b80 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
24b90 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
24ba0 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61  to. The eOp.** a
24bb0 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72  rgument is inter
24bc0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
24bd0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68  s:.**.**   0: Th
24be0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
24bf0 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20   read. Populate 
24c00 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
24c10 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20  he..**   1: The 
24c20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77  operation is a w
24c30 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74  rite. Populate t
24c40 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
24c50 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f  e..**   2: The o
24c60 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65  peration is a re
24c70 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c  ad. Do not popul
24c80 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ate the overflow
24c90 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20   cache..**.** A 
24ca0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
24cb0 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
24cc0 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
24cd0 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
24ce0 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
24cf0 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
24d00 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
24d10 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65  * The content be
24d20 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74  ing read or writ
24d30 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72  ten might appear
24d40 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67   on the main pag
24d50 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74  e.** or be scatt
24d60 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
24d70 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  iple overflow pa
24d80 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
24d90 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
24da0 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20   entry uses one 
24db0 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77  or more overflow
24dc0 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a   pages and the.*
24dd0 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69  * eOp argument i
24de0 73 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75  s not 2, this fu
24df0 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63  nction may alloc
24e00 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ate space for an
24e10 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70  d lazily .** pop
24e20 75 6c 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  ulates the overf
24e30 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
24e40 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72  che array (BtCur
24e50 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20  sor.aOverflow). 
24e60 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
24e70 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61  alls use this ca
24e80 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
24e90 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
24ea0 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d  ied offset .** m
24eb0 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
24ec0 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
24ed0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
24ee0 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
24ef0 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
24f00 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
24f10 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
24f20 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
24f30 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
24f40 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
24f50 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
24f60 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
24f70 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
24f80 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
24f90 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
24fa0 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
24fb0 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
24fc0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
24fd0 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
24fe0 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
24ff0 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
25000 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
25010 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
25020 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
25030 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
25040 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
25050 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
25060 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
25070 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
25080 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
25090 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
250a0 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
250b0 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
250c0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73  om */.  u32 offs
250d0 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
250e0 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
250f0 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
25100 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74  oad */.  u32 amt
25110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
25120 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
25130 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
25140 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
25150 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
25160 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
25170 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f  fer */ .  int eO
25180 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
25190 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20  * zero to read. 
251a0 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74  non-zero to writ
251b0 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  e. */.){.  unsig
251c0 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
251d0 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ad;.  int rc = S
251e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
251f0 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
25200 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
25210 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
25220 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
25230 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
25240 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
25250 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
25260 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
25270 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
25280 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
25290 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65  ongs to */.#ifde
252a0 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
252b0 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
252c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20  unsigned char * 
252d0 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20  const pBufStart 
252e0 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45  = pBuf;.  int bE
252f0 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nd;             
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25310 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72      /* True if r
25320 65 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66  eading to end of
25330 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a   data */.#endif.
25340 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
25350 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
25360 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
25370 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
25380 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
25390 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
253a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
253b0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
253c0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
253d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70  );.  assert( eOp
253e0 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30  !=2 || offset==0
253f0 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73   );    /* Always
25400 20 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69   start from begi
25410 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32  nning for eOp==2
25420 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e   */..  getCellIn
25430 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79  fo(pCur);.  aPay
25440 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66  load = pCur->inf
25450 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64  o.pPayload;.#ifd
25460 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
25470 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
25480 20 62 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61   bEnd = offset+a
25490 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  mt==pCur->info.n
254a0 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a  Payload;.#endif.
254b0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
254c0 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e  +amt <= pCur->in
254d0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a  fo.nPayload );..
254e0 20 20 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b    if( &aPayload[
254f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25500 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61  l] > &pPage->aDa
25510 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ta[pBt->usableSi
25520 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ze] ){.    /* Tr
25530 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
25540 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
25550 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
25560 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
25570 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
25580 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
25590 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  }..  /* Check if
255a0 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65   data must be re
255b0 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72  ad/written to/fr
255c0 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67  om the btree pag
255d0 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69  e itself. */.  i
255e0 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e  f( offset<pCur->
255f0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
25600 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
25610 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74      if( a+offset
25620 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  >pCur->info.nLoc
25630 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20  al ){.      a = 
25640 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25650 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  l - offset;.    
25660 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50  }.    rc = copyP
25670 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
25680 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
25690 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c  a, (eOp & 0x01),
256a0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
256b0 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
256c0 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
256d0 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
256e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
256f0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
25700 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20  .nLocal;.  }... 
25710 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25720 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20  OK && amt>0 ){. 
25730 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66     const u32 ovf
25740 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  lSize = pBt->usa
25750 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a  bleSize - 4;  /*
25760 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70   Bytes content p
25770 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a  er ovfl page */.
25780 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67      Pgno nextPag
25790 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65  e;..    nextPage
257a0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61   = get4byte(&aPa
257b0 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f  yload[pCur->info
257c0 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20  .nLocal]);..    
257d0 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  /* If the BtCurs
257e0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68  or.aOverflow[] h
257f0 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
25800 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
25810 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45  it now..    ** E
25820 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c  xcept, do not al
25830 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77  locate aOverflow
25840 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20  [] for eOp==2.. 
25850 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
25860 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
25870 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f  ay is sized at o
25880 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63  ne entry for eac
25890 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  h overflow page.
258a0 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76      ** in the ov
258b0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
258c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
258d0 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
258e0 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20  low page is.    
258f0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76  ** stored in aOv
25900 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20  erflow[0], etc. 
25910 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20  A value of 0 in 
25920 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20  the aOverflow[] 
25930 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61  array.    ** mea
25940 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77  ns "not yet know
25950 6e 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73  n" (the cache is
25960 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65   lazily populate
25970 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
25980 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43  f( eOp!=2 && (pC
25990 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
259a0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
259b0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
259c0 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e  Ovfl = (pCur->in
259d0 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72  fo.nPayload-pCur
259e0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76  ->info.nLocal+ov
259f0 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69  flSize-1)/ovflSi
25a00 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  ze;.      if( nO
25a10 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41  vfl>pCur->nOvflA
25a20 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20  lloc ){.        
25a30 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67  Pgno *aNew = (Pg
25a40 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c  no*)sqlite3Reall
25a50 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  oc(.            
25a60 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c  pCur->aOverflow,
25a70 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28   nOvfl*2*sizeof(
25a80 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
25a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65  .        if( aNe
25aa0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
25ab0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
25ac0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  MEM;.        }el
25ad0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43  se{.          pC
25ae0 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d  ur->nOvflAlloc =
25af0 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20   nOvfl*2;.      
25b00 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
25b10 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  low = aNew;.    
25b20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25b30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25b40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25b50 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f   memset(pCur->aO
25b60 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66  verflow, 0, nOvf
25b70 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b  l*sizeof(Pgno));
25b80 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
25b90 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
25ba0 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20  ValidOvfl;.     
25bb0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
25bc0 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   If the overflow
25bd0 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
25be0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
25bf0 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20  ted and the.    
25c00 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ** entry for the
25c10 20 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20   first required 
25c20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
25c30 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20   valid, skip.   
25c40 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20   ** directly to 
25c50 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
25c60 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
25c70 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
25c80 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20  vfl)!=0.     && 
25c90 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
25ca0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d  offset/ovflSize]
25cb0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49  .    ){.      iI
25cc0 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66  dx = (offset/ovf
25cd0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65  lSize);.      ne
25ce0 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  xtPage = pCur->a
25cf0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a  Overflow[iIdx];.
25d00 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28        offset = (
25d10 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29  offset%ovflSize)
25d20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
25d30 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
25d40 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
25d50 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
25d60 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65  ..      /* If re
25d70 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65  quired, populate
25d80 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25d90 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a  ge-list cache. *
25da0 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75  /.      if( (pCu
25db0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
25dc0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30  CF_ValidOvfl)!=0
25dd0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
25de0 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
25df0 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
25e00 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
25e10 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
25e20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
25e30 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
25e40 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
25e50 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
25e60 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
25e70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
25e80 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
25e90 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
25ea0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
25eb0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
25ec0 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
25ed0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
25ee0 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
25ef0 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
25f00 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
25f10 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
25f20 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
25f30 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
25f40 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
25f50 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
25f60 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
25f70 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
25f80 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
25f90 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
25fa0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
25fb0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
25fc0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
25fd0 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63  ay must be alloc
25fe0 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f 70  ated because eOp
25ff0 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68  !=2.        ** h
26000 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c  ere.  If eOp==2,
26010 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20   then offset==0 
26020 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68 20  and this branch 
26030 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a  is never taken..
26040 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26050 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d     assert( eOp!=
26060 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  2 );.        ass
26070 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c  ert( pCur->curFl
26080 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
26090 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  Ovfl );.        
260a0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42  assert( pCur->pB
260b0 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64  tree->db==pBt->d
260c0 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  b );.        if(
260d0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
260e0 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20  [iIdx+1] ){.    
260f0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
26100 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
26110 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20  [iIdx+1];.      
26120 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26130 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66     rc = getOverf
26140 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78  lowPage(pBt, nex
26150 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50  tPage, 0, &nextP
26160 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
26170 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
26180 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
26190 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
261a0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
261b0 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
261c0 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
261d0 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
261e0 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
261f0 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
26200 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
26210 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
26220 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
26230 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
26240 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
26250 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c  READ.        sql
26260 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23  ite3_file *fd;.#
26270 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e  endif.        in
26280 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20  t a = amt;.     
26290 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
262a0 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
262b0 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
262c0 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
262d0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64  .        }..#ifd
262e0 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54  ef SQLITE_DIRECT
262f0 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20  _OVERFLOW_READ. 
26300 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c         /* If all
26310 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
26320 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20  re true:.       
26330 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20   **.        **  
26340 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72 65   1) this is a re
26350 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e  ad operation, an
26360 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  d .        **   
26370 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75 69  2) data is requi
26380 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  red from the sta
26390 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66  rt of this overf
263a0 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20  low page, and.  
263b0 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68        **   3) th
263c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66 69  e database is fi
263d0 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20  le-backed, and. 
263e0 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74         **   4) t
263f0 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20  here is no open 
26400 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
26410 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  n, and.        *
26420 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61 62  *   5) the datab
26430 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c  ase is not a WAL
26440 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20   database,.     
26450 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64     **   6) all d
26460 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ata from the pag
26470 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e  e is being read.
26480 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29  .        **   7)
26490 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65   at least 4 byte
264a0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
264b0 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68  een read into th
264c0 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 20  e output buffer 
264d0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
264e0 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61      ** then data
264f0 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69 72   can be read dir
26500 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64  ectly from the d
26510 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74  atabase file int
26520 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
26530 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c 20   output buffer, 
26540 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70 61  bypassing the pa
26550 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74  ge-cache altoget
26560 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64 73  her. This speeds
26570 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c  .        ** up l
26580 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63  oading large rec
26590 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d  ords that span m
265a0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
265b0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
265c0 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70 26         if( (eOp&
265d0 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20  0x01)==0        
265e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26600 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (1) */.        
26610 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20   && offset==0   
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26640 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f         /* (2) */
26650 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62 45  .         && (bE
26660 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a  nd || a==ovflSiz
26670 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e)              
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26690 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20  /* (6) */.      
266a0 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61     && pBt->inTra
266b0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
266c0 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20 20  READ            
266d0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20           /* (4) 
266e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  */.         && (
266f0 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  fd = sqlite3Page
26700 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65  rFile(pBt->pPage
26710 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20  r))->pMethods   
26720 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20    /* (3) */.    
26730 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61       && pBt->pPa
26740 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d  ge1->aData[19]==
26750 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20 20  0x01            
26760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35             /* (5
26770 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26780 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66   &pBuf[-4]>=pBuf
26790 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20 20  Start           
267a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267b0 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20      /* (7) */.  
267c0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
267d0 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a     u8 aSave[4];.
267e0 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61 57            u8 *aW
267f0 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d  rite = &pBuf[-4]
26800 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
26810 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66  rt( aWrite>=pBuf
26820 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20 20  Start );        
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26840 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f   /* hence (7) */
26850 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
26860 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c  y(aSave, aWrite,
26870 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72   4);.          r
26880 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
26890 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b  d(fd, aWrite, a+
268a0 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67  4, (i64)pBt->pag
268b0 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d  eSize*(nextPage-
268c0 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  1));.          n
268d0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
268e0 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20  te(aWrite);.    
268f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72        memcpy(aWr
26900 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a  ite, aSave, 4);.
26910 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65          }else.#e
26920 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a  ndif..        {.
26930 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65            DbPage
26940 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
26950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26960 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42  3PagerAcquire(pB
26970 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
26980 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20  age, &pDbPage,. 
26990 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65               ((e
269a0 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41  Op&0x01)==0 ? PA
269b0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
269c0 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   : 0).          
269d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
269e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
269f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50  {.            aP
26a00 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
26a10 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
26a20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
26a30 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
26a40 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
26a50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26a60 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
26a70 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
26a80 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  4], pBuf, a, (eO
26a90 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67 65  p&0x01), pDbPage
26aa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
26ab0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26ac0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
26ad0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
26ae0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
26af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b00 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
26b10 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
26b20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26b30 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26b40 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
26b50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26b60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26b70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
26b90 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
26ba0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26bb0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
26bc0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
26bd0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
26be0 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
26bf0 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
26c00 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
26c10 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
26c20 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
26c30 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
26c40 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
26c50 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
26c60 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
26c70 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
26c80 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
26c90 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
26ca0 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
26cb0 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
26cc0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26cd0 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
26ce0 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
26cf0 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
26d00 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
26d10 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
26d20 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
26d30 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
26d40 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
26d50 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
26d60 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26d70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26d80 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26d90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
26da0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26db0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
26dc0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26dd0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
26de0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
26df0 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
26e00 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26e10 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
26e20 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
26e30 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
26e40 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
26e50 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
26e60 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
26e70 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
26e80 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
26e90 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
26ea0 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
26eb0 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
26ec0 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
26ed0 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
26ee0 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
26ef0 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
26f00 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
26f10 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
26f20 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
26f30 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
26f40 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
26f50 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
26f60 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
26f70 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
26f80 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
26f90 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
26fa0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
26fb0 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
26fc0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
26fd0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
26fe0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
26ff0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
27000 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
27010 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
27020 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
27030 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27040 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
27050 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27060 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27070 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
27080 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
27090 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
270a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
270b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
270c0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
270d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
270e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
270f0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27100 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27110 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20  ->iPage] );.    
27120 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27130 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27140 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27150 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
27160 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63  l );.    rc = ac
27170 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72  cessPayload(pCur
27180 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70  , offset, amt, p
27190 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
271a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
271b0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
271c0 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
271d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
271e0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
271f0 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
27200 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
27210 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
27220 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
27230 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
27240 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65 65  y if index btree
27250 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  s (pPage->intKey
27260 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65 20  ==0) and is the 
27270 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c  data for.** tabl
27280 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65 2d  e btrees (pPage-
27290 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65  >intKey==1). The
272a0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
272b0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a   of available.**
272c0 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69   key/data is wri
272d0 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  tten into *pAmt.
272e0 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74    If *pAmt==0, t
272f0 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a  hen the value.**
27300 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e   returned will n
27310 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70 6f  ot be a valid po
27320 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  inter..**.** Thi
27330 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20  s routine is an 
27340 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49  optimization.  I
27350 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20  t is common for 
27360 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a  the entire key.*
27370 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69  * and data to fi
27380 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  t on the local p
27390 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72  age and for ther
273a0 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66  e to be no overf
273b0 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57  low.** pages.  W
273c0 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20  hen that is so, 
273d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  this routine can
273e0 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65   be used to acce
273f0 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e  ss the.** key an
27400 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d  d data without m
27410 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49  aking a copy.  I
27420 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72  f the key and/or
27430 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20   data spills.** 
27440 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  onto overflow pa
27450 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73  ges, then access
27460 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62  Payload() must b
27470 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65  e used to reasse
27480 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f  mble.** the key/
27490 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74  data and copy it
274a0 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63   into a prealloc
274b0 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  ated buffer..**.
274c0 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
274d0 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
274e0 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69  routine looks di
274f0 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20  rectly into the 
27500 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f  cached.** page o
27510 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
27520 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20   The data might 
27530 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74  change or move t
27540 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20  he next time.** 
27550 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e  any btree routin
27560 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  e is called..*/.
27570 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f 69  static const voi
27580 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d *fetchPayload(
27590 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
275a0 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f  r,      /* Curso
275b0 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e  r pointing to en
275c0 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  try to read from
275d0 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74 20   */.  u32 *pAmt 
275e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
275f0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
27600 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
27610 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  s here */.){.  u
27620 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72 74  32 amt;.  assert
27630 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43 75  ( pCur!=0 && pCu
27640 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
27650 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27660 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73 73  ->iPage]);.  ass
27670 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27680 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27690 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
276a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
276b0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
276c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
276d0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
276e0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
276f0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27700 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
27710 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
27720 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27730 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
27740 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
27750 65 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  e>0 );.  assert(
27760 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
27770 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67  load>pCur->apPag
27780 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
27790 61 44 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54  aData || CORRUPT
277a0 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
277b0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
277c0 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67  load<pCur->apPag
277d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
277e0 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55  aDataEnd ||CORRU
277f0 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20  PT_DB);.  amt = 
27800 28 69 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61  (int)(pCur->apPa
27810 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27820 3e 61 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72  >aDataEnd - pCur
27830 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29  ->info.pPayload)
27840 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  ;.  if( pCur->in
27850 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20  fo.nLocal<amt ) 
27860 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  amt = pCur->info
27870 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74  .nLocal;.  *pAmt
27880 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e   = amt;.  return
27890 20 28 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e   (void*)pCur->in
278a0 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a  fo.pPayload;.}..
278b0 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65  ./*.** For the e
278c0 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72  ntry that cursor
278d0 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74   pCur is point t
278e0 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20  o, return as.** 
278f0 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68  many bytes of th
27900 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73  e key or data as
27910 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f   are available o
27920 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62  n the local.** b
27930 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72 69  -tree page.  Wri
27940 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
27950 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73   available bytes
27960 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a   into *pAmt..**.
27970 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72  ** The pointer r
27980 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d  eturned is ephem
27990 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64  eral.  The key/d
279a0 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20  ata may move.** 
279b0 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64 20  or be destroyed 
279c0 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c  on the next call
279d0 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f   to any Btree ro
279e0 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64  utine,.** includ
279f0 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f  ing calls from o
27a00 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67 61  ther threads aga
27a10 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63 61  inst the same ca
27a20 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  che..** Hence, a
27a30 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74   mutex on the Bt
27a40 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65  Shared should be
27a50 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63   held prior to c
27a60 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72  alling.** this r
27a70 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  outine..**.** Th
27a80 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20  ese routines is 
27a90 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69 63  used to get quic
27aa0 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20  k access to key 
27ab0 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74  and data.** in t
27ac0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
27ad0 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  here no overflow
27ae0 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64 2e   pages are used.
27af0 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
27b00 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46  sqlite3BtreeKeyF
27b10 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
27b20 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
27b30 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
27b40 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
27b50 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64  t);.}.const void
27b60 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44 61   *sqlite3BtreeDa
27b70 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  taFetch(BtCursor
27b80 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d   *pCur, u32 *pAm
27b90 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74  t){.  return fet
27ba0 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  chPayload(pCur, 
27bb0 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  pAmt);.}.../*.**
27bc0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
27bd0 20 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63   down to a new c
27be0 68 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20  hild page.  The 
27bf0 6e 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74  newPgno argument
27c00 20 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20   is the.** page 
27c10 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68  number of the ch
27c20 69 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  ild page to move
27c30 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   to..**.** This 
27c40 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
27c50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
27c60 69 66 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  if the page-head
27c70 65 72 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f  er flags field o
27c80 66 0a 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69  f.** the new chi
27c90 6c 64 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74  ld page does not
27ca0 20 6d 61 74 63 68 20 74 68 65 20 66 6c 61 67 73   match the flags
27cb0 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
27cc0 72 65 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66  rent (i.e..** if
27cd0 20 61 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20   an intkey page 
27ce0 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 74 68  appears to be th
27cf0 65 20 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f  e parent of a no
27d00 6e 2d 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f  n-intkey page, o
27d10 72 0a 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29  r.** vice-versa)
27d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27d30 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75  moveToChild(BtCu
27d40 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
27d50 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68  newPgno){.  BtSh
27d60 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
27d70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
27d80 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
27d90 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
27da0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27db0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27dc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27dd0 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
27de0 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
27df0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
27e00 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
27e10 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
27e20 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
27e30 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
27e40 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
27e50 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
27e60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
27e70 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
27e80 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
27e90 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
27ea0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
27eb0 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43  r->iPage++;.  pC
27ec0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
27ed0 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65  iPage] = 0;.  re
27ee0 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50  turn getAndInitP
27ef0 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
27f00 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
27f10 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f30 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
27f40 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
27f50 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
27f60 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
27f70 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
27f80 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
27f90 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
27fa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
27fb0 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
27fc0 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
27fd0 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
27fe0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
27ff0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
28000 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
28010 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
28020 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
28030 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
28040 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
28050 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
28060 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
28070 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
28080 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
28090 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
280a0 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
280b0 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
280c0 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
280d0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
280e0 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
280f0 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
28100 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
28110 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
28140 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
28150 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
28160 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
28170 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
28180 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
28190 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
281a0 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
281b0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
281c0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
281d0 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
281e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
281f0 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
28200 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
28210 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
28220 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
28230 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
28240 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
28250 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
28260 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
28270 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
28280 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
28290 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
282a0 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
282b0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
282c0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
282d0 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
282e0 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
282f0 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
28300 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
28310 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
28320 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
28330 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
28340 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
28350 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
28360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
28370 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
28380 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
28390 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
283a0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
283b0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
283c0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
283d0 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
283e0 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
283f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28400 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28410 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
28420 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
28430 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
28440 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
28450 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
28460 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
28470 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
28480 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
28490 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
284a0 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
284b0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
284c0 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
284d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
284e0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
284f0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
28500 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
28510 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
28520 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
28530 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61  idOvfl);.  relea
28540 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
28550 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28560 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f  >iPage--]);.}../
28570 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
28580 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
28590 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
285a0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
285b0 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
285c0 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
285d0 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
285e0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
285f0 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
28600 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
28610 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28620 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
28630 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
28640 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
28650 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
28660 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
28670 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
28680 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
28690 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
286a0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
286b0 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
286c0 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
286d0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
286e0 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
286f0 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
28700 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
28710 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
28720 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
28730 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
28740 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
28750 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
28760 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
28770 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
28780 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
28790 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
287a0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
287b0 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
287c0 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
287d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
287e0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
287f0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
28800 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
28810 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
28820 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
28830 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
28840 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
28850 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
28860 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
28870 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
28880 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
28890 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
288a0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
288b0 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
288c0 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
288d0 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
288e0 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
288f0 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
28900 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
28910 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
28920 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
28930 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
28940 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
28950 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
28960 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
28970 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
28980 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
28990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
289a0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
289b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
289c0 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
289d0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
289e0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
289f0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
28a00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
28a10 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
28a20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
28a30 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
28a40 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  t( CURSOR_VALID 
28a50 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49    < CURSOR_REQUI
28a60 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
28a70 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54  rt( CURSOR_FAULT
28a80 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55     > CURSOR_REQU
28a90 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
28aa0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43   pCur->eState>=C
28ab0 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28ac0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
28ad0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28ae0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20  R_FAULT ){.     
28af0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
28b00 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f  kipNext!=SQLITE_
28b10 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  OK );.      retu
28b20 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  rn pCur->skipNex
28b30 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  t;.    }.    sql
28b40 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
28b50 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a  rsor(pCur);.  }.
28b60 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
28b70 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ge>=0 ){.    whi
28b80 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  le( pCur->iPage 
28b90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
28ba0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28bb0 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b  ur->iPage]!=0 );
28bc0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
28bd0 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e  geNotNull(pCur->
28be0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
28bf0 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  ge--]);.    }.  
28c00 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
28c10 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
28c20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28c30 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
28c50 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
28c60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
28c70 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
28c80 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  ;.    rc = getAn
28c90 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
28ca0 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
28cb0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
28cc0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
28cf0 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
28d00 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28d10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
28d20 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
28d30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
28d40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
28d50 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
28d60 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Page = 0;.    pC
28d70 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20  ur->curIntKey = 
28d80 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
28d90 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70  >intKey;.  }.  p
28da0 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  Root = pCur->apP
28db0 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74  age[0];.  assert
28dc0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  ( pRoot->pgno==p
28dd0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b  Cur->pgnoRoot );
28de0 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e  ..  /* If pCur->
28df0 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20  pKeyInfo is not 
28e00 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 63  NULL, then the c
28e10 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e 65  aller that opene
28e20 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20 20  d this cursor.  
28e30 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20 6f  ** expected to o
28e40 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64  pen it on an ind
28e50 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65 72  ex b-tree. Other
28e60 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e 66  wise, if pKeyInf
28e70 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20  o is.  ** NULL, 
28e80 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65 63  the caller expec
28e90 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65  ts a table b-tre
28ea0 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f  e. If this is no
28eb0 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a  t the case,.  **
28ec0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49 54   return an SQLIT
28ed0 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2e  E_CORRUPT error.
28ee0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c   .  **.  ** Earl
28ef0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
28f00 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20 74  SQLite assumed t
28f10 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63 6f  hat this test co
28f20 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a  uld not fail.  *
28f30 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70 61  * if the root pa
28f40 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 6c  ge was already l
28f50 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73 20  oaded when this 
28f60 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61 6c  function was cal
28f70 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69  led (i.e..  ** i
28f80 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  f pCur->iPage>=0
28f90 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20 6e  ). But this is n
28fa0 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61 74  ot so if the dat
28fb0 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
28fc0 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68  ed .  ** in such
28fd0 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67 65   a way that page
28fe0 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64   pRoot is linked
28ff0 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20 62   into a second b
29000 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20 2a  -tree table .  *
29010 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c 69  * (or the freeli
29020 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  st).  */.  asser
29030 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79  t( pRoot->intKey
29040 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e  ==1 || pRoot->in
29050 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  tKey==0 );.  if(
29060 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d   pRoot->isInit==
29070 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79  0 || (pCur->pKey
29080 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d  Info==0)!=pRoot-
29090 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72  >intKey ){.    r
290a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
290b0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  RUPT_BKPT;.  }..
290c0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d    pCur->aiIdx[0]
290d0 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
290e0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
290f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
29100 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
29110 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42  BTCF_ValidNKey|B
29120 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a  TCF_ValidOvfl);.
29130 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
29140 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
29150 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29160 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
29170 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
29180 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
29190 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
291a0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
291b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
291c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
291d0 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
291e0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
291f0 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
29200 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
29210 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29220 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
29230 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29240 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
29250 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
29260 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29270 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
29280 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29290 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
292a0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
292b0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
292c0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
292d0 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
292e0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
292f0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
29300 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
29310 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
29320 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
29330 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
29340 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
29350 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29360 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
29370 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
29380 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
29390 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
293a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
293b0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
293c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
293d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
293e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
293f0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
29400 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
29410 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
29420 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
29430 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29440 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
29450 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
29460 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
29470 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43  iPage]<pPage->nC
29480 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20  ell );.    pgno 
29490 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
294a0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
294b0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
294c0 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20 3d 20  ge]));.    rc = 
294d0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
294e0 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72  , pgno);.  }.  r
294f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29500 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
29510 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 72  or down to the r
29520 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  ight-most leaf e
29530 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29540 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68 69 63  .** page to whic
29550 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
29560 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74  y pointing.  Not
29570 69 63 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  ice the differen
29580 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f  ce.** between mo
29590 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61  veToLeftmost() a
295a0 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  nd moveToRightmo
295b0 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66  st().  moveToLef
295c0 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
295d0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65   the left-most e
295e0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
295f0 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65 61 73   *entry* whereas
29600 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29610 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
29620 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
29630 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 70 61   beneath the *pa
29640 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ge*..**.** The r
29650 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  ight-most entry 
29660 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
29670 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65 79 20  the largest key 
29680 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65  - the last.** ke
29690 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f  y in ascending o
296a0 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
296b0 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  int moveToRightm
296c0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
296d0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
296e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
296f0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
29700 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20  e *pPage = 0;.. 
29710 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
29720 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
29730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29740 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29750 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
29760 6c 65 28 20 21 28 70 50 61 67 65 20 3d 20 70 43  le( !(pPage = pC
29770 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29780 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29  >iPage])->leaf )
29790 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  {.    pgno = get
297a0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
297b0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
297c0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
297d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
297e0 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e  iPage] = pPage->
297f0 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20  nCell;.    rc = 
29800 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
29810 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28  , pgno);.    if(
29820 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
29830 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49  .  }.  pCur->aiI
29840 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
29850 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
29860 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
29870 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
29880 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 43  );.  assert( (pC
29890 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
298a0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d  TCF_ValidNKey)==
298b0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
298c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d  LITE_OK;.}../* M
298d0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
298e0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
298f0 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
29900 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
29910 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
29920 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
29930 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
29940 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
29950 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
29960 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
29970 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
29980 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
29990 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74  qlite3BtreeFirst
299a0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
299b0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
299c0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
299d0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
299e0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
299f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29a00 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
29a10 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
29a20 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
29a30 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
29a40 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29a50 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
29a60 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29a70 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
29a80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29a90 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
29aa0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29ab0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29ac0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
29ad0 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
29ae0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
29af0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29b00 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29b10 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
29b20 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
29b30 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
29b40 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
29b50 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29b60 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
29b70 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
29b80 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
29b90 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
29ba0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
29bb0 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
29bc0 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
29bd0 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
29be0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
29bf0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
29c00 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
29c10 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
29c20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29c30 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
29c40 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
29c50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
29c60 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
29c70 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
29c80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
29c90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
29ca0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
29cb0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
29cc0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   If the cursor a
29cd0 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74 6f  lready points to
29ce0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 2c   the last entry,
29cf0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
29d00 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53 4f  . */.  if( CURSO
29d10 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  R_VALID==pCur->e
29d20 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d 3e  State && (pCur->
29d30 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
29d40 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23 69  AtLast)!=0 ){.#i
29d50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
29d60 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c  G.    /* This bl
29d70 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61 73  ock serves to as
29d80 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
29d90 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f  cursor really do
29da0 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a  es point .    **
29db0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
29dc0 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65 65  ry in the b-tree
29dd0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  . */.    int ii;
29de0 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
29df0 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  i<pCur->iPage; i
29e00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
29e10 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
29e20 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67  ii]==pCur->apPag
29e30 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  e[ii]->nCell );.
29e40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
29e50 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
29e60 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72  ur->iPage]==pCur
29e70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29e80 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29  Page]->nCell-1 )
29e90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
29ea0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29eb0 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b  >iPage]->leaf );
29ec0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
29ed0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
29ee0 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  }..  rc = moveTo
29ef0 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66  Root(pCur);.  if
29f00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
29f10 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f  ){.    if( CURSO
29f20 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
29f30 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
29f40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
29f50 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
29f60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29f70 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
29f80 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
29f90 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
29fa0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
29fb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
29fc0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
29fd0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
29fe0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52      rc = moveToR
29ff0 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  ightmost(pCur);.
2a000 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2a010 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2a020 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a030 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73 74  s |= BTCF_AtLast
2a040 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2a050 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72         pCur->cur
2a060 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 41  Flags &= ~BTCF_A
2a070 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20  tLast;.      }. 
2a080 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72    .    }.  }.  r
2a090 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
2a0a0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
2a0b0 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
2a0c0 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65  s to an entry ne
2a0d0 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73  ar the key .** s
2a0e0 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64 78  pecified by pIdx
2a0f0 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20  Key or intKey.  
2a100 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65 73   Return a succes
2a110 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f  s code..**.** Fo
2a120 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c  r INTKEY tables,
2a130 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72 61   the intKey para
2a140 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20  meter is used.  
2a150 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74  pIdxKey .** must
2a160 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69   be NULL.  For i
2a170 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49 64  ndex tables, pId
2a180 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e 64  xKey is used and
2a190 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67   intKey.** is ig
2a1a0 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  nored..**.** If 
2a1b0 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69  an exact match i
2a1c0 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65  s not found, the
2a1d0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  n the cursor is 
2a1e0 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70  always.** left p
2a1f0 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61  ointing at a lea
2a200 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f 75  f page which wou
2a210 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72  ld hold the entr
2a220 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20  y if it.** were 
2a230 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75  present.  The cu
2a240 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74  rsor might point
2a250 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61   to an entry tha
2a260 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72  t comes.** befor
2a270 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b  e or after the k
2a280 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74  ey..**.** An int
2a290 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e 20  eger is written 
2a2a0 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63 68  into *pRes which
2a2b0 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   is the result o
2a2c0 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74  f.** comparing t
2a2d0 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20  he key with the 
2a2e0 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74  entry to which t
2a2f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a  he cursor is .**
2a300 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65 20   pointing.  The 
2a310 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 69  meaning of the i
2a320 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20 69  nteger written i
2a330 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20  nto.** *pRes is 
2a340 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
2a350 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
2a360 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2a370 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2a380 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2a390 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2a3a0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
2a3b0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2a3c0 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
2a3d0 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3f0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
2a400 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
2a410 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
2a420 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
2a430 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
2a440 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2a450 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2a460 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2a470 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
2a480 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b 65  ly matches intKe
2a490 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a  y/pIdxKey..**.**
2a4a0 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20       *pRes>0    
2a4b0 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2a4c0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2a4d0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2a4e0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2a4f0 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68 61     is larger tha
2a500 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79  n intKey/pIdxKey
2a510 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ..**.*/.int sqli
2a520 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2a530 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
2a540 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2a550 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
2a560 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
2a570 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2a580 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
2a590 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
2a5a0 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
2a5b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a5c0 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
2a5d0 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
2a5e0 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2a5f0 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
2a600 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
2a610 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
2a620 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
2a630 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2a640 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
2a650 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2a660 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
2a670 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
2a680 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
2a690 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
2a6a0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a6b0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a6c0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2a6d0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2a6e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2a6f0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2a700 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2a710 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2a720 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2a730 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2a740 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
2a750 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
2a760 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
2a770 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
2a780 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
2a790 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
2a7a0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
2a7b0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a7c0 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2a7d0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2a7e0 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2a7f0 20 26 26 20 70 43 75 72 2d 3e 63 75 72 49 6e 74   && pCur->curInt
2a800 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
2a810 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2a820 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2a830 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a840 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a850 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2a860 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
2a870 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2a880 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  t)!=0 && pCur->i
2a890 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
2a8a0 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2a8b0 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2a8c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2a8d0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
2a8e0 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
2a8f0 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
2a900 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
2a910 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
2a920 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
2a930 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
2a940 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
2a950 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
2a960 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2a970 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
2a980 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2a990 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2a9a0 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
2a9b0 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
2a9c0 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
2a9d0 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
2a9e0 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
2a9f0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2aa00 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2aa10 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2aa20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2aa30 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2aa40 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2aa50 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
2aa60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2aa70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2aa80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2aa90 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
2aaa0 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2aab0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2aac0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
2aad0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2aae0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2aaf0 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
2ab00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ab10 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
2ab20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2ab30 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2ab40 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2ab50 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ab60 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2ab70 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2ab80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2ab90 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2aba0 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2abb0 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2abc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2abd0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2abe0 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2abf0 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2ac00 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2ac10 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2ac20 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2ac30 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2ac40 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ac50 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2ac80 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
2ac90 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
2aca0 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
2acb0 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
2acc0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
2acd0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2ace0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2acf0 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
2ad00 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
2ad10 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
2ad20 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
2ad30 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
2ad40 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2ad50 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
2ad60 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
2ad70 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
2ad80 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
2ad90 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
2ada0 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
2adb0 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
2adc0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
2add0 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
2ade0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
2adf0 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
2ae00 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
2ae10 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
2ae20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
2ae30 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
2ae40 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
2ae50 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
2ae60 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2ae70 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
2ae80 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2ae90 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
2aea0 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
2aeb0 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
2aec0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
2aed0 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
2aee0 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
2aef0 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
2af00 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
2af10 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
2af20 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
2af30 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2af40 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2af50 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2af60 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
2af70 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
2af80 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
2af90 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
2afa0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2afb0 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2afc0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2afd0 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  idx);.        if
2afe0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
2aff0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2b000 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
2b010 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
2b020 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2b030 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
2b040 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51  aEnd ) return SQ
2b050 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b060 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2b070 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b080 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
2b090 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
2b0a0 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2b0b0 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
2b0c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2b0d0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2b0e0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2b0f0 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
2b100 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2b110 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
2b120 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b130 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2b140 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2b150 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
2b160 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2b170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b180 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2b190 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
2b1a0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
2b1b0 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2b1c0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
2b1d0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2b1e0 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
2b1f0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b200 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b210 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2b220 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2b230 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b240 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2b250 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
2b260 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
2b270 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
2b280 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b290 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2b2a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b2b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2b2c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2b2d0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2b2e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b2f0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2b300 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2b310 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2b320 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2b330 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2b340 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2b350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b360 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2b370 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2b380 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2b390 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2b3a0 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2b3b0 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2b3c0 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2b3d0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2b3e0 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2b3f0 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2b400 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2b410 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2b420 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2b430 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2b440 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2b450 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2b460 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2b470 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2b480 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2b490 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2b4a0 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2b4b0 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2b4c0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2b4d0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2b4e0 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2b4f0 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2b500 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2b510 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2b520 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2b530 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2b540 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2b550 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2b560 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2b570 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2b580 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2b590 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2b5a0 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2b5b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2b5c0 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2b5d0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2b5e0 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2b5f0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2b600 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2b610 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2b620 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2b630 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2b640 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2b650 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2b660 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2b670 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2b680 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2b690 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2b6a0 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2b6b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2b6c0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2b6d0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2b6e0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2b6f0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2b700 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2b710 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2b720 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2b730 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2b740 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2b750 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2b760 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2b770 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2b780 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2b790 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2b7a0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2b7b0 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2b7c0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2b7d0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2b7e0 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2b7f0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2b800 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2b810 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2b820 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2b830 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2b840 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2b850 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2b860 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2b870 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2b880 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2b890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b8a0 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2b8b0 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2b8c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2b8d0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2b8e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2b8f0 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2b900 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2b910 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2b920 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2b930 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2b940 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2b950 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2b960 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2b970 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2b980 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2b990 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2b9a0 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2b9b0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2b9c0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2b9d0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2b9e0 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2b9f0 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2ba00 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2ba10 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2ba20 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2ba30 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2ba40 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2ba50 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2ba60 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2ba70 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2ba80 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2ba90 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2baa0 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2bab0 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2bac0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2bad0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2bae0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2baf0 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2bb00 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2bb10 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2bb20 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2bb30 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2bb40 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2bb50 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2bb60 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2bb70 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2bb80 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2bb90 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2bba0 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2bbb0 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2bbc0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2bbd0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2bbe0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2bbf0 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2bc00 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2bc10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2bc20 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2bc30 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2bc40 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2bc50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2bc60 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2bc70 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2bc80 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2bc90 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2bca0 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2bcc0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2bcd0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2bce0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2bcf0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2bd00 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2bd10 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2bd20 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2bd30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2bd40 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2bd50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2bd60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2bd70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2bd80 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2bd90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bda0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2bdb0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2bdc0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2bdd0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2bde0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2bdf0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2be00 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2be10 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
2be20 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2be30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2be40 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2be50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2be60 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2be70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2be80 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2be90 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
2bea0 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
2beb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2bec0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2bed0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2bee0 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
2bef0 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
2bf00 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2bf10 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
2bf20 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
2bf30 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2bf40 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
2bf50 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
2bf60 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2bf70 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
2bf80 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
2bf90 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2bfa0 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2bfb0 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
2bfc0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2bfd0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2bfe0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bff0 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
2c000 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
2c010 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c030 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c040 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c050 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2c060 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
2c070 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
2c080 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2c090 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
2c0a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c0b0 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
2c0c0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2c0d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2c0e0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2c0f0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2c100 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2c110 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2c120 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
2c130 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2c140 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
2c150 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
2c160 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2c170 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
2c180 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2c190 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
2c1a0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c1b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c1c0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c1d0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
2c1e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2c1f0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
2c200 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c210 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c220 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2c230 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
2c240 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
2c250 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c260 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
2c270 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
2c280 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
2c290 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2c2a0 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2c2b0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2c2c0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2c2d0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2c2e0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2c2f0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c300 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
2c310 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
2c320 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c330 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
2c340 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2c350 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
2c360 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2c370 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
2c380 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
2c390 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c3a0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2c3b0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2c3c0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2c3d0 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Ovfl);.  return 
2c3e0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2c3f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2c400 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2c410 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2c420 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2c430 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2c440 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2c450 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2c460 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2c470 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2c480 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c490 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2c4a0 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2c4b0 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2c4c0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2c4d0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2c4e0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2c4f0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2c500 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c510 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2c520 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2c530 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2c540 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2c550 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2c560 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2c570 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2c580 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2c590 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2c5a0 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2c5b0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2c5c0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2c5d0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2c5e0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2c5f0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2c600 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2c610 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
2c620 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
2c630 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
2c640 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2c650 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2c660 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2c670 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2c680 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2c690 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2c6a0 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2c6b0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2c6c0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2c6d0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2c6e0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2c6f0 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2c700 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2c710 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2c720 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
2c730 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2c740 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2c750 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2c760 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
2c770 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2c780 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2c790 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
2c7a0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2c7b0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2c7c0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
2c7d0 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
2c7e0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2c7f0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2c800 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2c810 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2c820 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
2c830 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2c840 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2c850 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2c860 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2c870 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2c880 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2c890 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2c8a0 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2c8b0 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2c8c0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2c8d0 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2c8e0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2c8f0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2c900 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2c910 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2c920 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2c930 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2c940 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2c950 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2c960 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2c970 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2c980 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2c990 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2c9a0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2c9b0 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2c9c0 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2c9d0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2c9e0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2c9f0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2ca00 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2ca10 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2ca20 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2ca30 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2ca40 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2ca50 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2ca60 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2ca70 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2ca80 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2ca90 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2caa0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2cab0 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2cac0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2cad0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2cae0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2caf0 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2cb00 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2cb10 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2cb20 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2cb30 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  D );.  assert( *
2cb40 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28  pRes==0 );.  if(
2cb50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2cb60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2cb70 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72     assert( (pCur
2cb80 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2cb90 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30 20  F_ValidOvfl)==0 
2cba0 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  );.    rc = rest
2cbb0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2cbc0 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2cbd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2cbe0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2cbf0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2cc00 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2cc10 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2cc20 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2cc30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2cc40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2cc50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2cc60 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2cc70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2cc80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2cc90 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2cca0 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2ccb0 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2ccc0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2ccd0 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2cce0 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2ccf0 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt>0 ){.        
2cd00 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2cd10 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2cd20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2cd30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2cd40 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2cd50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2cd60 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2cd70 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2cd80 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d 3e    idx = ++pCur->
2cd90 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2cda0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e];.  assert( pP
2cdb0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 0a  age->isInit );..
2cdc0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
2cdd0 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f 72  base file is cor
2cde0 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73 73  rupt, it is poss
2cdf0 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61 6c  ible for the val
2ce00 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a 20  ue of idx .  ** 
2ce10 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68 65  to be invalid he
2ce20 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c  re. This can onl
2ce30 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65 63  y occur if a sec
2ce40 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69 66  ond cursor modif
2ce50 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ies.  ** the pag
2ce60 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20 70  e while cursor p
2ce70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  Cur is holding a
2ce80 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
2ce90 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a 2a  . Which can.  **
2cea0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66 20   only happen if 
2ceb0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
2cec0 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68 20  corrupt in such 
2ced0 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e 6b  a way as to link
2cee0 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20 69   the.  ** page i
2cef0 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  nto more than on
2cf00 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
2cf10 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  re. */.  testcas
2cf20 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e 43  e( idx>pPage->nC
2cf30 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69 64  ell );..  if( id
2cf40 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x>=pPage->nCell 
2cf50 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
2cf60 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2cf70 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
2cf80 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
2cf90 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2cfa0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2cfb0 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  8]));.      if( 
2cfc0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2cfd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76        return mov
2cfe0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
2cff0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  );.    }.    do{
2d000 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2d010 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2d020 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2d030 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
2d040 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2d050 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72  VALID;.        r
2d060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2d070 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2d080 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2d090 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
2d0a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2d0b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
2d0c0 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61 69  }while( pCur->ai
2d0d0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2d0e0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2d0f0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2d100 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2d110 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42   return sqlite3B
2d120 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2d130 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2d140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2d150 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2d160 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
2d170 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
2d180 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d190 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2d1a0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
2d1b0 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69 6e  (pCur);.  }.}.in
2d1c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
2d1d0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
2d1e0 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2d1f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2d200 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2d210 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
2d220 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2d230 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res!=0 );.  asse
2d240 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20  rt( *pRes==0 || 
2d250 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73  *pRes==1 );.  as
2d260 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
2d270 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Next==0 || pCur-
2d280 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d290 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72 2d  VALID );.  pCur-
2d2a0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2d2b0 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2d2c0 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2d2d0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2d2e0 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20 3d  Ovfl);.  *pRes =
2d2f0 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
2d300 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d310 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62 74  ALID ) return bt
2d320 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
2d330 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70  es);.  pPage = p
2d340 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d350 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20  ->iPage];.  if( 
2d360 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  (++pCur->aiIdx[p
2d370 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70 50  Cur->iPage])>=pP
2d380 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
2d390 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2d3a0 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20  ur->iPage]--;.  
2d3b0 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65    return btreeNe
2d3c0 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2d3d0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d3e0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2d3f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d410 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d420 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  t(pCur);.  }.}..
2d430 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
2d440 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
2d450 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
2d460 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
2d470 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
2d480 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
2d490 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
2d4a0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
2d4b0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
2d4c0 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
2d4d0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
2d4e0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
2d4f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
2d500 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
2d510 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a  et *pRes=1..**.*
2d520 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72 79  * The main entry
2d530 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74 65   point is sqlite
2d540 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 29  3BtreePrevious()
2d550 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20  .  That routine 
2d560 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20  is optimized.** 
2d570 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63  for the common c
2d580 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64 65  ase of merely de
2d590 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2d5a0 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75  ell counter BtCu
2d5b0 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f  rsor.aiIdx.** to
2d5c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 65   the previous ce
2d5d0 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ll on the curren
2d5e0 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73 6c  t page.  The (sl
2d5f0 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76 69  ower) btreePrevi
2d600 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72 20  ous().** helper 
2d610 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2d620 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2d630 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2d640 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2d650 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73 74  ge.** or to rest
2d660 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2d670 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2d680 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2d690 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2d6a0 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2d6b0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2d6c0 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2d6d0 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2d6e0 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2d6f0 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2d700 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2d710 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2d720 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2d730 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2d740 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2d750 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2d760 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2d770 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2d780 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2d790 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2d7a0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2d7b0 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2d7c0 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2d7d0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2d7e0 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2d7f0 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2d800 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2d810 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2d820 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2d830 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2d840 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2d850 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2d860 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2d870 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2d880 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2d890 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2d8a0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2d8b0 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65 76  NE int btreePrev
2d8c0 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ious(BtCursor *p
2d8d0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2d8e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
2d8f0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
2d900 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2d910 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2d920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73  ;.  assert( pRes
2d930 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2d940 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61   *pRes==0 );.  a
2d950 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2d960 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2d970 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d980 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
2d990 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2d9a0 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61  ags & (BTCF_AtLa
2d9b0 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  st|BTCF_ValidOvf
2d9c0 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  l|BTCF_ValidNKey
2d9d0 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ))==0 );.  asser
2d9e0 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  t( pCur->info.nS
2d9f0 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ize==0 );.  if( 
2da00 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2da10 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
2da20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
2da30 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
2da40 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
2da50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2da60 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2da70 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53    }.    if( CURS
2da80 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2da90 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2daa0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
2dab0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2dac0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2dad0 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  f( pCur->skipNex
2dae0 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  t ){.      asser
2daf0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
2db00 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
2db10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2db20 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
2db30 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  ;.      pCur->eS
2db40 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41  tate = CURSOR_VA
2db50 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70  LID;.      if( p
2db60 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20  Cur->skipNext<0 
2db70 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2db80 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
2db90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dba0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2dbb0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  .      pCur->ski
2dbc0 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d  pNext = 0;.    }
2dbd0 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2dbe0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2dbf0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2dc00 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2dc10 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  it );.  if( !pPa
2dc20 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2dc30 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  int idx = pCur->
2dc40 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2dc50 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  e];.    rc = mov
2dc60 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67  eToChild(pCur, g
2dc70 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2dc80 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a  (pPage, idx)));.
2dc90 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2dca0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
2dcb0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2dcc0 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  (pCur);.  }else{
2dcd0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75 72  .    while( pCur
2dce0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2dcf0 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  age]==0 ){.     
2dd00 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2dd10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2dd20 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2dd30 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
2dd40 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2dd50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2dd60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2dd70 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2dd80 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2dd90 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2dda0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
2ddb0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
2ddc0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2ddd0 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e  s & (BTCF_ValidN
2dde0 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
2ddf0 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  fl))==0 );..    
2de00 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2de10 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20  ->iPage]--;.    
2de20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2de30 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2de40 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ];.    if( pPage
2de50 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61  ->intKey && !pPa
2de60 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2de70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2de80 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72  reePrevious(pCur
2de90 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c  , pRes);.    }el
2dea0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2deb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2dec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2ded0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2dee0 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75  reePrevious(BtCu
2def0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2df00 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74  *pRes){.  assert
2df10 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
2df20 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
2df30 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2df40 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2df50 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2df60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2df70 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2df80 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2df90 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2dfa0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
2dfb0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2dfc0 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2dfd0 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2dfe0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2dff0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e000 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2e010 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e020 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2e030 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e040 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20  iPage]==0.   || 
2e050 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e060 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2e070 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2e080 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2e090 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2e0a0 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2e0b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2e0c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e0d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2e0e0 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2e0f0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e100 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2e110 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2e120 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2e130 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2e140 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2e150 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2e160 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2e170 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2e180 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2e190 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2e1a0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2e1b0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2e1c0 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2e1d0 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2e1e0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2e1f0 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2e200 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2e210 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2e220 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2e230 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2e240 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2e250 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2e260 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2e270 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
2e280 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
2e290 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2e2a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
2e2b0 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
2e2c0 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
2e2d0 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
2e2e0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
2e2f0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
2e300 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2e310 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
2e320 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
2e330 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
2e340 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
2e350 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
2e360 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
2e370 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
2e380 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
2e390 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
2e3a0 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
2e3b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
2e3c0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
2e3d0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2e3e0 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
2e3f0 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
2e400 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2e410 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
2e420 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2e430 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
2e440 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
2e450 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
2e460 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
2e470 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
2e480 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
2e490 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
2e4a0 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
2e4b0 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
2e4c0 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
2e4d0 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
2e4e0 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
2e4f0 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
2e500 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2e510 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
2e520 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2e530 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
2e540 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
2e550 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
2e560 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
2e570 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2e580 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2e590 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
2e5a0 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
2e5b0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
2e5c0 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
2e5d0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
2e5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2e5f0 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
2e600 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
2e610 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
2e620 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
2e630 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
2e640 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
2e650 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
2e660 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
2e670 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
2e680 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2e690 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2e6a0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
2e6b0 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
2e6c0 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
2e6d0 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
2e6e0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
2e6f0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2e700 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2e710 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2e720 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
2e730 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2e740 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e750 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
2e760 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2e770 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2e780 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2e790 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
2e7a0 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
2e7b0 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
2e7c0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
2e7d0 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
2e7e0 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
2e7f0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
2e800 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
2e810 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2e820 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
2e830 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2e840 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2e850 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
2e860 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
2e870 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2e880 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2e890 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
2e8a0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2e8b0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
2e8c0 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
2e8d0 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
2e8e0 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
2e8f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2e900 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
2e910 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
2e920 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
2e930 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2e940 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
2e950 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
2e960 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
2e970 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
2e980 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
2e990 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
2e9a0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2e9b0 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
2e9c0 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
2e9d0 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
2e9e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2e9f0 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
2ea00 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
2ea10 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2ea20 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
2ea30 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
2ea40 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
2ea50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
2ea60 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
2ea70 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2ea80 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
2ea90 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
2eaa0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
2eab0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
2eac0 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
2ead0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2eae0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2eaf0 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2eb00 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
2eb10 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
2eb20 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
2eb30 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
2eb40 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
2eb50 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2eb60 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
2eb70 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
2eb80 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
2eb90 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
2eba0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2ebb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ebc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
2ebd0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2ebe0 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2ebf0 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
2ec00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ec10 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2ec20 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ec30 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
2ec40 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2ec50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2ec60 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
2ec70 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
2ec80 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
2ec90 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
2eca0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
2ecb0 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
2ecc0 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
2ecd0 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
2ece0 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
2ecf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ed00 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
2ed10 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2ed20 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ed30 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2ed40 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
2ed50 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
2ed60 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
2ed70 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
2ed80 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
2ed90 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
2eda0 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
2edb0 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
2edc0 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
2edd0 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
2ede0 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
2edf0 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
2ee00 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
2ee10 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
2ee20 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
2ee30 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
2ee40 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
2ee50 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
2ee60 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
2ee70 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
2ee80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
2ee90 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2eea0 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
2eeb0 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
2eec0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
2eed0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
2eee0 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
2eef0 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
2ef00 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2ef10 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2ef20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
2ef30 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
2ef40 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2ef50 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
2ef60 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
2ef70 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
2ef80 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
2ef90 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
2efa0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2efb0 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
2efc0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
2efd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2efe0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2eff0 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
2f000 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
2f010 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2f020 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
2f030 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
2f040 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f050 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
2f060 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
2f070 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
2f080 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
2f090 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
2f0a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
2f0b0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2f0c0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2f0d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f0e0 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
2f0f0 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2f100 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
2f110 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
2f120 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
2f130 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f140 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2f150 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2f160 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2f170 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
2f180 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2f190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f1a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f1b0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2f1c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f1d0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f1e0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2f1f0 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
2f200 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2f210 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
2f220 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
2f230 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
2f240 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
2f250 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2f260 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f270 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
2f280 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
2f290 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
2f2a0 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
2f2b0 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2f2c0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2f2d0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
2f2e0 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
2f2f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2f300 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
2f310 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
2f320 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
2f330 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
2f340 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
2f350 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
2f360 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
2f370 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
2f380 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
2f390 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2f3a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f3b0 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
2f3c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f3d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f3e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2f3f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2f400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2f410 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f420 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2f430 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2f440 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2f450 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2f460 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2f470 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f480 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2f490 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2f4a0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f4b0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2f4c0 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2f4d0 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2f4e0 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2f4f0 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2f500 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
2f510 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
2f520 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
2f530 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2f540 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
2f550 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
2f560 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
2f570 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f580 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f590 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f5a0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
2f5b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f5c0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2f5d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
2f5e0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
2f5f0 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
2f600 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
2f610 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
2f620 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2f630 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
2f640 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
2f650 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
2f660 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
2f670 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
2f680 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
2f690 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
2f6a0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
2f6b0 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
2f6c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f6d0 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2f6e0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2f6f0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2f700 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2f710 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2f720 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f730 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2f740 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2f750 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2f760 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f770 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f780 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
2f790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f7a0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2f7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f7c0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2f7d0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2f7e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2f800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2f810 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f820 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2f830 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f840 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2f850 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f860 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2f870 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f880 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2f890 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2f8a0 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
2f8b0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2f8c0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f8e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f8f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2f900 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
2f910 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
2f920 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
2f930 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
2f940 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
2f950 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
2f960 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
2f970 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
2f980 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2f990 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
2f9a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f9b0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
2f9c0 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
2f9d0 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
2f9e0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2f9f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
2fa00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2fa10 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
2fa20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
2fa30 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2fa40 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2fa50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2fa60 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fa70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fa80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
2fa90 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
2faa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2fab0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2fac0 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
2fad0 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
2fae0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
2faf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fb00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fb10 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fb20 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fb30 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
2fb40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2fb50 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
2fb60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fb70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2fb80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2fb90 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fba0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2fbb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fbc0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fbd0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fbe0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2fbf0 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2fc00 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
2fc10 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2fc20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2fc30 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2fc40 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
2fc50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2fc60 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
2fc70 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2fc80 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
2fc90 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2fca0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2fcb0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2fcc0 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2fcd0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2fce0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2fcf0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
2fd00 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2fd10 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2fd20 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2fd30 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
2fd40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2fd50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2fd60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fd70 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2fd80 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fd90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2fda0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2fdb0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fdc0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2fdd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fde0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
2fdf0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2fe00 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2fe10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fe20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
2fe30 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2fe40 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2fe50 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
2fe60 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
2fe70 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
2fe80 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
2fe90 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
2fea0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
2feb0 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
2fec0 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
2fed0 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
2fee0 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
2fef0 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
2ff00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
2ff10 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
2ff20 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
2ff30 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
2ff40 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
2ff50 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2ff60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2ff70 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2ff80 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
2ff90 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
2ffa0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2ffb0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
2ffc0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
2ffd0 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
2ffe0 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
2fff0 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
30000 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
30010 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
30020 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30030 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30040 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
30060 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
30070 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
30080 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
30090 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
300a0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
300b0 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
300c0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
300d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
300e0 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
300f0 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
30100 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
30110 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
30120 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
30130 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
30140 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
30150 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
30160 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
30170 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
30180 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
30190 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
301a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
301b0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
301c0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
301d0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
301e0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
301f0 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
30200 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30210 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
30220 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
30230 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
30240 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30250 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
30260 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
30270 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
30280 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
30290 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
302a0 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
302b0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
302c0 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
302d0 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
302e0 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
302f0 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
30300 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
30310 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30320 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
30330 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
30340 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
30350 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
30360 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
30370 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
30380 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
30390 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
303a0 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
303b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
303c0 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
303d0 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
303e0 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
303f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30400 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30410 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
30420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30430 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
30440 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30450 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
30460 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
30470 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
30480 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
30490 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
304a0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
304b0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
304c0 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
304d0 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
304e0 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
304f0 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
30500 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
30510 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
30520 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
30530 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30540 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
30550 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
30560 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
30570 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
30580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30590 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
305a0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
305b0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
305c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
305d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
305e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
305f0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
30600 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30610 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
30620 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30630 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30640 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30650 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
30660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
30670 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
30680 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
30690 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
306a0 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
306b0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
306c0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
306d0 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
306e0 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
306f0 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
30700 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
30710 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
30720 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
30730 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
30740 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
30750 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
30760 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
30770 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
30780 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
30790 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
307a0 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
307b0 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
307c0 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
307d0 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
307e0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
307f0 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
30800 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
30810 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
30820 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
30830 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
30840 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
30850 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
30860 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
30870 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
30880 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
30890 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
308a0 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
308b0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
308c0 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
308d0 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
308e0 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
308f0 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
30900 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
30910 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
30920 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
30930 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
30940 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
30950 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
30960 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
30970 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
30980 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
30990 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
309a0 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
309b0 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
309c0 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
309d0 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
309e0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
309f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
30a00 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
30a10 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
30a20 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
30a30 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
30a40 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
30a50 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
30a60 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
30a70 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
30a80 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
30a90 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
30aa0 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
30ab0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
30ac0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
30ad0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
30ae0 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
30af0 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
30b00 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
30b10 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
30b20 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
30b30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30b40 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
30b50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
30b60 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30b70 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
30b80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
30b90 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
30ba0 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
30bb0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
30bc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30bd0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
30be0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
30bf0 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
30c00 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
30c10 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
30c20 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
30c30 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
30c40 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
30c50 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
30c60 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
30c70 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
30c80 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
30c90 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
30ca0 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
30cb0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
30cc0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
30cd0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
30ce0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
30cf0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
30d00 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
30d10 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
30d20 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
30d30 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
30d40 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
30d50 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
30d60 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
30d70 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
30d80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30d90 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
30da0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30db0 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
30dc0 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
30dd0 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
30de0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30df0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
30e00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30e10 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
30e20 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
30e30 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
30e40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30e50 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30e60 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
30e70 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
30e80 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
30e90 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
30ea0 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
30eb0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
30ec0 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
30ed0 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
30ee0 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
30ef0 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
30f00 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
30f10 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
30f20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
30f30 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30f40 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
30f50 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
30f60 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
30f70 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
30f80 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
30f90 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
30fa0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30fb0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
30fc0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
30fd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30fe0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
30ff0 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
31000 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
31010 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
31020 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
31030 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
31040 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
31050 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
31060 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
31070 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
31080 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
31090 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
310a0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
310b0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
310c0 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
310d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
310e0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
310f0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
31100 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
31110 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
31120 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
31130 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
31140 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
31150 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
31160 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
31170 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
31180 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
31190 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
311a0 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
311b0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
311c0 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
311d0 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
311e0 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
311f0 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
31200 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
31210 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
31220 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
31230 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
31240 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
31250 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
31260 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
31270 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
31280 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
31290 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
312a0 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
312b0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
312c0 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
312d0 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
312e0 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
312f0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
31300 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
31310 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
31320 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
31330 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
31340 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
31350 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
31360 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
31370 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
31380 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
31390 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
313a0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
313b0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
313c0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
313d0 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
313e0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
313f0 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
31400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31410 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
31420 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
31430 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
31440 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
31450 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
31460 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
31470 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
31480 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
31490 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
314a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
314b0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
314c0 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
314d0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
314e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314f0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
31500 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
31510 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31530 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
31540 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
31550 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
31560 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
31570 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
31580 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
31590 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
315a0 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
315b0 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
315c0 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
315d0 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
315e0 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e  iPage<2 ) return
315f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31600 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d  BKPT;.  if( pMem
31610 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
31620 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
31630 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
31640 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
31650 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
31660 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
31670 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
31680 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
31690 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
316a0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
316b0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
316c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
316d0 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
316e0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
316f0 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31700 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
31710 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31720 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
31730 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31740 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
31750 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
31760 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
31770 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
31780 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
31790 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
317a0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
317b0 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
317c0 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
317d0 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
317e0 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
317f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31800 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
31810 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
31820 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
31830 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
31840 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
31850 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
31860 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
31870 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
31880 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
31890 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
318a0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
318b0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
318c0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
318d0 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
318e0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
318f0 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
31900 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
31910 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
31920 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
31930 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
31940 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
31950 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
31960 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
31970 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
31980 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
31990 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
319a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
319b0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
319c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
319d0 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
319e0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
319f0 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
31a00 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
31a10 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
31a20 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
31a30 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
31a40 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
31a50 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
31a60 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
31a70 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
31a80 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
31a90 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
31aa0 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
31ab0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
31ac0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
31ad0 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
31ae0 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
31af0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
31b00 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
31b10 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
31b20 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
31b30 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
31b40 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
31b50 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
31b60 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
31b70 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
31b80 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
31b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31ba0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
31bb0 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
31bc0 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
31bd0 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
31be0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31bf0 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
31c00 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
31c10 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
31c20 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
31c30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31c40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
31c50 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
31c60 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
31c70 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
31c80 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
31c90 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
31ca0 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
31cb0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
31cc0 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
31cd0 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
31ce0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31cf0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
31d00 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
31d10 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
31d20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
31d30 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31d40 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
31d50 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
31d60 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
31d70 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
31d80 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
31d90 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
31da0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
31db0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
31dc0 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
31dd0 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
31de0 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
31df0 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
31e00 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
31e10 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
31e20 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
31e30 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
31e40 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
31e50 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
31e60 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
31e70 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
31e80 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31e90 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
31ea0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
31eb0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
31ec0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
31ed0 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
31ee0 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
31ef0 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
31f00 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
31f10 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
31f20 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
31f30 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
31f40 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
31f50 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
31f60 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
31f70 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
31f80 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
31f90 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
31fa0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
31fb0 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
31fc0 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
31fd0 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
31fe0 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
31ff0 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
32000 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
32010 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
32020 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
32030 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
32040 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
32050 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
32060 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
32070 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
32080 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
32090 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
320a0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
320b0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
320c0 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
320d0 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
320e0 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
320f0 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
32100 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
32110 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
32120 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
32130 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
32140 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
32150 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
32160 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
32170 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
32180 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
32190 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
321a0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
321b0 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
321c0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
321d0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
321e0 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
321f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
32200 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32210 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
32220 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
32230 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
32240 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
32250 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
32260 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
32270 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
32280 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
32290 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
322a0 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
322b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
322c0 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
322d0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
322e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
322f0 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
32300 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
32310 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
32320 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
32330 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
32340 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
32350 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
32360 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
32370 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32380 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
32390 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
323a0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
323b0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
323c0 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
323d0 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
323e0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
323f0 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
32400 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
32410 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
32420 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
32430 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
32440 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
32450 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
32460 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
32470 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
32480 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
32490 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
324a0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
324b0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
324c0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
324d0 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
324e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
324f0 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
32500 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
32510 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32520 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
32530 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
32540 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
32550 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32560 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
32570 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
32580 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
32590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
325a0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
325b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
325c0 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
325d0 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
325e0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
325f0 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
32600 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
32610 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
32620 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
32630 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
32640 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
32650 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
32660 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
32670 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
32680 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
32690 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
326a0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
326b0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
326c0 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
326d0 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
326e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
326f0 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
32700 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
32710 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
32720 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
32730 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
32740 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
32750 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
32760 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
32770 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
32780 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
32790 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
327a0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
327b0 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
327c0 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
327d0 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
327e0 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
327f0 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
32800 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
32810 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
32820 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
32830 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
32840 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
32850 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
32860 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
32870 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
32880 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
32890 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
328a0 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
328b0 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20  /.  u16 *pnSize 
328c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
328d0 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f  Write the size o
328e0 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20  f the Cell here 
328f0 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
32900 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
32910 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
32920 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
32930 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
32940 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
32950 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
32960 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
32970 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
32980 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
32990 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
329a0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
329b0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
329c0 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
329d0 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66  nSize;.  if( inf
329e0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
329f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32a00 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
32a10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
32a20 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
32a30 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
32a40 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c 2b    }.  if( pCell+
32a50 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33  info.iOverflow+3
32a60 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 2b   > pPage->aData+
32a70 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
32a80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32a90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
32aa0 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65  T;  /* Cell exte
32ab0 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66 20  nds past end of 
32ac0 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  page */.  }.  ov
32ad0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
32ae0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
32af0 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73 73  verflow]);.  ass
32b00 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
32b10 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76  Size > 4 );.  ov
32b20 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74  flPageSize = pBt
32b30 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
32b40 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66  ;.  nOvfl = (inf
32b50 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66  o.nPayload - inf
32b60 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50  o.nLocal + ovflP
32b70 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66  ageSize - 1)/ovf
32b80 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  lPageSize;.  ass
32b90 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20  ert( nOvfl>0 || 
32ba0 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44 42  .    (CORRUPT_DB
32bb0 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f   && (info.nPaylo
32bc0 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  ad + ovflPageSiz
32bd0 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65 29  e)<ovflPageSize)
32be0 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  .  );.  while( n
32bf0 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67  Ovfl-- ){.    Pg
32c00 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20  no iNext = 0;.  
32c10 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c    MemPage *pOvfl
32c20 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f 76   = 0;.    if( ov
32c30 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c  flPgno<2 || ovfl
32c40 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63 6f  Pgno>btreePageco
32c50 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
32c60 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61 20    /* 0 is not a 
32c70 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  legal page numbe
32c80 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61 6e  r and page 1 can
32c90 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20 20  not be an .     
32ca0 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   ** overflow pag
32cb0 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66 20  e. Therefore if 
32cc0 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61  ovflPgno<2 or pa
32cd0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
32ce0 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  e .      ** file
32cf0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 75   the database mu
32d00 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 2a  st be corrupt. *
32d10 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
32d20 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32d30 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
32d40 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
32d50 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
32d60 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
32d70 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
32d80 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
32d90 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
32da0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 28      }..    if( (
32db0 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66   pOvfl || ((pOvf
32dc0 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  l = btreePageLoo
32dd0 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  kup(pBt, ovflPgn
32de0 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20 26  o))!=0) ).     &
32df0 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  & sqlite3PagerPa
32e00 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c  geRefcount(pOvfl
32e10 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20 20  ->pDbPage)!=1.  
32e20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68    ){.      /* Th
32e30 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e  ere is no reason
32e40 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f 75   any cursor shou
32e50 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73 74  ld have an outst
32e60 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
32e70 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e   .      ** to an
32e80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 62   overflow page b
32e90 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63 65  elonging to a ce
32ea0 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ll that is being
32eb0 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65 64   deleted/updated
32ec0 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69 66  ..      ** So if
32ed0 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d 6f   there exists mo
32ee0 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
32ef0 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70 61  rence to this pa
32f00 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20 20  ge, then it .   
32f10 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72     ** must not r
32f20 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65 72  eally be an over
32f30 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74 68  flow page and th
32f40 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
32f50 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20 20  be corrupt. .   
32f60 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c 70     ** It is help
32f70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74 68  ful to detect th
32f80 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  is before callin
32f90 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20 61  g freePage2(), a
32fa0 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65 65  s .      ** free
32fb0 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72 6f  Page2() may zero
32fc0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
32fd0 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65 6c  ts if secure-del
32fe0 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20 20  ete mode is.    
32ff0 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66    ** enabled. If
33000 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77 27   this 'overflow'
33010 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74 6f   page happens to
33020 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74 20   be a page that 
33030 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c  the.      ** cal
33040 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e 67  ler is iterating
33050 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69 6e   through or usin
33060 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20  g in some other 
33070 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20 20  way, this.      
33080 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c 65  ** can be proble
33090 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a  matic..      */.
330a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
330b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
330c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
330d0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32 28   rc = freePage2(
330e0 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c  pBt, pOvfl, ovfl
330f0 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Pgno);.    }..  
33100 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
33110 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
33120 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
33130 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
33140 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
33150 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
33160 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
33170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33180 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
33190 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
331a0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
331b0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
331c0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
331d0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
331e0 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
331f0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
33200 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
33210 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
33220 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
33230 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
33240 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
33250 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
33260 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
33270 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
33280 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
33290 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
332a0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
332b0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
332c0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
332d0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
332e0 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
332f0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
33300 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
33310 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
33320 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
33330 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
33340 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
33350 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
33360 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
33370 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
33380 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
33390 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
333a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
333b0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
333c0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
333d0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
333e0 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
333f0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
33400 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
33410 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
33420 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
33430 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
33440 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
33450 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
33460 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
33470 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
33480 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
33490 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
334a0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
334b0 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
334c0 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
334d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
33500 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
33510 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
33520 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
33530 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
33540 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
33550 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
33560 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
33570 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
33580 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
33590 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
335a0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
335b0 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
335c0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
335d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
335e0 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
335f0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a    int nHeader;..
33600 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
33610 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
33620 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
33630 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
33640 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
33650 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e 63  y writeable sinc
33660 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62 65  e pCell might be
33670 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20   auxiliary.  ** 
33680 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68 61  buffer space tha
33690 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66 72  t is separate fr
336a0 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75 66  om the pPage buf
336b0 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61 73  fer area */.  as
336c0 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61 67  sert( pCell<pPag
336d0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65 6c  e->aData || pCel
336e0 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61  l>=&pPage->aData
336f0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a  [pBt->pageSize].
33700 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
33710 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
33720 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
33730 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  bPage) );..  /* 
33740 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64  Fill in the head
33750 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72  er. */.  nHeader
33760 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
33770 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
33780 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
33790 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
337a0 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
337b0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
337c0 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
337d0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
337e0 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  oad);.  }else{. 
337f0 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61     assert( nData
33800 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
33810 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20  t( nZero==0 );. 
33820 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
33830 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
33840 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
33850 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f  *)&nKey);.  .  /
33860 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61  * Fill in the pa
33870 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20  yload size */.  
33880 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
33890 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20  y ){.    pSrc = 
338a0 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20  pData;.    nSrc 
338b0 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61  = nData;.    nDa
338c0 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ta = 0;.  }else{
338d0 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b   .    assert( nK
338e0 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26  ey<=0x7fffffff &
338f0 26 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  & pKey!=0 );.   
33900 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74   nPayload = (int
33910 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20  )nKey;.    pSrc 
33920 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63  = pKey;.    nSrc
33930 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20   = (int)nKey;.  
33940 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  }.  if( nPayload
33950 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
33960 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65  l ){.    n = nHe
33970 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b  ader + nPayload;
33980 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e  .    testcase( n
33990 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ==3 );.    testc
339a0 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20  ase( n==4 );.   
339b0 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34   if( n<4 ) n = 4
339c0 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20  ;.    *pnSize = 
339d0 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74  n;.    spaceLeft
339e0 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
339f0 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b   pPrior = pCell;
33a00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
33a10 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69  t mn = pPage->mi
33a20 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20  nLocal;.    n = 
33a30 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  mn + (nPayload -
33a40 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70   mn) % (pPage->p
33a50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
33a60 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
33a70 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  e( n==pPage->max
33a80 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73  Local );.    tes
33a90 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
33aa0 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
33ab0 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65     if( n > pPage
33ac0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d  ->maxLocal ) n =
33ad0 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65   mn;.    spaceLe
33ae0 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53  ft = n;.    *pnS
33af0 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65  ize = n + nHeade
33b00 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f  r + 4;.    pPrio
33b10 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64  r = &pCell[nHead
33b20 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61  er+n];.  }.  pPa
33b30 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e  yload = &pCell[n
33b40 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41  Header];..  /* A
33b50 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72  t this point var
33b60 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65  iables should be
33b70 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a   set as follows:
33b80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61  .  **.  **   nPa
33b90 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20  yload           
33ba0 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69  Total payload si
33bb0 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a  ze in bytes.  **
33bc0 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20     pPayload     
33bd0 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74        Begin writ
33be0 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65  ing payload here
33bf0 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66  .  **   spaceLef
33c00 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65  t          Space
33c10 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50   available at pP
33c20 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79  ayload.  If nPay
33c30 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a  load>spaceLeft,.
33c40 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
33c50 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d            that m
33c60 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73  eans content mus
33c70 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65  t spill into ove
33c80 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a  rflow pages..  *
33c90 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20  *   *pnSize     
33ca0 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74         Size of t
33cb0 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e  he local cell (n
33cc0 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72  ot counting over
33cd0 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a  flow pages).  **
33ce0 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20     pPrior       
33cf0 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77        Where to w
33d00 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66  rite the pgno of
33d10 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
33d20 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20  low page.  **.  
33d30 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f  ** Use a call to
33d40 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
33d50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74  tr() to verify t
33d60 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61  hat the values a
33d70 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63  bove.  ** were c
33d80 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c  omputed correctl
33d90 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49  y..  */.#if SQLI
33da0 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  TE_DEBUG.  {.   
33db0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
33dc0 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
33dd0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
33de0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
33df0 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d  assert( nHeader=
33e00 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c  (int)(info.pPayl
33e10 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a  oad - pCell) );.
33e20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f      assert( info
33e30 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
33e40 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69     assert( *pnSi
33e50 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ze == info.nSize
33e60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33e70 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66  spaceLeft == inf
33e80 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20  o.nLocal );.    
33e90 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 20 3d  assert( pPrior =
33ea0 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  = &pCell[info.iO
33eb0 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d 0a  verflow] );.  }.
33ec0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69  #endif..  /* Wri
33ed0 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69  te the payload i
33ee0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65  nto the local Ce
33ef0 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61  ll and any extra
33f00 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   into overflow p
33f10 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28  ages */.  while(
33f20 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
33f30 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
33f40 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ==0 ){.#ifndef S
33f50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
33f60 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f  ACUUM.      Pgno
33f70 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67   pgnoPtrmap = pg
33f80 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66  noOvfl; /* Overf
33f90 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72  low page pointer
33fa0 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20  -map entry page 
33fb0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
33fc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
33fd0 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
33fe0 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b        pgnoOvfl++
33ff0 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c  ;.        } whil
34000 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54  e( .          PT
34010 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
34020 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67   pgnoOvfl) || pg
34030 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f  noOvfl==PENDING_
34040 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a  BYTE_PAGE(pBt) .
34050 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
34060 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
34070 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
34080 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
34090 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
340a0 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66  gnoOvfl, 0);.#if
340b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
340c0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
340d0 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61    /* If the data
340e0 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61 75  base supports au
340f0 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74  to-vacuum, and t
34100 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62  he second or sub
34110 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a  sequent.      **
34120 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
34130 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65  s being allocate
34140 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20  d, add an entry 
34150 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
34160 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  ap.      ** for 
34170 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a  that page now. .
34180 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
34190 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
341a0 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20   first overflow 
341b0 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65  page, then write
341c0 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79   a partial entry
341d0 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68   .      ** to th
341e0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49  e pointer-map. I
341f0 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69  f we write nothi
34200 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ng to this point
34210 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20  er-map slot,.   
34220 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f     ** then the o
34230 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c  ptimistic overfl
34240 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73  ow chain process
34250 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c  ing in clearCell
34260 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20  ().      ** may 
34270 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68 65  misinterpret the
34280 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
34290 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65  alues and delete
342a0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72   the.      ** wr
342b0 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74  ong pages from t
342c0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
342d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
342e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
342f0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
34300 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
34310 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d  Type = (pgnoPtrm
34320 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ap?PTRMAP_OVERFL
34330 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46  OW2:PTRMAP_OVERF
34340 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70  LOW1);.        p
34350 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
34360 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70  noOvfl, eType, p
34370 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b  gnoPtrmap, &rc);
34380 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
34390 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  ){.          rel
343a0 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  easePage(pOvfl);
343b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
343c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
343d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
343e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
343f0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34400 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34410 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
34420 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  If pToRelease is
34430 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70   not zero than p
34440 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74  Prior points int
34450 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
34460 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52        ** of pToR
34470 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75  elease.  Make su
34480 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73  re pToRelease is
34490 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
344a0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
344b0 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30  t( pToRelease==0
344c0 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
344d0 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52  Iswriteable(pToR
344e0 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29  elease->pDbPage)
344f0 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66   );..      /* If
34500 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74 20   pPrior is part 
34510 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65 61  of the data area
34520 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20   of pPage, then 
34530 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a  make sure pPage.
34540 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c        ** is stil
34550 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
34560 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 72       assert( pPr
34570 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  ior<pPage->aData
34580 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61   || pPrior>=&pPa
34590 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70  ge->aData[pBt->p
345a0 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20  ageSize].       
345b0 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50       || sqlite3P
345c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
345d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
345e0 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79  );..      put4by
345f0 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
34600 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
34610 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34620 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
34630 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
34640 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
34650 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
34660 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
34670 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
34680 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
34690 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
346a0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
346b0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
346c0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
346d0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
346e0 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
346f0 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20   = spaceLeft;.. 
34700 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34710 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34720 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f  than pPayload po
34730 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
34740 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f  ta area.    ** o
34750 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34760 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34770 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34780 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  teable. */.    a
34790 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
347a0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
347b0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
347c0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
347d0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  age) );..    /* 
347e0 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70  If pPayload is p
347f0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
34800 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
34810 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
34820 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74  age.    ** is st
34830 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f  ill writeable */
34840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
34850 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61  yload<pPage->aDa
34860 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d  ta || pPayload>=
34870 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
34880 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
34890 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
348a0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
348b0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
348c0 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  ge) );..    if( 
348d0 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSrc>0 ){.      
348e0 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d  if( n>nSrc ) n =
348f0 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73   nSrc;.      ass
34900 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20  ert( pSrc );.   
34910 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f     memcpy(pPaylo
34920 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20  ad, pSrc, n);.  
34930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
34940 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20  emset(pPayload, 
34950 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20  0, n);.    }.   
34960 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a   nPayload -= n;.
34970 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20      pPayload += 
34980 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e  n;.    pSrc += n
34990 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b  ;.    nSrc -= n;
349a0 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d  .    spaceLeft -
349b0 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  = n;.    if( nSr
349c0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53  c==0 ){.      nS
349d0 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20  rc = nData;.    
349e0 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a    pSrc = pData;.
349f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65      }.  }.  rele
34a00 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
34a10 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  se);.  return SQ
34a20 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
34a30 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
34a40 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
34a50 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34a60 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
34a70 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
34a80 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
34a90 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
34aa0 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
34ab0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
34ac0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
34ad0 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
34ae0 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
34af0 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
34b00 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
34b10 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
34b20 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
34b30 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
34b40 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
34b50 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
34b60 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
34b70 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
34b80 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
34b90 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69  t idx, int sz, i
34ba0 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20  nt *pRC){.  u32 
34bb0 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
34bc0 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
34bd0 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
34be0 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
34bf0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
34c00 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
34c10 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
34c20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
34c30 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
34c40 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
34c50 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
34c60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
34c70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
34c80 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a  t hdr;        /*
34c90 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   Beginning of th
34ca0 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73  e header.  0 mos
34cb0 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70 61  t pages.  100 pa
34cc0 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  ge 1 */..  if( *
34cd0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
34ce0 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
34cf0 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
34d00 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
34d10 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73   CORRUPT_DB || s
34d20 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
34d30 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
34d40 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
34d50 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
34d60 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
34d70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34d80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
34d90 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
34da0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
34db0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
34dc0 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  = &pPage->aCellI
34dd0 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20  dx[2*idx];.  pc 
34de0 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
34df0 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
34e00 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73  hdrOffset;.  tes
34e10 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62  tcase( pc==get2b
34e20 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
34e30 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  ) );.  testcase(
34e40 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70   pc+sz==pPage->p
34e50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
34e60 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75 33  ;.  if( pc < (u3
34e70 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74 61  2)get2byte(&data
34e80 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73  [hdr+5]) || pc+s
34e90 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
34ea0 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20  usableSize ){.  
34eb0 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f    *pRC = SQLITE_
34ec0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
34ed0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
34ee0 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28 70  rc = freeSpace(p
34ef0 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20  Page, pc, sz);. 
34f00 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a   if( rc ){.    *
34f10 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65  pRC = rc;.    re
34f20 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67  turn;.  }.  pPag
34f30 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66  e->nCell--;.  if
34f40 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
34f50 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
34f60 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
34f70 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64   4);.    data[hd
34f80 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75  r+7] = 0;.    pu
34f90 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
34fa0 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d  +5], pPage->pBt-
34fb0 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20  >usableSize);.  
34fc0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
34fd0 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
34fe0 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d  bleSize - pPage-
34ff0 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20  >hdrOffset.     
35000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35010 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64    - pPage->child
35020 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d  PtrSize - 8;.  }
35030 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76  else{.    memmov
35040 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a  e(ptr, ptr+2, 2*
35050 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
35060 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62  idx));.    put2b
35070 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d  yte(&data[hdr+3]
35080 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  , pPage->nCell);
35090 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
350a0 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f  e += 2;.  }.}../
350b0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
350c0 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20  w cell on pPage 
350d0 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69  at cell index "i
350e0 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73  ".  pCell points
350f0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65   to the.** conte
35100 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  nt of the cell..
35110 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  **.** If the cel
35120 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66  l content will f
35130 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  it on the page, 
35140 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72  then put it ther
35150 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c  e.  If it.** wil
35160 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20  l not fit, then 
35170 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
35180 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35190 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a  into pTemp if.**
351a0 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75   pTemp is not nu
351b0 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20  ll.  Regardless 
351c0 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61  of pTemp, alloca
351d0 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a  te a new entry.*
351e0 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76  * in pPage->apOv
351f0 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74  fl[] and make it
35200 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65   point to the ce
35210 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68  ll content (eith
35220 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f  er.** in pTemp o
35230 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  r the original p
35240 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72  Cell) and also r
35250 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e  ecord its index.
35260 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20   .** Allocating 
35270 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70  a new entry in p
35280 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d  Page->aCell[] im
35290 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70  plies that .** p
352a0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
352b0 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a  is incremented..
352c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
352d0 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
352e0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
352f0 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
35300 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
35310 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
35320 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
35330 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
35340 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
35350 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
35360 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
35370 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
35380 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
35390 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
353a0 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
353b0 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
353c0 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
353d0 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
353e0 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
353f0 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
35400 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20  .  Pgno iChild, 
35410 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a       /* If non-z
35420 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72  ero, replace fir
35430 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20  st 4 bytes with 
35440 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20  this value */.  
35450 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20  int *pRC        
35460 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72    /* Read and wr
35470 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  ite return code 
35480 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  from here */.){.
35490 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20    int idx = 0;  
354a0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
354b0 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
354c0 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
354d0 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
354e0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
354f0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20  counter */.  u8 
35500 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
35510 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
35520 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
35530 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20  */.  u8 *pIns;  
35540 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
35550 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43  int in pPage->aC
35560 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e  ellIdx[] where n
35570 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  o cell inserted 
35580 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29  */..  if( *pRC )
35590 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65   return;..  asse
355a0 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70  rt( i>=0 && i<=p
355b0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67  Page->nCell+pPag
355c0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a  e->nOverflow );.
355d0 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
355e0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31  L(pPage->pBt)<=1
355f0 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0921 );.  assert
35600 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d  ( pPage->nCell<=
35610 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
35620 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  Bt) || CORRUPT_D
35630 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
35640 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c  Page->nOverflow<
35650 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
35660 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->apOvfl) );.  a
35670 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a 65  ssert( ArraySize
35680 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d  (pPage->apOvfl)=
35690 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67 65  =ArraySize(pPage
356a0 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61  ->aiOvfl) );.  a
356b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
356c0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
356d0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
356e0 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68    /* The cell sh
356f0 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65  ould normally be
35700 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79   sized correctly
35710 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
35720 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d   moving a.  ** m
35730 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72  alformed cell fr
35740 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20 74  om a leaf page t
35750 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61  o an interior pa
35760 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20  ge, if the cell 
35770 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64  size.  ** wanted
35780 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e   to be less than
35790 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64   4 but got round
357a0 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68  ed up to 4 on th
357b0 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a  e leaf, then siz
357c0 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20  e.  ** might be 
357d0 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61  less than 8 (lea
357e0 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72  f-size + pointer
357f0 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f  ) on the interio
35800 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20  r node.  Hence. 
35810 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74   ** the term aft
35820 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65  er the || in the
35830 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
35840 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  t(). */.  assert
35850 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65  ( sz==pPage->xCe
35860 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43  llSize(pPage, pC
35870 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26  ell) || (sz==8 &
35880 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20  & iChild>0) );. 
35890 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
358a0 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
358b0 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
358c0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
358d0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
358e0 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20  p, pCell, sz);. 
358f0 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65       pCell = pTe
35900 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  mp;.    }.    if
35910 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20  ( iChild ){.    
35920 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
35930 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d  , iChild);.    }
35940 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
35950 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
35960 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29   assert( j<(int)
35970 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61  (sizeof(pPage->a
35980 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  pOvfl)/sizeof(pP
35990 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29  age->apOvfl[0]))
359a0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61   );.    pPage->a
359b0 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c  pOvfl[j] = pCell
359c0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f  ;.    pPage->aiO
359d0 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b  vfl[j] = (u16)i;
359e0 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75  ..    /* When mu
359f0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
35a00 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72 65   occur, they are
35a10 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69   always sequenti
35a20 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a  al and in.    **
35a30 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20   sorted order.  
35a40 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20  This invariants 
35a50 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d 75  arise because mu
35a60 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73  ltiple overflows
35a70 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79   can.    ** only
35a80 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65   occur when inse
35a90 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63 65  rting divider ce
35aa0 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72  lls into the par
35ab0 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a  ent page during.
35ac0 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67      ** balancing
35ad0 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65  , and the divide
35ae0 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20  rs are adjacent 
35af0 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20  and sorted..    
35b00 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  */.    assert( j
35b10 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69  ==0 || pPage->ai
35b20 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69  Ovfl[j-1]<(u16)i
35b30 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73   ); /* Overflows
35b40 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
35b50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
35b60 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65  j==0 || i==pPage
35b70 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20  ->aiOvfl[j-1]+1 
35b80 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  );   /* Overflow
35b90 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c  s are sequential
35ba0 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
35bb0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
35bc0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
35bd0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
35be0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35bf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43  OK ){.      *pRC
35c00 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
35c10 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  urn;.    }.    a
35c20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
35c30 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
35c40 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
35c50 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61  ;.    data = pPa
35c60 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61  ge->aData;.    a
35c70 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50 61  ssert( &data[pPa
35c80 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d  ge->cellOffset]=
35c90 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  =pPage->aCellIdx
35ca0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c   );.    rc = all
35cb0 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
35cc0 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20  , sz, &idx);.   
35cd0 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20   if( rc ){ *pRC 
35ce0 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a  = rc; return; }.
35cf0 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63      /* The alloc
35d00 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74 69  ateSpace() routi
35d10 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  ne guarantees th
35d20 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70  e following prop
35d30 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66  erties.    ** if
35d40 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63 63   it returns succ
35d50 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20  essfully */.    
35d60 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30  assert( idx >= 0
35d70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
35d80 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65  idx >= pPage->ce
35d90 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
35da0 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52  ->nCell+2 || COR
35db0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61  RUPT_DB );.    a
35dc0 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d  ssert( idx+sz <=
35dd0 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74   (int)pPage->pBt
35de0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
35df0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
35e00 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a   -= (u16)(2 + sz
35e10 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
35e20 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c  ata[idx], pCell,
35e30 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43   sz);.    if( iC
35e40 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75  hild ){.      pu
35e50 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64 78  t4byte(&data[idx
35e60 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  ], iChild);.    
35e70 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61  }.    pIns = pPa
35e80 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69  ge->aCellIdx + i
35e90 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  *2;.    memmove(
35ea0 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a  pIns+2, pIns, 2*
35eb0 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20  (pPage->nCell - 
35ec0 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  i));.    put2byt
35ed0 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20  e(pIns, idx);.  
35ee0 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b    pPage->nCell++
35ef0 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65  ;.    /* increme
35f00 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  nt the cell coun
35f10 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b  t */.    if( (++
35f20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
35f30 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64  ffset+4])==0 ) d
35f40 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
35f50 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61  fset+3]++;.    a
35f60 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65 28  ssert( get2byte(
35f70 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  &data[pPage->hdr
35f80 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67  Offset+3])==pPag
35f90 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e  e->nCell );.#ifn
35fa0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35fb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
35fc0 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
35fd0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
35fe0 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
35ff0 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
36000 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
36010 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
36020 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
36030 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
36040 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
36050 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
36060 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
36070 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76       ptrmapPutOv
36080 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
36090 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a  ll, pRC);.    }.
360a0 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
360b0 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20  .** A CellArray 
360c0 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20  object contains 
360d0 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74  a cache of point
360e0 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f  ers and sizes fo
360f0 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69  r a.** consecuti
36100 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63  ve sequence of c
36110 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20  ells that might 
36120 62 65 20 68 65 6c 64 20 6d 75 6c 74 69 70 6c 65  be held multiple
36130 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64   pages..*/.typed
36140 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72  ef struct CellAr
36150 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73  ray CellArray;.s
36160 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20  truct CellArray 
36170 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  {.  int nCell;  
36180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
36190 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
361a0 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
361b0 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20  MemPage *pRef;  
361c0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72          /* Refer
361d0 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75  ence page */.  u
361e0 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
361f0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65         /* All ce
36200 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63  lls begin balanc
36210 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
36220 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36230 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
36240 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
36250 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  Cell[] */.};../*
36260 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
36270 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20  e cell sizes at 
36280 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c  idx, idx+1, ...,
36290 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65   idx+N-1 have be
362a0 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a  en.** computed..
362b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
362c0 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65  opulateCellCache
362d0 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69  (CellArray *p, i
362e0 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a  nt idx, int N){.
362f0 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
36300 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43   && idx+N<=p->nC
36310 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ell );.  while( 
36320 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  N>0 ){.    asser
36330 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  t( p->apCell[idx
36340 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ]!=0 );.    if( 
36350 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d  p->szCell[idx]==
36360 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a  0 ){.      p->sz
36370 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70  Cell[idx] = p->p
36380 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
36390 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
363a0 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c  l[idx]);.    }el
363b0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
363c0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a  ( CORRUPT_DB ||.
363d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
363e0 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d  >szCell[idx]==p-
363f0 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65  >pRef->xCellSize
36400 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43  (p->pRef, p->apC
36410 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20  ell[idx]) );.   
36420 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20   }.    idx++;.  
36430 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a    N--;.  }.}../*
36440 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
36450 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20 65  ize of the Nth e
36460 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 65  lement of the ce
36470 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74  ll array.*/.stat
36480 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
36490 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43 65  NE u16 computeCe
364a0 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79  llSize(CellArray
364b0 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
364c0 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
364d0 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  <p->nCell );.  a
364e0 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c  ssert( p->szCell
364f0 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73  [N]==0 );.  p->s
36500 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52  zCell[N] = p->pR
36510 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d  ef->xCellSize(p-
36520 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c  >pRef, p->apCell
36530 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  [N]);.  return p
36540 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73  ->szCell[N];.}.s
36550 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65 64  tatic u16 cached
36560 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72  CellSize(CellArr
36570 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20  ay *p, int N){. 
36580 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26   assert( N>=0 &&
36590 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20   N<p->nCell );. 
365a0 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e   if( p->szCell[N
365b0 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a  ] ) return p->sz
365c0 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72  Cell[N];.  retur
365d0 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a  n computeCellSiz
365e0 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(p, N);.}../*.*
365f0 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d  * Array apCell[]
36600 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65   contains pointe
36610 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72  rs to nCell b-tr
36620 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54  ee page cells. T
36630 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20  he .** szCell[] 
36640 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74  array contains t
36650 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
36660 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54   of each cell. T
36670 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
36680 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75 72  replaces the cur
36690 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  rent contents of
366a0 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20 74   page pPg with t
366b0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
366c0 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79  he cell.** array
366d0 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20  ..**.** Some of 
366e0 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  the cells in apC
366f0 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e  ell[] may curren
36700 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e  tly be stored in
36710 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75   pPg. This.** fu
36720 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f  nction works aro
36730 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75  und problems cau
36740 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20 6d  sed by this by m
36750 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20  aking a copy of 
36760 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c  any .** such cel
36770 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72  ls before overwr
36780 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20 64  iting the page d
36790 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d  ata..**.** The M
367a0 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65  emPage.nFree fie
367b0 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65  ld is invalidate
367c0 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
367d0 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  on. It is the .*
367e0 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
367f0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
36800 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74  o set it correct
36810 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
36820 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20  t rebuildPage(. 
36830 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
36840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36850 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70 61   /* Edit this pa
36860 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ge */.  int nCel
36870 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
36880 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c          /* Final
36890 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
368a0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38   on page */.  u8
368b0 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
368c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
368d0 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
368e0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
368f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36900 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
36910 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29   cell sizes */.)
36920 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
36930 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73  r = pPg->hdrOffs
36940 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
36950 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65 72  Offset of header
36960 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20   on pPg */.  u8 
36970 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20  * const aData = 
36980 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20  pPg->aData;     
36990 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
369a0 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67   to data for pPg
369b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
369c0 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67  usableSize = pPg
369d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
369e0 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  e;.  u8 * const 
369f0 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73  pEnd = &aData[us
36a00 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74  ableSize];.  int
36a10 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   i;.  u8 *pCellp
36a20 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49  tr = pPg->aCellI
36a30 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d  dx;.  u8 *pTmp =
36a40 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
36a50 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d  pSpace(pPg->pBt-
36a60 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a  >pPager);.  u8 *
36a70 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65  pData;..  i = ge
36a80 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36a90 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
36aa0 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61  &pTmp[i], &aData
36ab0 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20  [i], usableSize 
36ac0 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d  - i);..  pData =
36ad0 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30   pEnd;.  for(i=0
36ae0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
36af0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
36b00 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20   apCell[i];.    
36b10 69 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61 20  if( pCell>aData 
36b20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b  && pCell<pEnd ){
36b30 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26  .      pCell = &
36b40 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61  pTmp[pCell - aDa
36b50 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ta];.    }.    p
36b60 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69  Data -= szCell[i
36b70 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  ];.    put2byte(
36b80 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61  pCellptr, (pData
36b90 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
36ba0 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
36bb0 20 20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70     if( pData < p
36bc0 43 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e  Cellptr ) return
36bd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
36be0 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79  BKPT;.    memcpy
36bf0 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73  (pData, pCell, s
36c00 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61  zCell[i]);.    a
36c10 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d  ssert( szCell[i]
36c20 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65  ==pPg->xCellSize
36c30 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20  (pPg, pCell) || 
36c40 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
36c50 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65    testcase( szCe
36c60 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c  ll[i]!=pPg->xCel
36c70 6c 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29  lSize(pPg,pCell)
36c80 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68   );.  }..  /* Th
36c90 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
36ca0 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e  ld is now set in
36cb0 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63  correctly. The c
36cc0 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69  aller will fix i
36cd0 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65  t. */.  pPg->nCe
36ce0 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50  ll = nCell;.  pP
36cf0 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  g->nOverflow = 0
36d00 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  ;..  put2byte(&a
36d10 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b  Data[hdr+1], 0);
36d20 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61  .  put2byte(&aDa
36d30 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e  ta[hdr+3], pPg->
36d40 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79  nCell);.  put2by
36d50 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d  te(&aData[hdr+5]
36d60 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29  , pData - aData)
36d70 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d  ;.  aData[hdr+7]
36d80 20 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72   = 0x00;.  retur
36d90 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
36da0 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65  /*.** Array apCe
36db0 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43  ll[] contains nC
36dc0 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  ell pointers to 
36dd0 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72  b-tree cells. Ar
36de0 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f  ray szCell.** co
36df0 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20  ntains the size 
36e00 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68  in bytes of each
36e10 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73   such cell. This
36e20 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
36e30 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68  ts to .** add th
36e40 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69  e cells stored i
36e50 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 70  n the array to p
36e60 61 67 65 20 70 50 67 2e 20 49 66 20 69 74 20 63  age pPg. If it c
36e70 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a  annot (because .
36e80 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  ** the page need
36e90 73 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65  s to be defragme
36ea0 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  nted before the 
36eb0 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c  cells will fit),
36ec0 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20   non-zero.** is 
36ed0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
36ee0 69 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  ise, if the cell
36ef0 73 20 61 72 65 20 61 64 64 65 64 20 73 75 63 63  s are added succ
36f00 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69  essfully, zero i
36f10 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s.** returned..*
36f20 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43  *.** Argument pC
36f30 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f  ellptr points to
36f40 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
36f50 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   in the cell-poi
36f60 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70  nter array.** (p
36f70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 67 29  art of page pPg)
36f80 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66   to populate. Af
36f90 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b  ter cell apCell[
36fa0 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  0] is written to
36fb0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64   the.** page bod
36fc0 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73  y, a 16-bit offs
36fd0 65 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  et is written to
36fe0 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73   pCellptr. And s
36ff0 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a  o on, for each.*
37000 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72  * cell in the ar
37010 72 61 79 2e 20 49 74 20 69 73 20 74 68 65 20 72  ray. It is the r
37020 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
37030 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
37040 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74  nsure.** that it
37050 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72   is safe to over
37060 77 72 69 74 65 20 74 68 69 73 20 70 61 72 74 20  write this part 
37070 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  of the cell-poin
37080 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  ter array..**.**
37090 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
370a0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a  ion is called, *
370b0 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f  ppData points to
370c0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
370d0 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72  e .** content ar
370e0 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20  ea on page pPg. 
370f0 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  If the size of t
37100 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  he content area 
37110 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20  is extended,.** 
37120 2a 70 70 44 61 74 61 20 69 73 20 75 70 64 61 74  *ppData is updat
37130 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
37140 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20  he new start of 
37150 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  the content area
37160 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
37170 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61  ning..**.** Fina
37180 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42  lly, argument pB
37190 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74  egin points to t
371a0 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
371b0 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
371c0 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
371d0 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62  space required b
371e0 79 20 74 68 69 73 20 70 61 67 65 20 66 6f 72 20  y this page for 
371f0 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72  the cell-pointer
37200 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c   area (for.** al
37210 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75  l cells - not ju
37220 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65  st those inserte
37230 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74  d by the current
37240 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63   call). If the c
37250 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d  ontent.** area m
37260 75 73 74 20 62 65 20 65 78 74 65 6e 64 65 64 20  ust be extended 
37270 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20 70  to before this p
37280 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  oint in order to
37290 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a   accomodate all.
372a0 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ** cells in apCe
372b0 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63  ll[], then the c
372c0 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20  ells do not fit 
372d0 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20  and non-zero is 
372e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
372f0 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65  tic int pageInse
37300 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61  rtArray(.  MemPa
37310 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20  ge *pPg,        
37320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
37330 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20  ge to add cells 
37340 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67  to */.  u8 *pBeg
37350 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  in,             
37360 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
37370 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  f cell-pointer a
37380 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70  rray */.  u8 **p
37390 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  pData,          
373a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
373b0 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e  OUT: Page conten
373c0 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20  t -area pointer 
373d0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74  */.  u8 *pCellpt
373e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
373f0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
37400 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  to cell-pointer 
37410 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46  area */.  int iF
37420 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
37430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
37440 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
37450 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74   to add */.  int
37460 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
37470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37480 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
37490 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f  to add to pPg */
374a0 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43  .  CellArray *pC
374b0 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20  Array           
374c0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
374d0 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ells */.){.  int
374e0 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20   i;.  u8 *aData 
374f0 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
37500 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44  u8 *pData = *ppD
37510 61 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  ata;.  int iEnd 
37520 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c  = iFirst + nCell
37530 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
37540 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68  UPT_DB || pPg->h
37550 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20  drOffset==0 );  
37560 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65    /* Never calle
37570 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20  d on page 1 */. 
37580 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69   for(i=iFirst; i
37590 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <iEnd; i++){.   
375a0 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20   int sz, rc;.   
375b0 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20   u8 *pSlot;.    
375c0 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53  sz = cachedCellS
375d0 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b  ize(pCArray, i);
375e0 0a 20 20 20 20 69 66 28 20 28 61 44 61 74 61 5b  .    if( (aData[
375f0 31 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32  1]==0 && aData[2
37600 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20  ]==0) || (pSlot 
37610 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70  = pageFindSlot(p
37620 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29  Pg,sz,&rc))==0 )
37630 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d 3d  {.      pData -=
37640 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 70   sz;.      if( p
37650 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72 65  Data<pBegin ) re
37660 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 53  turn 1;.      pS
37670 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  lot = pData;.   
37680 20 7d 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74 20   }.    /* pSlot 
37690 61 6e 64 20 70 43 41 72 72 61 79 2d 3e 61 70 43  and pCArray->apC
376a0 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76 65  ell[i] will neve
376b0 72 20 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20 77  r overlap on a w
376c0 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20 2a  ell-formed.    *
376d0 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42 75 74  * database.  But
376e0 20 74 68 65 79 20 6d 69 67 68 74 20 66 6f 72 20   they might for 
376f0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
37700 73 65 2e 20 20 48 65 6e 63 65 20 75 73 65 20 6d  se.  Hence use m
37710 65 6d 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a 20  emmove().    ** 
37720 73 69 6e 63 65 20 6d 65 6d 63 70 79 28 29 20 73  since memcpy() s
37730 65 6e 64 73 20 53 49 47 41 42 4f 52 54 20 77 69  ends SIGABORT wi
37740 74 68 20 6f 76 65 72 6c 61 70 70 69 6e 67 20 62  th overlapping b
37750 75 66 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42 53  uffers on OpenBS
37760 44 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  D */.    assert(
37770 20 28 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43 41   (pSlot+sz)<=pCA
37780 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 0a  rray->apCell[i].
37790 20 20 20 20 20 20 20 20 20 7c 7c 20 70 53 6c 6f           || pSlo
377a0 74 3e 3d 28 70 43 41 72 72 61 79 2d 3e 61 70 43  t>=(pCArray->apC
377b0 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20 20  ell[i]+sz).     
377c0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
377d0 42 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  B );.    memmove
377e0 28 70 53 6c 6f 74 2c 20 70 43 41 72 72 61 79 2d  (pSlot, pCArray-
377f0 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29 3b  >apCell[i], sz);
37800 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70 43  .    put2byte(pC
37810 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20 2d  ellptr, (pSlot -
37820 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70 43   aData));.    pC
37830 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 7d  ellptr += 2;.  }
37840 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44 61  .  *ppData = pDa
37850 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ta;.  return 0;.
37860 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61  }../*.** Array a
37870 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73  pCell[] contains
37880 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20   nCell pointers 
37890 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e  to b-tree cells.
378a0 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a 2a   Array szCell .*
378b0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  * contains the s
378c0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
378d0 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20  each such cell. 
378e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 64  This function ad
378f0 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20  ds the.** space 
37900 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
37910 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68 65  each cell in the
37920 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 63   array that is c
37930 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20  urrently stored 
37940 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 62  .** within the b
37950 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74 68  ody of pPg to th
37960 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74 2e  e pPg free-list.
37970 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   The cell-pointe
37980 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20  rs and other.** 
37990 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70 61  fields of the pa
379a0 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61 74  ge are not updat
379b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ed..**.** This f
379c0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
379d0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
379e0 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64 20   of cells added 
379f0 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  to the free-list
37a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
37a10 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a 20  pageFreeArray(. 
37a20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20   MemPage *pPg,  
37a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a40 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69 74   /* Page to edit
37a50 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
37a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37a70 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 63        /* First c
37a80 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f  ell to delete */
37a90 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20  .  int nCell,   
37aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ab0 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20 64     /* Cells to d
37ac0 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c 41  elete */.  CellA
37ad0 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20 20  rray *pCArray   
37ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
37af0 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a  ray of cells */.
37b00 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  ){.  u8 * const 
37b10 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61  aData = pPg->aDa
37b20 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ta;.  u8 * const
37b30 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 70   pEnd = &aData[p
37b40 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  Pg->pBt->usableS
37b50 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  ize];.  u8 * con
37b60 73 74 20 70 53 74 61 72 74 20 3d 20 26 61 44 61  st pStart = &aDa
37b70 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73 65  ta[pPg->hdrOffse
37b80 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68 69  t + 8 + pPg->chi
37b90 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69 6e  ldPtrSize];.  in
37ba0 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e  t nRet = 0;.  in
37bb0 74 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20  t i;.  int iEnd 
37bc0 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c  = iFirst + nCell
37bd0 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d 20  ;.  u8 *pFree = 
37be0 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65 20  0;.  int szFree 
37bf0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69 46  = 0;..  for(i=iF
37c00 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b  irst; i<iEnd; i+
37c10 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
37c20 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61 70 43  l = pCArray->apC
37c30 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ell[i];.    if( 
37c40 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26 26  pCell>=pStart &&
37c50 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a 20   pCell<pEnd ){. 
37c60 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
37c70 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f     /* No need to
37c80 20 75 73 65 20 63 61 63 68 65 64 43 65 6c 6c 53   use cachedCellS
37c90 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54 68 65  ize() here.  The
37ca0 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65   sizes of all ce
37cb0 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lls that.      *
37cc0 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72 65 65  * are to be free
37cd0 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  d have already b
37ce0 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 77 68  een computing wh
37cf0 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77 68 69  ile deciding whi
37d00 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c  ch.      ** cell
37d10 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67 20 2a  s need freeing *
37d20 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 43 41  /.      sz = pCA
37d30 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b  rray->szCell[i];
37d40 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30 20 29    assert( sz>0 )
37d50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72 65  ;.      if( pFre
37d60 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20  e!=(pCell + sz) 
37d70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
37d80 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Free ){.        
37d90 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65 3e    assert( pFree>
37da0 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65 20  aData && (pFree 
37db0 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20 29  - aData)<65536 )
37dc0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65 65  ;.          free
37dd0 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36 29  Space(pPg, (u16)
37de0 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29 2c  (pFree - aData),
37df0 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20 20   szFree);.      
37e00 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72 65    }.        pFre
37e10 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
37e20 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b 0a     szFree = sz;.
37e30 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
37e40 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74 75  e+sz>pEnd ) retu
37e50 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 0;.      }els
37e60 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65 65  e{.        pFree
37e70 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20   = pCell;.      
37e80 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b 0a    szFree += sz;.
37e90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
37ea0 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  et++;.    }.  }.
37eb0 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20    if( pFree ){. 
37ec0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
37ed0 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
37ee0 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
37ef0 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61 63 65  );.    freeSpace
37f00 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
37f10 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
37f20 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ee);.  }.  retur
37f30 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nRet;.}../*.**
37f40 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a   apCell[] and sz
37f50 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20  Cell[] contains 
37f60 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e 64 20  pointers to and 
37f70 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c  sizes of all cel
37f80 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67  ls in the.** pag
37f90 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  es being balance
37fa0 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  d.  The current 
37fb0 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73 20 70  page, pPg, has p
37fc0 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c 73 20  Pg->nCell cells 
37fd0 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69 74 68  starting.** with
37fe0 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e 20 20   apCell[iOld].  
37ff0 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 2c  After balancing,
38000 20 74 68 69 73 20 70 61 67 65 20 73 68 6f 75 6c   this page shoul
38010 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65 6c 6c  d hold nNew cell
38020 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74  s.** starting at
38030 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a   apCell[iNew]..*
38040 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
38050 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65 63 65  e makes the nece
38060 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65 6e 74  ssary adjustment
38070 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68 61 74  s to pPg so that
38080 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20   it contains.** 
38090 74 68 65 20 63 6f 72 72 65 63 74 20 63 65 6c 6c  the correct cell
380a0 73 20 61 66 74 65 72 20 62 65 69 6e 67 20 62 61  s after being ba
380b0 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  lanced..**.** Th
380c0 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65  e pPg->nFree fie
380d0 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20 77 68  ld is invalid wh
380e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
380f0 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69 73 20   returns. It is 
38100 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  the.** responsib
38110 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
38120 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
38130 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
38140 69 63 20 69 6e 74 20 65 64 69 74 50 61 67 65 28  ic int editPage(
38150 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
38160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38170 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20     /* Edit this 
38180 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  page */.  int iO
38190 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ld,             
381a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
381b0 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c  ex of first cell
381c0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 70 61   currently on pa
381d0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e 65 77  ge */.  int iNew
381e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
381f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
38200 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20 63 65   of new first ce
38210 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  ll on page */.  
38220 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20 20 20  int nNew,       
38230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38240 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20  /* Final number 
38250 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65  of cells on page
38260 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20   */.  CellArray 
38270 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20  *pCArray        
38280 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
38290 66 20 63 65 6c 6c 73 20 61 6e 64 20 73 69 7a 65  f cells and size
382a0 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63  s */.){.  u8 * c
382b0 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67  onst aData = pPg
382c0 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e 73 74  ->aData;.  const
382d0 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e   int hdr = pPg->
382e0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38 20  hdrOffset;.  u8 
382f0 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67 2d 3e  *pBegin = &pPg->
38300 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20 2a 20  aCellIdx[nNew * 
38310 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20  2];.  int nCell 
38320 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20 20 20  = pPg->nCell;   
38330 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73 74 6f      /* Cells sto
38340 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20  red on pPg */.  
38350 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75 38 20  u8 *pData;.  u8 
38360 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69 6e 74  *pCellptr;.  int
38370 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64 45 6e   i;.  int iOldEn
38380 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67 2d 3e  d = iOld + pPg->
38390 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e 4f 76  nCell + pPg->nOv
383a0 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20 69 4e  erflow;.  int iN
383b0 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b 20 6e  ewEnd = iNew + n
383c0 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  New;..#ifdef SQL
383d0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 2a  ITE_DEBUG.  u8 *
383e0 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61  pTmp = sqlite3Pa
383f0 67 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67  gerTempSpace(pPg
38400 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
38410 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c 20 61    memcpy(pTmp, a
38420 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74 2d 3e  Data, pPg->pBt->
38430 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23 65 6e  usableSize);.#en
38440 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76