/ Hex Artifact Content
Login

Artifact 383ce69bd36b0f409bfb8bd028786b2f0a4cbb24:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
6720: 72 20 61 53 70 61 63 65 5b 33 38 34 5d 3b 20 20  r aSpace[384];  
6730: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
6740: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
6750: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
6760: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
6770: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
6780: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
6790: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
67a0: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
67b0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
67c0: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
67d0: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
67e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
67f0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
6800: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
6810: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
6820: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6840: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6850: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6860: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6870: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6880: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6890: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
68a0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
68b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
68c0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
68d0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
68e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
68f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6900: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6910: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
6920: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
6930: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
6940: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
6950: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
6960: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
6970: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
6980: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6990: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
69a0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
69b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
69c0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
69d0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
69e0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
69f0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
6a00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
6a10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
6a20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
6a30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
6a40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
6a50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
6a60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
6a70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
6a80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
6a90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
6aa0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
6ab0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
6ac0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
6ad0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
6ae0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6af0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
6b00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
6b10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6b20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6b30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6b40: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  skipNext;.  asse
6b50: 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
6b60: 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
6b70: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6b80: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6b90: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
6ba0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
6bc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
6bd0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
6be0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6bf0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6c00: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
6c10: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
6c20: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
6c30: 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29  y, 0, &skipNext)
6c40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6c50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6c60: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6c70: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
6c80: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
6c90: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6ca0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6cb0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
6cc0: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
6cd0: 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73  D );.    pCur->s
6ce0: 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e  kipNext |= skipN
6cf0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ext;.    if( pCu
6d00: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70  r->skipNext && p
6d10: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d20: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6d30: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6d40: 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  = CURSOR_SKIPNEX
6d50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
6d60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
6d70: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
6d80: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
6d90: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
6da0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6db0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
6dc0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6dd0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
6de0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6df0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
6e00: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6e10: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
6e20: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
6e30: 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a  position where.*
6e40: 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c  * it was last pl
6e50: 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65  aced, or has bee
6e60: 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f  n invalidated fo
6e70: 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73  r any other reas
6e80: 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63  on..** Cursors c
6e90: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
6ea0: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
6eb0: 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c  inting at is del
6ec0: 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d  eted out.** from
6ed0: 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72   under them, for
6ee0: 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f   example.  Curso
6ef0: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76  r might also mov
6f00: 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20  e if a btree.** 
6f10: 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a  is rebalanced..*
6f20: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
6f30: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
6f40: 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69   NULL cursor poi
6f50: 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c  nter returns fal
6f60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  se..**.** Use th
6f70: 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74  e separate sqlit
6f80: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
6f90: 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74  tore() routine t
6fa0: 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73  o restore a curs
6fb0: 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68  or.** back to wh
6fc0: 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20  ere it ought to 
6fd0: 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  be if this routi
6fe0: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e  ne returns true.
6ff0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7000: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7010: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
7020: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
7030: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7040: 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
7050: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7060: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7070: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7080: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7090: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
70a0: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
70b0: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
70c0: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
70d0: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
70e0: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
70f0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
7100: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
7110: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
7120: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
7130: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
7140: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7150: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7160: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7170: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7180: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7190: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
71a0: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
71b0: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
71c0: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
71d0: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
71e0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
71f0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
7200: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
7210: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7220: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7230: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
7240: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7250: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7260: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7270: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7290: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
72a0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
72b0: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
72c0: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
72d0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
72e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
72f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
7300: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
7310: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
7320: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
7330: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
7340: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7350: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7360: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7370: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7380: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7390: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
73a0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
73b0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
73c0: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
73d0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
73e0: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
73f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7400: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7410: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7420: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7430: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7440: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7450: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7460: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7470: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7480: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7490: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
74a0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
74b0: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
74c0: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
74d0: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
74e0: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
74f0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7500: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7510: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7520: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7530: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7540: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7550: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7560: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7570: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7580: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
75a0: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
75b0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
75c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
75d0: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
75e0: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
75f0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7600: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7610: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7620: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7630: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7640: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7660: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7670: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7680: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7690: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
76a0: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
76b0: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
76c0: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
76d0: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
76e0: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
76f0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7700: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7720: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7730: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7740: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7750: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7760: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7770: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7780: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7790: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
77a0: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
77b0: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
77c0: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
77d0: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
77e0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
77f0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7800: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7810: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7840: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7850: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7860: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7870: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7880: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7890: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
78a0: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
78b0: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
78c0: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
78d0: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
78e0: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
78f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7900: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7910: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7920: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7930: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7940: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
7950: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7960: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
7970: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7980: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
7990: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
79a0: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
79b0: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
79c0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
79d0: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
79e0: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
79f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
7a00: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
7a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
7a20: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
7a30: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7a40: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7a50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
7a60: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
7a70: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
7a80: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
7a90: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7aa0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
7ab0: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
7ac0: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
7ad0: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
7ae0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7af0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
7b00: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
7b10: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
7b20: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
7b30: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
7b40: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7b50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
7b60: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7b70: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
7b80: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7b90: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7ba0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7bb0: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
7bc0: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
7bd0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
7be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7bf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7c00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
7c10: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
7c20: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
7c30: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
7c40: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
7c50: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
7c60: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
7c70: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
7c80: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
7c90: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
7ca0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
7cb0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
7cc0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7ce0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
7cf0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
7d00: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
7d10: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
7d20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7d30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
7d40: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
7d50: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
7d60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7d70: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7d80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7d90: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7da0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7db0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7dc0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7dd0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7de0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7df0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7e00: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7e10: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7e20: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7e30: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7e40: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e50: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7e60: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7e70: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7e80: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7e90: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7ea0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7eb0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7ec0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7ed0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7ee0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7ef0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7f00: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7f10: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f30: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7f40: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7f50: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7f60: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7f70: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7f80: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7f90: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7fa0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7fb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7fc0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7fd0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7fe0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7ff0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8000: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8010: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8020: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8030: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8040: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8050: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8060: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8070: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8080: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8090: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
80a0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
80b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
80c0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
80d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
80e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
80f0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8100: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
8110: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
8120: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8130: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
8140: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8150: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8160: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8170: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8180: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8190: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
81a0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
81b0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
81c0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
81d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
81e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
81f0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8200: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
8210: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8220: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8230: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8240: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8250: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8260: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8270: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8280: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8290: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
82a0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
82b0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
82c0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
82d0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
82e0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
82f0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8300: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8310: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8320: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8330: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8340: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8350: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8360: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8370: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8380: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8390: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
83a0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
83b0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
83c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
83d0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
83e0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
83f0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8400: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8410: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8420: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8440: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8450: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
8460: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
8470: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
8480: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
8490: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
84a0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
84b0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
84c0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
84d0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
84e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
84f0: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8500: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8510: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8520: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8530: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8540: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8550: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
8560: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
8570: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
8580: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
8590: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
85a0: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
85b0: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
85c0: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
85d0: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
85e0: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
85f0: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8600: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8620: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8630: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8640: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
8650: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
8660: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8670: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
8680: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
8690: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
86a0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
86b0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
86c0: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
86d0: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
86e0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
86f0: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
8700: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8710: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8720: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8740: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
8750: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
8760: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
8770: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
8780: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
8790: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
87a0: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
87b0: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
87c0: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
87d0: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
87e0: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
87f0: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
8800: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
8810: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
8820: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8830: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8840: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
8850: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8870: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8880: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8890: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88b0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
88c0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
88d0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
88e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
88f0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8900: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
8910: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8920: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8930: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8940: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8950: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
8960: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
8970: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
8980: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
8990: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
89a0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
89b0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
89c0: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
89d0: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
89e0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
89f0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8a00: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8a10: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8a20: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
8a30: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
8a40: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
8a50: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
8a60: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
8a70: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
8a80: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
8a90: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
8aa0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
8ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
8ac0: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
8ad0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
8ae0: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
8af0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8b00: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8b10: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
8b20: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
8b30: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8b40: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
8b50: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8b60: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8b70: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8b80: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8b90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8ba0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
8bb0: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
8bc0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
8bd0: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
8be0: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
8bf0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
8c00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8c10: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
8c20: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
8c30: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8c40: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8c50: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8c60: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
8c70: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
8c80: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8c90: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
8ca0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
8cb0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
8cc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8cd0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
8ce0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8cf0: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8d00: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34  al] - pCell) + 4
8d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
8d20: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8d30: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
8d40: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
8d50: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
8d60: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
8d70: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8d80: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8d90: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
8da0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
8db0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
8dc0: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
8dd0: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
8de0: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
8df0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8e00: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
8e10: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
8e20: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
8e30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8e40: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
8e50: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
8e60: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
8e70: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
8e80: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
8e90: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
8ea0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
8eb0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
8ec0: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
8ed0: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
8ee0: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
8ef0: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
8f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
8f10: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
8f20: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
8f30: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8f40: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8f50: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8f60: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f80: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8f90: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8fa0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8fb0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8fc0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8fd0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
8fe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8ff0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9000: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9010: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9020: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9030: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
9040: 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65  ize==4 );.#ifnde
9050: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9060: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9070: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
9080: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
9090: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
90a0: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
90b0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
90c0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
90d0: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
90e0: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
90f0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9100: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73  0;.  return;.}.s
9110: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
9120: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
9130: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9140: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9150: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9160: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9170: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9180: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9190: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
91a0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
91b0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
91c0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
91d0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
91e0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
91f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
9200: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
9210: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9220: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9230: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9240: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9250: 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79  ad */.  u64 iKey
9260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9270: 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79  /* Extracted Key
9280: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73   value */..  ass
9290: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
92a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
92b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
92c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
92d0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
92e0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
92f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9300: 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73  KeyLeaf );.  ass
9310: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9320: 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  dPtrSize==0 );. 
9330: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a   pIter = pCell;.
9340: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9350: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
9360: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
9370: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
9380: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
9390: 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61  2(pIter, nPayloa
93a0: 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  d);.  **.  ** Th
93b0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
93c0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
93d0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
93e0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
93f0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9400: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9410: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9420: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9430: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9440: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9450: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9460: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9470: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9480: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d  hile( (*pIter)>=
9490: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
94a0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
94b0: 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  r++;..  /* The n
94c0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
94d0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
94e0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
94f0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9500: 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34  rint(pIter, (u64
9510: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9520: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9530: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9540: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9550: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
9560: 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20  iKey = *pIter;. 
9570: 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20   if( iKey>=0x80 
9580: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9590: 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20  = &pIter[7];.   
95a0: 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20   iKey &= 0x7f;. 
95b0: 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20     while(1){.   
95c0: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95d0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
95e0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69  & 0x7f);.      i
95f0: 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30  f( (*pIter)<0x80
9600: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9610: 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20  if( pIter>=pEnd 
9620: 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  ){.        iKey 
9630: 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b  = (iKey<<8) | *+
9640: 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  +pIter;.        
9650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9660: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72     }.  }.  pIter
9670: 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  ++;..  pInfo->nK
9680: 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65  ey = *(i64*)&iKe
9690: 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  y;.  pInfo->nPay
96a0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
96b0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
96c0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
96d0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
96e0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
96f0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9700: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9710: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9720: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9730: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9740: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9750: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
9760: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
9770: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
9780: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
9790: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
97a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
97b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
97c0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
97d0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
97e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
97f0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9800: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9810: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9820: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9830: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9840: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9850: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9860: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9870: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9880: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
98a0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
98b0: 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dex(.  MemPage *
98c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
98d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
98e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
98f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9910: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9920: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9930: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9940: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9950: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9960: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9980: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9990: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
99a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
99b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
99d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
99e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
99f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9a00: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9a10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a20: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
9a30: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
9a40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a50: 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b  intKeyLeaf==0 );
9a60: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
9a70: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
9a80: 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
9a90: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9aa0: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9ab0: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9ac0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ae0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9af0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9b00: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9b10: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b20: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9b30: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b40: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b50: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49  .  pIter++;.  pI
9b60: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
9b70: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
9b80: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9b90: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9ba0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9bb0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9bc0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9bd0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9be0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9bf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9c00: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9c10: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9c20: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9c30: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9c40: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9c50: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9c60: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9c70: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9c80: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9c90: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9ca0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9cb0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9cc0: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9cd0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9ce0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9cf0: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9d00: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9d20: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
9d30: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9d40: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9d50: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9d60: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9d70: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9d80: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
9d90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9da0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9db0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9dc0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9dd0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9de0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
9df0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
9e00: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
9e10: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9e20: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9e30: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9e40: 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  .){.  pPage->xPa
9e50: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66  rseCell(pPage, f
9e60: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9e70: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
9e80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
9e90: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
9ea0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
9eb0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
9ec0: 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d  e.xCellSize.** m
9ed0: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ethod..**.** Com
9ee0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9ef0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9f00: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9f10: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9f20: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9f30: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9f40: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9f50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
9f60: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9f70: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9f80: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9f90: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9fa0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9fb0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9fc0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ll pointer..**.*
9fd0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  * cellSizePtrNoP
9fe0: 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20  ayload()    =>  
9ff0: 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20   table internal 
a000: 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a  nodes.** cellSiz
a010: 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20  ePtr()          
a020: 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65     =>   all inde
a030: 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20  x nodes & table 
a040: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74  leaf nodes.*/.st
a050: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a060: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
a070: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
a080: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
a090: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
a0a0: 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46  ildPtrSize; /* F
a0b0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a0c0: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a0d0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a100: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
a110: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
a120: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75      /* Size valu
a150: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
a160: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a170: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a180: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a190: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a1a0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a1b0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a1c0: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a1d0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a1e0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a1f0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a200: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a210: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a220: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a230: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a240: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a250: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a260: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a270: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a280: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a290: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a2a0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a2b0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a2c0: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
a2d0: 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74  ..  nSize = *pIt
a2e0: 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e  er;.  if( nSize>
a2f0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e  =0x80 ){.    pEn
a300: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
a310: 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66     nSize &= 0x7f
a320: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
a330: 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c  nSize = (nSize<<
a340: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a350: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a360: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a370: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a380: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a390: 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  +;.  if( pPage->
a3a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
a3b0: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
a3c0: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
a3d0: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
a3e0: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
a3f0: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
a400: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
a410: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
a420: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
a430: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
a440: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
a450: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
a460: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
a470: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
a480: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
a490: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a4a0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a4b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a4c0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a4d0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a4e0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a4f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a500: 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65  if( nSize<=pPage
a510: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a520: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
a530: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a540: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
a550: 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20   ) nSize = 4;.  
a560: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
a570: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a580: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
a590: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
a5a0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
a5b0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
a5c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
a5d0: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
a5e0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a5f0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
a600: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a610: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a620: 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
a630: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
a640: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53  ocal ){.      nS
a650: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  ize = minLocal;.
a660: 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20      }.    nSize 
a670: 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74  += 4 + (u16)(pIt
a680: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d  er - pCell);.  }
a690: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
a6a0: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
a6b0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
a6c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
a6d0: 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63  )nSize;.}.static
a6e0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a6f0: 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67  NoPayload(MemPag
a700: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a710: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a720: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f  r = pCell + 4; /
a730: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a740: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a750: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a770: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a780: 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  varint */..#ifde
a790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a7a0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
a7b0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
a7c0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
a7d0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
a7e0: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
a7f0: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
a800: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
a810: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
a820: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
a830: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
a840: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
a850: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
a860: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
a870: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
a880: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
a890: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
a8a0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
a8b0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
a8c0: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
a8d0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
a8e0: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
a8f0: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  fo);.#else.  UNU
a900: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
a910: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  age);.#endif..  
a920: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
a930: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
a940: 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72  ;.  pEnd = pIter
a950: 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 9;.  while( (
a960: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a970: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a980: 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69    assert( debugi
a990: 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29  nfo.nSize==(u16)
a9a0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20  (pIter - pCell) 
a9b0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
a9c0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28  .  return (u16)(
a9d0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a9e0: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
a9f0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
aa00: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
aa10: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
aa20: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
aa30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
aa40: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
aa50: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
aa60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aa70: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
aa80: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65  eturn pPage->xCe
aa90: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69  llSize(pPage, fi
aaa0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
aab0: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
aac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aad0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
aae0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
aaf0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
ab00: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
ab10: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
ab20: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
ab30: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
ab40: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
ab50: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
ab60: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
ab70: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
ab80: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
ab90: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
aba0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
abb0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
abc0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
abd0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
abe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
abf0: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
ac00: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
ac10: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
ac20: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
ac30: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
ac40: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
ac50: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
ac60: 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell[info.nSize-
ac70: 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  4]);.    ptrmapP
ac80: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
ac90: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
aca0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
acb0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
acc0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
acd0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
ace0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
acf0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
ad00: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
ad10: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
ad20: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
ad30: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
ad40: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
ad50: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
ad60: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
ad70: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
ad80: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
ad90: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ada0: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
adb0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
adc0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
add0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
ade0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
adf0: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
ae00: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
ae10: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
ae20: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
ae30: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
ae40: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
ae50: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
ae60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
ae70: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
ae80: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
ae90: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
aea0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
aeb0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
aec0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
aed0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
aee0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
af10: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af30: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
af40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
af50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
af60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
af70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
af80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
af90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
afb0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
afc0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
afe0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
aff0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
b000: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b020: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b030: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b040: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b070: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b080: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
b090: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
b0a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b0b0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
b0c0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
b0d0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
b0e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
b0f0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
b100: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
b110: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
b120: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
b130: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
b140: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
b150: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
b160: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
b170: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b190: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b1a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
b1b0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
b1c0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
b1d0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
b1e0: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
b1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b200: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b210: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b220: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b230: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b240: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b250: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b260: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b280: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b2c0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b2d0: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b2e0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b2f0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b300: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b310: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b320: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b330: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b340: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b350: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b360: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b370: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
b380: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b390: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
b3a0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
b3b0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
b3c0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
b3d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b3e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
b3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
b400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
b410: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
b420: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
b430: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
b440: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b450: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
b460: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
b470: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
b480: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
b490: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b4a0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b4b0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
b4c0: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
b4d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
b4e0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
b4f0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
b500: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
b510: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
b520: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b530: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b540: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b560: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b580: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
b590: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
b5a0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
b5b0: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
b5c0: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
b5d0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
b5e0: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
b5f0: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
b600: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
b610: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b630: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b640: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
b650: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
b660: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b670: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b680: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b690: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b6a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b6b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b6c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b6d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b6e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b6f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b700: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b710: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b720: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b730: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b740: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b750: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b760: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b770: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b780: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b790: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b7a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b7b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b7c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b7d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b7e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b7f0: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b800: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b820: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b830: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b840: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b850: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b860: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b870: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b880: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b890: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b8a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b8b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b8c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b8d0: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b8e0: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b8f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b910: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b930: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b940: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b950: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b960: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b970: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b980: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b990: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b9a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b9b0: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b9c0: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b9d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b9e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b9f0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
ba00: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
ba10: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
ba20: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
ba30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
ba40: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
ba50: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
ba60: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
ba70: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
ba80: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
ba90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
baa0: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
bab0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
bac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
bad0: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
bae0: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
baf0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
bb00: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
bb10: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
bb20: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
bb30: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
bb40: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
bb50: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
bb60: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
bb70: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
bb80: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
bb90: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
bba0: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
bbb0: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
bbc0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
bbd0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
bbe0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
bbf0: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
bc00: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
bc10: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
bc20: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
bc30: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
bc40: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
bc50: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
bc60: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
bc70: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
bc80: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bca0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
bcb0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
bcc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
bcd0: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
bce0: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
bcf0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
bd00: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
bd10: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
bd20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
bd30: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
bd40: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
bd50: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
bd60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bd70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bd80: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
bd90: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
bda0: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
bdb0: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
bdc0: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
bdd0: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
bde0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
bdf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
be00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
be10: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
be20: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
be30: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
be40: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
be50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
be60: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
be70: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
be80: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
be90: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
bea0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
beb0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
bec0: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
bed0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
bee0: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
bef0: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
bf00: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
bf10: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bf20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
bf30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
bf40: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
bf60: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
bf70: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
bf80: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
bf90: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
bfa0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
bfb0: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
bfc0: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
bfd0: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
bfe0: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
bff0: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
c000: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
c010: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
c020: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c030: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
c040: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
c050: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
c060: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
c070: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
c080: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
c090: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
c0a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
c0b0: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
c0c0: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
c0d0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
c0e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
c0f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
c100: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
c110: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
c120: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
c130: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
c140: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
c150: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
c160: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
c170: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
c180: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
c190: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
c1a0: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
c1b0: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
c1c0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
c1d0: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
c1e0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
c1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
c200: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
c210: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
c220: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
c230: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
c240: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
c250: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
c260: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
c270: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
c280: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
c290: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
c2a0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
c2b0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
c2c0: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
c2d0: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
c2e0: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
c2f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
c300: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
c310: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
c320: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
c330: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
c340: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
c350: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
c360: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
c370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
c380: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
c390: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
c3a0: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
c3b0: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
c3c0: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
c3d0: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
c3e0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
c3f0: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
c400: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
c410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
c420: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
c430: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
c440: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
c450: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
c460: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
c470: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
c480: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
c490: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
c4a0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
c4b0: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
c4c0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
c4d0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c4e0: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
c4f0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
c500: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
c510: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
c520: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
c530: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
c540: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
c550: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
c560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c580: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
c590: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c5b0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c5d0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
c5e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
c5f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c600: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
c610: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
c620: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
c630: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
c640: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c650: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c660: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c670: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c680: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c690: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c6a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c6b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c6c0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c6d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c6e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c700: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c710: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c720: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c730: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c740: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c760: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c770: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c780: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c790: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c7a0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c7b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c7c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c7d0: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c7e0: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c7f0: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c800: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c810: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c820: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c830: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c840: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c850: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c860: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c870: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c880: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c890: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c8a0: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c8b0: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c8c0: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c8d0: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c8e0: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c8f0: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c900: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c910: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c920: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c930: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c940: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c950: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c960: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c970: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c980: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c990: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c9a0: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c9b0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c9c0: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c9d0: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c9e0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c9f0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ca00: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ca10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ca20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ca30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
ca40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ca50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
ca60: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
ca70: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
ca80: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
ca90: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
caa0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
cab0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
cac0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
cad0: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
cae0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
caf0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
cb00: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
cb10: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
cb20: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
cb30: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
cb40: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
cb50: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
cb60: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
cb70: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
cb80: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
cb90: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
cba0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
cbb0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
cbc0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
cbd0: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
cbe0: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
cbf0: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
cc00: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
cc10: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
cc20: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
cc30: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
cc40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
cc60: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
cc70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cc80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cc90: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
cca0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
ccb0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
ccc0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
ccd0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
cce0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
ccf0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
cd00: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
cd10: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
cd20: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
cd30: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
cd40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cd50: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
cd60: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
cd70: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
cd80: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
cd90: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cda0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
cdb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
cdc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
cdd0: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
cde0: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
cdf0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
ce00: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
ce10: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
ce20: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ce30: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
ce40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ce50: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
ce60: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
ce70: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
ce80: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
ce90: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
cea0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
ceb0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
cec0: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
ced0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
cee0: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
cef0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
cf00: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
cf10: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
cf20: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
cf30: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
cf40: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
cf50: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
cf60: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
cf70: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
cf80: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
cf90: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cfa0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
cfb0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
cfc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cfd0: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
cfe0: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
cff0: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
d000: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
d010: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d020: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
d030: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
d040: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
d050: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
d060: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
d070: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
d080: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
d090: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
d0a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
d0b0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
d0c0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
d0d0: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
d0e0: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
d0f0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
d100: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
d110: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
d120: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
d130: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
d140: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
d150: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
d160: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
d170: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
d180: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
d190: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
d1a0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
d1b0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
d1c0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
d1d0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
d1e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d1f0: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
d200: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
d210: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
d220: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
d230: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
d240: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
d250: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d280: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
d290: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
d2a0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
d2d0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
d2e0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
d2f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
d320: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
d330: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
d340: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d360: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
d370: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
d380: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
d390: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
d3a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
d3b0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
d3c0: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
d3d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d3e0: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
d3f0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
d400: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d410: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
d420: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
d430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d440: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
d450: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
d460: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d470: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
d480: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
d490: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
d4a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d4b0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d4c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d4d0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d4e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d4f0: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
d500: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
d510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
d520: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
d530: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
d540: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
d550: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
d560: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d580: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d590: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
d5b0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
d5c0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
d5d0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d5e0: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
d5f0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
d600: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
d610: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
d620: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
d630: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
d640: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
d650: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
d660: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d670: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d680: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d690: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d6a0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d6b0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d6c0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d6d0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d6e0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d6f0: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d700: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d710: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d720: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d730: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d740: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d750: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d760: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d770: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d780: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d790: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d7a0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d7b0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d7c0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d7e0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d800: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
d810: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
d820: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
d830: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
d840: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
d850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d860: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d870: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
d880: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
d890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d8a0: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
d8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d8c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d8d0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
d8e0: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
d8f0: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
d900: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d910: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
d920: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
d930: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
d940: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
d950: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
d960: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
d970: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
d980: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
d990: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
d9a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
d9b0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
d9c0: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
d9d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
d9e0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
d9f0: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
da00: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
da10: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
da20: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
da30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
da40: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
da50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
da60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
da70: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
da80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
da90: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
daa0: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
dab0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
dac0: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
dad0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
dae0: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
daf0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
db00: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
db10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
db20: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
db30: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
db40: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
db50: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
db60: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
db70: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
db80: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
db90: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
dba0: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
dbb0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
dbc0: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
dbd0: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
dbe0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
dbf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
dc00: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
dc10: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
dc20: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
dc30: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
dc40: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
dc50: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
dc60: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
dc70: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
dc80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
dc90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
dca0: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
dcb0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
dcc0: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
dcd0: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
dce0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
dcf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dd00: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
dd10: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
dd20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dd30: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
dd40: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
dd50: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
dd60: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
dd70: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
dd80: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
dd90: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
dda0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
ddb0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ddc0: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
ddd0: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
dde0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
ddf0: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
de00: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
de10: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
de20: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
de30: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
de40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
de50: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
de60: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
de70: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
de80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
de90: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
dea0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
deb0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
dec0: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
ded0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
dee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
def0: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
df00: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
df10: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
df20: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
df30: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
df40: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
df50: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
df60: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
df70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
df80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
df90: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
dfa0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
dfb0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
dfc0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
dfd0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
dfe0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
dff0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
e000: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
e010: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
e020: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
e030: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
e040: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
e050: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
e060: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
e070: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
e080: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e090: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
e0a0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
e0b0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
e0c0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
e0d0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
e0e0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e0f0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
e100: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
e110: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
e120: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
e130: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
e140: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e150: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
e160: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
e170: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e180: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
e190: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
e1a0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
e1b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e1c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
e1d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
e1e0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
e1f0: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
e200: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
e210: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
e220: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
e230: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
e240: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e250: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
e260: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
e270: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
e280: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
e290: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
e2a0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
e2b0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e2c0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
e2d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
e2e0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
e2f0: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
e300: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e310: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
e320: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
e330: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e340: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e350: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e360: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e370: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
e380: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
e390: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
e3a0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
e3b0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
e3c0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
e3d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e3e0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
e3f0: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
e400: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
e410: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
e420: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
e430: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
e440: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e450: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
e460: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e470: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
e480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e490: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
e4a0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
e4b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e4c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
e4d0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
e4e0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e4f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e500: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
e510: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
e520: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
e530: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
e540: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e550: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
e560: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
e570: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
e580: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e590: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
e5a0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
e5b0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
e5c0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
e5d0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
e5e0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e5f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e600: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
e610: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e620: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
e630: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
e640: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
e650: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
e660: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
e670: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
e680: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
e690: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
e6a0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
e6b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
e6c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
e6d0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e6e0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e6f0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e700: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
e710: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
e720: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
e730: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
e740: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
e750: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
e760: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e770: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
e780: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
e790: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
e7a0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
e7b0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
e7c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
e7d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e7e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
e7f0: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
e800: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
e810: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
e820: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e830: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
e840: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
e850: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
e860: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
e870: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e880: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
e890: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
e8a0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
e8b0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
e8c0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
e8d0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
e8e0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
e8f0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
e900: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
e910: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
e920: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
e930: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
e940: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
e950: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
e960: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
e970: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
e980: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
e990: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
e9a0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
e9b0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
e9c0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
e9d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e9e0: 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
e9f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ea00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ea10: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ea20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ea30: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
ea40: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
ea50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ea60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ea70: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ea80: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ea90: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
eaa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
eab0: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
eac0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ead0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
eae0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
eaf0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 33 32  sInit ){.    u32
eb00: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
eb10: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
eb20: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
eb30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
eb40: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
eb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
eb60: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
eb70: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
eb80: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
eb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
eba0: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ebb0: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ebc0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ebd0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ebe0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ebf0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
ec00: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ec10: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ec20: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
ec30: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
ec40: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
ec50: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
ec60: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
ec70: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ec80: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ec90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
eca0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ecb0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ecc0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
ecd0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ece0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ecf0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ed00: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ed10: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
ed20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
ed30: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ed40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
ed50: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
ed60: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
ed70: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
ed80: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
ed90: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
eda0: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
edb0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
edc0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
edd0: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ata;.    /* EVID
ede0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
edf0: 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
ee00: 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
ee10: 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
ee20: 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
ee30: 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
ee40: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
ee50: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
ee60: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
ee70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ee80: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
ee90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
eea0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
eeb0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
eec0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
eed0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
eee0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
eef0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
ef00: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
ef10: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
ef20: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
ef30: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ef40: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
ef50: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
ef60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
ef70: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
ef80: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
ef90: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
efa0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
efb0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
efc0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
efd0: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
efe0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
eff0: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
f000: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
f010: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
f020: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f030: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
f040: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
f050: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
f060: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
f070: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
f080: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
f090: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
f0a0: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
f0b0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
f0c0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
f0d0: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
f0e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
f0f0: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
f100: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
f110: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
f120: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
f130: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
f140: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
f150: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
f160: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f170: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
f180: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
f190: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
f1a0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
f1b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
f1c0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
f1d0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
f1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f1f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f200: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
f210: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
f220: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
f230: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
f240: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
f250: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
f260: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
f270: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
f280: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
f290: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
f2a0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
f2b0: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
f2c0: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
f2d0: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
f2e0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f2f0: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
f300: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
f310: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
f320: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
f330: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
f340: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
f350: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
f360: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
f370: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
f380: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
f390: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
f3a0: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
f3b0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
f3c0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
f3d0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
f3e0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
f3f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f400: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
f410: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
f420: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
f430: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
f440: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
f450: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
f460: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
f470: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
f480: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
f490: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
f4a0: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
f4b0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
f4c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
f4d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
f4e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
f4f0: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
f500: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
f510: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
f520: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f530: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
f540: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
f550: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
f560: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
f570: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
f580: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
f590: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f5a0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
f5b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f5c0: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
f5d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
f5e0: 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
f5f0: 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
f600: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
f610: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
f620: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
f630: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f640: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
f650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
f660: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
f670: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
f680: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f690: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f6a0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f6b0: 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65        sz = pPage
f6c0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
f6d0: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
f6e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f6f0: 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
f700: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
f710: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
f720: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f740: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f760: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
f770: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
f780: 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20  ++;.    }  ..   
f790: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
f7a0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
f7b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
f7c0: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
f7d0: 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
f7e0: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f7f0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
f800: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
f810: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
f820: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
f830: 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
f840: 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
f850: 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
f860: 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
f870: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
f880: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
f890: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
f8a0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
f8b0: 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
f8c0: 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
f8d0: 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66   space */.    if
f8e0: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
f8f0: 75 33 32 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  u32 next, size;.
f900: 20 20 20 20 20 20 69 66 28 20 70 63 3c 69 43 65        if( pc<iCe
f910: 6c 6c 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20  llFirst ){.     
f920: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
f930: 46 3a 20 52 2d 35 35 35 33 30 2d 35 32 39 33 30  F: R-55530-52930
f940: 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65   In a well-forme
f950: 64 20 62 2d 74 72 65 65 20 70 61 67 65 2c 20 74  d b-tree page, t
f960: 68 65 72 65 20 77 69 6c 6c 0a 20 20 20 20 20 20  here will.      
f970: 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 61    ** always be a
f980: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65 6c 6c  t least one cell
f990: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
f9a0: 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a 20 20 20  t freeblock..   
f9b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
f9c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f9d0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
f9e0: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
f9f0: 28 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ( 1 ){.        i
fa00: 66 28 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  f( pc>iCellLast 
fa10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
fa20: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fa30: 50 54 5f 42 4b 50 54 3b 20 2f 2a 20 46 72 65 65  PT_BKPT; /* Free
fa40: 62 6c 6f 63 6b 20 6f 66 66 20 74 68 65 20 65 6e  block off the en
fa50: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  d of the page */
fa60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fa70: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
fa80: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
fa90: 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65         size = ge
faa0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b  t2byte(&data[pc+
fab0: 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  2]);.        nFr
fac0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
fad0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  e;.        if( n
fae0: 65 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29  ext<=pc+size+3 )
faf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
fb00: 70 63 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 20  pc = next;.     
fb10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 65 78   }.      if( nex
fb20: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  t>0 ){.        r
fb30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fb40: 52 55 50 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 46  RUPT_BKPT;  /* F
fb50: 72 65 65 62 6c 6f 63 6b 20 6e 6f 74 20 69 6e 20  reeblock not in 
fb60: 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20  ascending order 
fb70: 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
fb80: 20 69 66 28 20 70 63 2b 73 69 7a 65 3e 75 73 61   if( pc+size>usa
fb90: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
fba0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fbb0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 20  _CORRUPT_BKPT;  
fbc0: 2f 2a 20 4c 61 73 74 20 66 72 65 65 62 6c 6f 63  /* Last freebloc
fbd0: 6b 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 70  k extends past p
fbe0: 61 67 65 20 65 6e 64 20 2a 2f 0a 20 20 20 20 20  age end */.     
fbf0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
fc00: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
fc10: 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74  nFree contains t
fc20: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66  he sum of the of
fc30: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
fc40: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  t.    ** of the 
fc50: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
fc60: 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65  a plus the numbe
fc70: 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73 20  r of free bytes 
fc80: 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68  within.    ** th
fc90: 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61  e cell-content a
fca0: 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73 20  rea. If this is 
fcb0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
fcc0: 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20   usable-size.   
fcd0: 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c   ** of the page,
fce0: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
fcf0: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  ust be corrupted
fd00: 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73  . This check als
fd10: 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20  o.    ** serves 
fd20: 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
fd30: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
fd40: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
fd50: 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a  ll-content.    *
fd60: 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e  * area, accordin
fd70: 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  g to the page he
fd80: 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69  ader, lies withi
fd90: 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20  n the page..    
fda0: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  */.    if( nFree
fdb0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
fdc0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fdd0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fde0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
fdf0: 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29  e->nFree = (u16)
fe00: 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69  (nFree - iCellFi
fe10: 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  rst);.    pPage-
fe20: 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d  >isInit = 1;.  }
fe30: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fe40: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
fe50: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
fe60: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
fe70: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
fe80: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
fe90: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
fea0: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
feb0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
fec0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
fed0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
fee0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
fef0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
ff00: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
ff10: 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20  pBt;.  u8 hdr = 
ff20: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
ff30: 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a  ;.  u16 first;..
ff40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ff50: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
ff60: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ff70: 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b  ==pPage->pgno );
ff80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ff90: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
ffa0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
ffb0: 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20  == (void*)pPage 
ffc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
ffd0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
ffe0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fff0: 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73   == data );.  as
10000 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
10010 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
10020 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
10030 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10040 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10050 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
10060 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
10070 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
10080 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
10090 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30  et(&data[hdr], 0
100a0 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  , pBt->usableSiz
100b0 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20  e - hdr);.  }.  
100c0 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61  data[hdr] = (cha
100d0 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74  r)flags;.  first
100e0 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73   = hdr + ((flags
100f0 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20  &PTF_LEAF)==0 ? 
10100 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65  12 : 8);.  memse
10110 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
10120 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64  0, 4);.  data[hd
10130 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32  r+7] = 0;.  put2
10140 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
10150 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  ], pBt->usableSi
10160 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
10170 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  ree = (u16)(pBt-
10180 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69  >usableSize - fi
10190 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c  rst);.  decodeFl
101a0 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73  ags(pPage, flags
101b0 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  );.  pPage->cell
101c0 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a  Offset = first;.
101d0 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
101e0 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75  d = &data[pBt->u
101f0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50  sableSize];.  pP
10200 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20  age->aCellIdx = 
10210 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20  &data[first];.  
10220 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74  pPage->aDataOfst
10230 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e   = &data[pPage->
10240 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20  childPtrSize];. 
10250 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
10260 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  w = 0;.  assert(
10270 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
10280 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
10290 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
102a0 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
102b0 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61   = (u16)(pBt->pa
102c0 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70  geSize - 1);.  p
102d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b  Page->nCell = 0;
102e0 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
102f0 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
10300 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67 65  Convert a DbPage
10310 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74   obtained from t
10320 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20  he pager into a 
10330 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a  MemPage used by.
10340 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  ** the btree lay
10350 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65  er..*/.static Me
10360 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65  mPage *btreePage
10370 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67  FromDbPage(DbPag
10380 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f  e *pDbPage, Pgno
10390 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20   pgno, BtShared 
103a0 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65  *pBt){.  MemPage
103b0 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61   *pPage = (MemPa
103c0 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
103d0 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
103e0 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70  );.  if( pgno!=p
103f0 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  Page->pgno ){.  
10400 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d    pPage->aData =
10410 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10420 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
10430 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67     pPage->pDbPag
10440 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20  e = pDbPage;.   
10450 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
10460 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67  t;.    pPage->pg
10470 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70  no = pgno;.    p
10480 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
10490 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  = pgno==1 ? 100 
104a0 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  : 0;.  }.  asser
104b0 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d  t( pPage->aData=
104c0 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  =sqlite3PagerGet
104d0 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b  Data(pDbPage) );
104e0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b  .  return pPage;
104f0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61   .}../*.** Get a
10500 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70   page from the p
10510 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a  ager.  Initializ
10520 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42  e the MemPage.pB
10530 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65  t and.** MemPage
10540 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20  .aData elements 
10550 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20  if needed.  See 
10560 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e  also: btreeGetUn
10570 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a  usedPage()..**.*
10580 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f 47  * If the PAGER_G
10590 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61  ET_NOCONTENT fla
105a0 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61  g is set, it mea
105b0 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f  ns that we do no
105c0 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20  t care.** about 
105d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
105e0 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73 20  he page at this 
105f0 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74  time.  So do not
10600 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a   go to the disk.
10610 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65 20  ** to fetch the 
10620 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66  content.  Just f
10630 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ill in the conte
10640 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f  nt with zeros fo
10650 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20  r now..** If in 
10660 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63 61  the future we ca
10670 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
10680 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70  rite() on this p
10690 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61  age, that.** mea
106a0 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72 74  ns we have start
106b0 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e  ed to be concern
106c0 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74  ed about content
106d0 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a   and the disk.**
106e0 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
106f0 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
10700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10710 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20 20  btreeGetPage(.  
10720 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
10730 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
10740 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
10750 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
10760 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
10770 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20  e to fetch */.  
10780 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
10790 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74  ,    /* Return t
107a0 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  he page in this 
107b0 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69  parameter */.  i
107c0 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20  nt flags        
107d0 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54      /* PAGER_GET
107e0 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41  _NOCONTENT or PA
107f0 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
10800 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
10810 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10820 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66  ge;..  assert( f
10830 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73  lags==0 || flags
10840 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f  ==PAGER_GET_NOCO
10850 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d  NTENT || flags==
10860 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
10870 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LY );.  assert( 
10880 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10890 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
108a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
108b0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
108c0 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50  ager, pgno, (DbP
108d0 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20  age**)&pDbPage, 
108e0 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63  flags);.  if( rc
108f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
10900 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65 50  *ppPage = btreeP
10910 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10920 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10930 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10940 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10950 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65 20  Retrieve a page 
10960 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63  from the pager c
10970 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65 71  ache. If the req
10980 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
10990 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  ot.** already in
109a0 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
109b0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e   return NULL. In
109c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d  itialize the Mem
109d0 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20  Page.pBt and.** 
109e0 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c  MemPage.aData el
109f0 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64  ements if needed
10a00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
10a10 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f  age *btreePageLo
10a20 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a 70  okup(BtShared *p
10a30 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
10a40 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
10a50 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
10a60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10a70 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10a80 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74   pDbPage = sqlit
10a90 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42  e3PagerLookup(pB
10aa0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  t->pPager, pgno)
10ab0 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20  ;.  if( pDbPage 
10ac0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74  ){.    return bt
10ad0 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67  reePageFromDbPag
10ae0 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c  e(pDbPage, pgno,
10af0 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74   pBt);.  }.  ret
10b00 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
10b10 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
10b20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
10b30 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49  file in pages. I
10b40 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b  f there is any k
10b50 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c  ind of.** error,
10b60 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e   return ((unsign
10b70 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73  ed int)-1)..*/.s
10b80 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65  tatic Pgno btree
10b90 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72  Pagecount(BtShar
10ba0 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75  ed *pBt){.  retu
10bb0 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d  rn pBt->nPage;.}
10bc0 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72 65  .u32 sqlite3Btre
10bd0 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65 20  eLastPage(Btree 
10be0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
10bf0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
10c00 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
10c10 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e  sert( ((p->pBt->
10c20 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30 30  nPage)&0x8000000
10c30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
10c40 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28   btreePagecount(
10c50 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pBt);.}../*.*
10c60 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f  * Get a page fro
10c70 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64 20  m the pager and 
10c80 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a  initialize it..*
10c90 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20  *.** If pCur!=0 
10ca0 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69 73  then the page is
10cb0 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20 61   being fetched a
10cc0 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65  s part of a move
10cd0 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c  ToChild().** cal
10ce0 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61  l.  Do additiona
10cf0 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
10d00 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e  g on the page in
10d10 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41   this case..** A
10d20 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68 20  nd if the fetch 
10d30 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74  fails, this rout
10d40 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65  ine must decreme
10d50 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a  nt pCur->iPage..
10d60 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69  **.** The page i
10d70 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65 61  s fetched as rea
10d80 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70  d-write unless p
10d90 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  Cur is not NULL 
10da0 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64  and is.** a read
10db0 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a  -only cursor..**
10dc0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
10dd0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70  occurs, then *pp
10de0 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65  Page is undefine
10df0 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d  d. It.** may rem
10e00 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f  ain unchanged, o
10e10 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74 20  r it may be set 
10e20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61  to an invalid va
10e30 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
10e40 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  nt getAndInitPag
10e50 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
10e60 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
10e70 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
10e80 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50  base file */.  P
10e90 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10eb0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
10ec0 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
10ed0 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
10ee0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
10ef0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
10f00 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20  ge pointer here 
10f10 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  */.  BtCursor *p
10f20 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
10f30 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74       /* Cursor t
10f40 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70 61  o receive the pa
10f50 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  ge, or NULL */. 
10f60 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20   int bReadOnly  
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72   /* True for a r
10f90 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f  ead-only page */
10fa0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
10fb0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10fc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10fd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10fe0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
10ff0 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
11000 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d  | ppPage==&pCur-
11010 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
11020 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
11030 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65  ( pCur==0 || bRe
11040 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75  adOnly==pCur->cu
11050 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20  rPagerFlags );. 
11060 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30   assert( pCur==0
11070 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   || pCur->iPage>
11080 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f  0 );..  if( pgno
11090 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28  >btreePagecount(
110a0 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  pBt) ){.    rc =
110b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
110c0 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67  BKPT;.    goto g
110d0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
110e0 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ror;.  }.  rc = 
110f0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
11100 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
11110 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44  o, (DbPage**)&pD
11120 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79  bPage, bReadOnly
11130 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
11140 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e     goto getAndIn
11150 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20  itPage_error;.  
11160 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d  }.  *ppPage = (M
11170 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50  emPage*)sqlite3P
11180 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 62  agerGetExtra(pDb
11190 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70  Page);.  if( (*p
111a0 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
111b0 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61  0 ){.    btreePa
111c0 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62  geFromDbPage(pDb
111d0 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29  Page, pgno, pBt)
111e0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
111f0 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67 65  InitPage(*ppPage
11200 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
11210 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11220 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
11230 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f  pPage);.      go
11240 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  to getAndInitPag
11250 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20  e_error;.    }. 
11260 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70   }.  assert( (*p
11270 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67  pPage)->pgno==pg
11280 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  no );.  assert( 
11290 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61  (*ppPage)->aData
112a0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
112b0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
112c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69  ;..  /* If obtai
112d0 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67  ning a child pag
112e0 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20  e for a cursor, 
112f0 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20 74  we must verify t
11300 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 0a  hat the page is.
11310 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20    ** compatible 
11320 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61  with the root pa
11330 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ge. */.  if( pCu
11340 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d  r && ((*ppPage)-
11350 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70  >nCell<1 || (*pp
11360 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70  Page)->intKey!=p
11370 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20  Cur->curIntKey) 
11380 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11390 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
113a0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
113b0 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67  (*ppPage);.    g
113c0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
113d0 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
113e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
113f0 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67  ;..getAndInitPag
11400 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70  e_error:.  if( p
11410 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67  Cur ) pCur->iPag
11420 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  e--;.  testcase(
11430 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73   pgno==0 );.  as
11440 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c  sert( pgno!=0 ||
11450 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
11460 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  UPT );.  return 
11470 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  rc;.}../*.** Rel
11480 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20  ease a MemPage. 
11490 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20   This should be 
114a0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
114b0 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61  each prior.** ca
114c0 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50 61  ll to btreeGetPa
114d0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
114e0 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  id releasePageNo
114f0 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  tNull(MemPage *p
11500 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
11510 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
11520 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11530 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
11540 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  t( pPage->pDbPag
11550 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  e!=0 );.  assert
11560 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
11570 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
11580 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
11590 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
115a0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
115b0 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
115c0 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
115d0 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72  aData );.  asser
115e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
115f0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
11600 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
11610 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e  lite3PagerUnrefN
11620 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44  otNull(pPage->pD
11630 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63  bPage);.}.static
11640 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
11650 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
11660 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
11670 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
11680 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f  ull(pPage);.}../
11690 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73  *.** Get an unus
116a0 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ed page..**.** T
116b0 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c  his works just l
116c0 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67 65  ike btreeGetPage
116d0 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64 69  () with the addi
116e0 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  tion:.**.**   * 
116f0 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
11700 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20 66  already in use f
11710 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
11720 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65  rpose, immediate
11730 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61  ly.**      relea
11740 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e  se it and return
11750 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55   an SQLITE_CURRU
11760 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a  PT error..**   *
11770 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20    Make sure the 
11780 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63  isInit flag is c
11790 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lear.*/.static i
117a0 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  nt btreeGetUnuse
117b0 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  dPage(.  BtShare
117c0 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
117d0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
117e0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
117f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
11800 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
11810 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
11820 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
11830 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
11840 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
11850 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  er */.  int flag
11860 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s            /* 
11870 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
11880 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54  ENT or PAGER_GET
11890 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a  _READONLY */.){.
118a0 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65    int rc = btree
118b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
118c0 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73  o, ppPage, flags
118d0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
118e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
118f0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11900 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50  geRefcount((*ppP
11910 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31  age)->pDbPage)>1
11920 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73   ){.      releas
11930 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
11940 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20        *ppPage = 
11950 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  0;.      return 
11960 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11970 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28  KPT;.    }.    (
11980 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
11990 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
119a0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
119b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
119c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e  .}.../*.** Durin
119d0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68  g a rollback, wh
119e0 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65 6c  en the pager rel
119f0 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  oads information
11a00 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a   into the cache.
11a10 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 63  ** so that the c
11a20 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64  ache is restored
11a30 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
11a40 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73 74   state at the st
11a50 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  art of.** the tr
11a60 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65  ansaction, for e
11a70 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72 65  ach page restore
11a80 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  d this routine i
11a90 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
11aa0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65  This routine nee
11ab0 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65 20  ds to reset the 
11ac0 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74 69  extra data secti
11ad0 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  on at the end of
11ae0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
11af0 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
11b00 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f  estored data..*/
11b10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
11b20 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a  eReinit(DbPage *
11b30 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67  pData){.  MemPag
11b40 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67  e *pPage;.  pPag
11b50 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73  e = (MemPage *)s
11b60 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11b70 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73  tra(pData);.  as
11b80 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
11b90 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
11ba0 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28  Data)>0 );.  if(
11bb0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
11bc0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
11bd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
11be0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
11bf0 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ex) );.    pPage
11c00 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
11c10 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
11c20 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
11c30 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20  Data)>1 ){.     
11c40 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20   /* pPage might 
11c50 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20 70  not be a btree p
11c60 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62  age;  it might b
11c70 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
11c80 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70  ge.      ** or p
11c90 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20  trmap page or a 
11ca0 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74  free page.  In t
11cb0 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65 20  hose cases, the 
11cc0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20  following.      
11cd0 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65  ** call to btree
11ce0 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20  InitPage() will 
11cf0 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51  likely return SQ
11d00 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20  LITE_CORRUPT..  
11d10 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61      ** But no ha
11d20 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68  rm is done by th
11d30 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76  is.  And it is v
11d40 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68  ery important th
11d50 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65  at.      ** btre
11d60 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20 63  eInitPage() be c
11d70 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62  alled on every b
11d80 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65 20  tree page so we 
11d90 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  make.      ** th
11da0 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79  e call for every
11db0 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73   page that comes
11dc0 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69   in for re-initi
11dd0 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72  ng. */.      btr
11de0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
11df0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
11e00 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
11e10 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
11e20 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
11e30 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e  atic int btreeIn
11e40 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28  vokeBusyHandler(
11e50 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42  void *pArg){.  B
11e60 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28  tShared *pBt = (
11e70 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a  BtShared*)pArg;.
11e80 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64    assert( pBt->d
11e90 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  b );.  assert( s
11ea0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11eb0 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78  d(pBt->db->mutex
11ec0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ) );.  return sq
11ed0 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
11ee0 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d  andler(&pBt->db-
11ef0 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d  >busyHandler);.}
11f00 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64  ../*.** Open a d
11f10 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
11f20 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69   .** zFilename i
11f30 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
11f40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11f50 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
11f60 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61  s NULL.** then a
11f70 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  n ephemeral data
11f80 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64 2e  base is created.
11f90 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20    The ephemeral 
11fa0 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a  database might.*
11fb0 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79  * be exclusively
11fc0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69   in memory, or i
11fd0 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64 69  t might use a di
11fe0 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20  sk-based memory 
11ff0 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72  cache..** Either
12000 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65   way, the epheme
12010 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c  ral database wil
12020 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
12030 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77  ly deleted .** w
12040 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65  hen sqlite3Btree
12050 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
12060 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  d..**.** If zFil
12070 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72  ename is ":memor
12080 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d  y:" then an in-m
12090 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
120a0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61  s created.** tha
120b0 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c  t is automatical
120c0 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68 65  ly destroyed whe
120d0 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
120e0 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73  **.** The "flags
120f0 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  " parameter is a
12100 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69   bitmask that mi
12110 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73  ght contain bits
12120 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f   like.** BTREE_O
12130 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f  MIT_JOURNAL and/
12140 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e  or BTREE_MEMORY.
12150 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
12160 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64  tabase is alread
12170 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20  y opened in the 
12180 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f  same database co
12190 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  nnection.** and 
121a0 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65 64  we are in shared
121b0 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65   cache mode, the
121c0 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20  n the open will 
121d0 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fail with an.** 
121e0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
121f0 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e  T error.  We can
12200 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72  not allow two or
12210 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a   more BtShared.*
12220 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65  * objects in the
12230 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
12240 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20  onnection since 
12250 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65  doing so will le
12260 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d  ad.** to problem
12270 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a  s with locking..
12280 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
12290 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  reeOpen(.  sqlit
122a0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
122b0 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
122c0 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65   for this b-tree
122d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
122e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a   *zFilename,  /*
122f0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
12300 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
12310 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20   BTree database 
12320 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12330 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
12340 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  Associated datab
12350 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
12360 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c  Btree **ppBtree,
12370 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
12380 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20  er to new Btree 
12390 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68  object written h
123a0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ere */.  int fla
123b0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
123c0 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20   /* Options */. 
123d0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
123e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
123f0 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68  s passed through
12400 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e   to sqlite3_vfs.
12410 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20  xOpen() */.){.  
12420 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12430 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
12440 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
12450 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
12460 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
12470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12480 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74       /* Handle t
12490 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71  o return */.  sq
124a0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
124b0 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20  exOpen = 0;  /* 
124c0 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65 20  Prevents a race 
124d0 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65  condition. Ticke
124e0 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74  t #3537 */.  int
124f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
12510 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20  esult code from 
12520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
12530 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20  .  u8 nReserve; 
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75    /* Byte of unu
12560 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63  sed space on eac
12570 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  h page */.  unsi
12580 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65 61  gned char zDbHea
12590 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61  der[100];  /* Da
125a0 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63 6f  tabase header co
125b0 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ntent */..  /* T
125c0 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61  rue if opening a
125d0 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d  n ephemeral, tem
125e0 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 20  porary database 
125f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  */.  const int i
12600 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e  sTempDb = zFilen
12610 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
12620 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a  ame[0]==0;..  /*
12630 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
12640 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
12650 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
12660 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
12670 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
12680 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
12690 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64  abase..  */.#ifd
126a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
126b0 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20  EMORYDB.  const 
126c0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
126d0 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69  .#else.  const i
126e0 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46  nt isMemdb = (zF
126f0 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d  ilename && strcm
12700 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d  p(zFilename, ":m
12710 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20  emory:")==0).   
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62      || (isTempDb
12740 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49   && sqlite3TempI
12750 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20  nMemory(db)).   
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12770 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73      || (vfsFlags
12780 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
12790 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69  EMORY)!=0;.#endi
127a0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 21  f..  assert( db!
127b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
127c0 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pVfs!=0 );.  ass
127d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
127e0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
127f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
12800 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c  (flags&0xff)==fl
12810 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67  ags );   /* flag
12820 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73 20  s fit in 8 bits 
12830 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20  */..  /* Only a 
12840 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
12850 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54 52  abase can be BTR
12860 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a  EE_UNORDERED */.
12870 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12880 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52   & BTREE_UNORDER
12890 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  ED)==0 || (flags
128a0 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
128b0 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42  !=0 );..  /* A B
128c0 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61  TREE_SINGLE data
128d0 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20 61  base is always a
128e0 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f   temporary and/o
128f0 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20  r ephemeral */. 
12900 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20   assert( (flags 
12910 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d  & BTREE_SINGLE)=
12920 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29  =0 || isTempDb )
12930 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62  ;..  if( isMemdb
12940 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
12950 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20   BTREE_MEMORY;. 
12960 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61   }.  if( (vfsFla
12970 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
12980 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
12990 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65  (isMemdb || isTe
129a0 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73  mpDb) ){.    vfs
129b0 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67  Flags = (vfsFlag
129c0 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  s & ~SQLITE_OPEN
129d0 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49  _MAIN_DB) | SQLI
129e0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b  TE_OPEN_TEMP_DB;
129f0 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
12a00 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a  e3MallocZero(siz
12a10 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69  eof(Btree));.  i
12a20 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74  f( !p ){.    ret
12a30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12a40 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e  _BKPT;.  }.  p->
12a50 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
12a60 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  NONE;.  p->db = 
12a70 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
12a80 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
12a90 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70  ACHE.  p->lock.p
12aa0 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d 3e  Btree = p;.  p->
12ab0 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31 3b  lock.iTable = 1;
12ac0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
12ad0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
12ae0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
12af0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
12b00 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
12b10 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69    /*.  ** If thi
12b20 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61 6e  s Btree is a can
12b30 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72 65  didate for share
12b40 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f 20  d cache, try to 
12b50 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69  find an.  ** exi
12b60 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20 6f  sting BtShared o
12b70 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63 61  bject that we ca
12b80 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20 2a  n share with.  *
12b90 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44 62  /.  if( isTempDb
12ba0 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62 3d  ==0 && (isMemdb=
12bb0 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 26  =0 || (vfsFlags&
12bc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
12bd0 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0) ){.    if( 
12be0 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  vfsFlags & SQLIT
12bf0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
12c00 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  HE ){.      int 
12c10 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c 69  nFilename = sqli
12c20 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
12c30 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20 20  ename)+1;.      
12c40 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d  int nFullPathnam
12c50 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
12c60 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63 68  name+1;.      ch
12c70 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ar *zFullPathnam
12c80 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  e = sqlite3Mallo
12c90 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68 6e  c(MAX(nFullPathn
12ca0 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29 3b  ame,nFilename));
12cb0 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
12cc0 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
12cd0 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 20  x *mutexShared; 
12ce0 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  )..      p->shar
12cf0 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
12d00 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61  if( !zFullPathna
12d10 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  me ){.        sq
12d20 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
12d30 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12d40 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
12d50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12d60 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  f( isMemdb ){.  
12d70 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 75        memcpy(zFu
12d80 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69 6c  llPathname, zFil
12d90 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d 65  ename, nFilename
12da0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12db0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12dc0 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
12dd0 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61  me(pVfs, zFilena
12de0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74 68         nFullPath
12e10 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
12e20 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
12e30 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
12e40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12e50 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12e60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12e70 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20  _free(p);.      
12e80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12ea0 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
12eb0 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75 74  ADSAFE.      mut
12ec0 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65 33  exOpen = sqlite3
12ed0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
12ee0 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4f  E_MUTEX_STATIC_O
12ef0 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  PEN);.      sqli
12f00 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
12f10 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20 20  mutexOpen);.    
12f20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
12f30 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
12f40 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
12f50 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
12f60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
12f70 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68  ex_enter(mutexSh
12f80 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ared);.#endif.  
12f90 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f 42      for(pBt=GLOB
12fa0 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
12fb0 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
12fc0 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d 70  ist); pBt; pBt=p
12fd0 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  Bt->pNext){.    
12fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12ff0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20  >nRef>0 );.     
13000 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70     if( 0==strcmp
13010 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
13020 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65  sqlite3PagerFile
13030 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65 72  name(pBt->pPager
13040 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  , 0)).          
13050 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
13060 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70  3PagerVfs(pBt->p
13070 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a  Pager)==pVfs ){.
13080 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44            int iD
13090 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  b;.          for
130a0 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20  (iDb=db->nDb-1; 
130b0 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a  iDb>=0; iDb--){.
130c0 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72 65              Btre
130d0 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20 64  e *pExisting = d
130e0 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b  b->aDb[iDb].pBt;
130f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13100 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70 45   pExisting && pE
13110 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70 42  xisting->pBt==pB
13120 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
13130 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13140 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13150 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ed);.           
13160 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13170 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65 6e  _leave(mutexOpen
13180 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
13190 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
131a0 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
131b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
131c0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
131d0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
131e0 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  n SQLITE_CONSTRA
131f0 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  INT;.           
13200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
13210 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
13220 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
13230 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
13240 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13260 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
13270 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13280 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
13290 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
132a0 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
132b0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
132c0 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
132d0 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
132e0 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
132f0 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
13300 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
13310 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
13320 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
13330 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
13340 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
13350 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
13360 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
13370 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
13380 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
13390 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
133a0 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
133b0 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
133c0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
133d0 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
133e0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
133f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
13400 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
13410 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
13420 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
13430 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
13440 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
13450 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
13460 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
13470 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
13480 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
13490 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
134a0 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
134b0 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
134c0 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
134d0 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
134e0 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
134f0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
13500 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73  4)==8 );.    ass
13510 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34 29  ert( sizeof(u64)
13520 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==8 );.    asser
13530 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d  t( sizeof(u32)==
13540 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
13550 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20   sizeof(u16)==2 
13560 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
13570 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29  izeof(Pgno)==4 )
13580 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73  ;.  .    pBt = s
13590 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
135a0 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29  ( sizeof(*pBt) )
135b0 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30  ;.    if( pBt==0
135c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
135d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
135e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  ;.      goto btr
135f0 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13600 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13610 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66  te3PagerOpen(pVf
13620 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c  s, &pBt->pPager,
13630 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20   zFilename,.    
13640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13650 20 20 20 20 20 20 73 69 7a 65 6f 66 28 4d 65 6d        sizeof(Mem
13660 50 61 67 65 29 2c 20 66 6c 61 67 73 2c 20 76 66  Page), flags, vf
13670 73 46 6c 61 67 73 2c 20 70 61 67 65 52 65 69 6e  sFlags, pageRein
13680 69 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  it);.    if( rc=
13690 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
136a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
136b0 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
136c0 2d 3e 70 50 61 67 65 72 2c 20 64 62 2d 3e 73 7a  ->pPager, db->sz
136d0 4d 6d 61 70 29 3b 0a 20 20 20 20 20 20 72 63 20  Mmap);.      rc 
136e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  = sqlite3PagerRe
136f0 61 64 46 69 6c 65 68 65 61 64 65 72 28 70 42 74  adFileheader(pBt
13700 2d 3e 70 50 61 67 65 72 2c 73 69 7a 65 6f 66 28  ->pPager,sizeof(
13710 7a 44 62 48 65 61 64 65 72 29 2c 7a 44 62 48 65  zDbHeader),zDbHe
13720 61 64 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ader);.    }.   
13730 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13740 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
13750 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
13760 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e  .    }.    pBt->
13770 6f 70 65 6e 46 6c 61 67 73 20 3d 20 28 75 38 29  openFlags = (u8)
13780 66 6c 61 67 73 3b 0a 20 20 20 20 70 42 74 2d 3e  flags;.    pBt->
13790 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 73 71 6c  db = db;.    sql
137a0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
137b0 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70 50 61  handler(pBt->pPa
137c0 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f 6b 65  ger, btreeInvoke
137d0 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70 42 74  BusyHandler, pBt
137e0 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20 3d 20  );.    p->pBt = 
137f0 70 42 74 3b 0a 20 20 0a 20 20 20 20 70 42 74 2d  pBt;.  .    pBt-
13800 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
13810 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
13820 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
13830 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
13840 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  y(pBt->pPager) )
13850 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13860 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b  = BTS_READ_ONLY;
13870 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
13880 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 20  ECURE_DELETE.   
13890 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
138a0 3d 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  = BTS_SECURE_DEL
138b0 45 54 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ETE;.#endif.    
138c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
138d0 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
138e0 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
138f0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
13900 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
13910 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
13920 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
13930 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
13940 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
13950 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
13960 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
13970 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
13980 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13990 20 3d 20 28 7a 44 62 48 65 61 64 65 72 5b 31 36   = (zDbHeader[16
139a0 5d 3c 3c 38 29 20 7c 20 28 7a 44 62 48 65 61 64  ]<<8) | (zDbHead
139b0 65 72 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20  er[17]<<16);.   
139c0 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
139d0 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70  ze<512 || pBt->p
139e0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
139f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a 20 20 20  AX_PAGE_SIZE.   
13a00 20 20 20 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e        || ((pBt->
13a10 70 61 67 65 53 69 7a 65 2d 31 29 26 70 42 74 2d  pageSize-1)&pBt-
13a20 3e 70 61 67 65 53 69 7a 65 29 21 3d 30 20 29 7b  >pageSize)!=0 ){
13a30 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65  .      pBt->page
13a40 53 69 7a 65 20 3d 20 30 3b 0a 23 69 66 6e 64 65  Size = 0;.#ifnde
13a50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13a60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f  TOVACUUM.      /
13a70 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e  * If the magic n
13a80 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77  ame ":memory:" w
13a90 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e  ill create an in
13aa0 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
13ab0 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
13ac0 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61  leave the autoVa
13ad0 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28  cuum mode at 0 (
13ae0 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75  do not auto-vacu
13af0 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  um), even if.   
13b00 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46     ** SQLITE_DEF
13b10 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
13b20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20  is true. On the 
13b30 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20  other hand, if. 
13b40 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f       ** SQLITE_O
13b50 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73  MIT_MEMORYDB has
13b60 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74   been defined, t
13b70 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69  hen ":memory:" i
13b80 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a  s just a.      *
13b90 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e  * regular file-n
13ba0 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
13bb0 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  e the auto-vacuu
13bc0 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72  m applies as per
13bd0 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a   normal..      *
13be0 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c  /.      if( zFil
13bf0 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64  ename && !isMemd
13c00 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  b ){.        pBt
13c10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
13c20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13c30 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20  UTOVACUUM ? 1 : 
13c40 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d  0);.        pBt-
13c50 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53  >incrVacuum = (S
13c60 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
13c70 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20  TOVACUUM==2 ? 1 
13c80 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  : 0);.      }.#e
13c90 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65  ndif.      nRese
13ca0 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  rve = 0;.    }el
13cb0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  se{.      /* EVI
13cc0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39  DENCE-OF: R-3749
13cd0 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a 65  7-42412 The size
13ce0 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65 64   of the reserved
13cf0 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20 20   region is.     
13d00 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
13d10 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75  y the one-byte u
13d20 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20  nsigned integer 
13d30 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73  found at an offs
13d40 65 74 20 6f 66 20 32 30 0a 20 20 20 20 20 20 2a  et of 20.      *
13d50 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  * into the datab
13d60 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e  ase file header.
13d70 20 2a 2f 0a 20 20 20 20 20 20 6e 52 65 73 65 72   */.      nReser
13d80 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32  ve = zDbHeader[2
13d90 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62  0];.      pBt->b
13da0 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
13db0 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23  AGESIZE_FIXED;.#
13dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13dd0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
13de0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
13df0 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
13e00 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
13e10 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20  4*4])?1:0);.    
13e20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75    pBt->incrVacuu
13e30 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a  m = (get4byte(&z
13e40 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20 37 2a  DbHeader[36 + 7*
13e50 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
13e60 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
13e70 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
13e80 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
13e90 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
13ea0 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a  ize, nReserve);.
13eb0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
13ec0 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74  o btree_open_out
13ed0 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c  ;.    pBt->usabl
13ee0 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67  eSize = pBt->pag
13ef0 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65  eSize - nReserve
13f00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
13f10 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20 37  Bt->pageSize & 7
13f20 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62 79  )==0 );  /* 8-by
13f30 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66 20  te alignment of 
13f40 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20 0a  pageSize */.   .
13f50 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
13f60 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
13f70 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
13f80 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
13f90 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41 64  ISKIO).    /* Ad
13fa0 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61 72  d the new BtShar
13fb0 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  ed object to the
13fc0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68 61   linked list sha
13fd0 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73 2e  rable BtShareds.
13fe0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d  .    */.    pBt-
13ff0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 69  >nRef = 1;.    i
14000 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
14010 7b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  {.      MUTEX_LO
14020 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
14030 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
14040 20 29 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c   ).      MUTEX_L
14050 4f 47 49 43 28 20 6d 75 74 65 78 53 68 61 72 65  OGIC( mutexShare
14060 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
14070 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
14080 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
14090 29 3b 29 0a 20 20 20 20 20 20 69 66 28 20 53 51  );).      if( SQ
140a0 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
140b0 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
140c0 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
140d0 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
140e0 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
140f0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14100 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
14110 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
14120 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
14130 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14140 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
14150 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
14160 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
14170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
14180 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
14190 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
141a0 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
141b0 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41  t->pNext = GLOBA
141c0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
141d0 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
141e0 73 74 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41  st);.      GLOBA
141f0 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14200 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14210 73 74 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  st) = pBt;.     
14220 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14230 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
14240 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
14250 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
14260 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
14270 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
14280 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14290 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
142a0 20 49 66 20 74 68 65 20 6e 65 77 20 42 74 72 65   If the new Btre
142b0 65 20 75 73 65 73 20 61 20 73 68 61 72 61 62 6c  e uses a sharabl
142c0 65 20 70 42 74 53 68 61 72 65 64 2c 20 74 68 65  e pBtShared, the
142d0 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20  n link the new. 
142e0 20 2a 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74   ** Btree into t
142f0 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73  he list of all s
14300 68 61 72 61 62 6c 65 20 42 74 72 65 65 73 20 66  harable Btrees f
14310 6f 72 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e  or the same conn
14320 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65  ection..  ** The
14330 20 6c 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e   list is kept in
14340 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
14350 20 62 79 20 70 42 74 20 61 64 64 72 65 73 73 2e   by pBt address.
14360 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73  .  */.  if( p->s
14370 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  harable ){.    i
14380 6e 74 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20  nt i;.    Btree 
14390 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69  *pSib;.    for(i
143a0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
143b0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  ++){.      if( (
143c0 70 53 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69  pSib = db->aDb[i
143d0 5d 2e 70 42 74 29 21 3d 30 20 26 26 20 70 53 69  ].pBt)!=0 && pSi
143e0 62 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  b->sharable ){. 
143f0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53         while( pS
14400 69 62 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69  ib->pPrev ){ pSi
14410 62 20 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b  b = pSib->pPrev;
14420 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
14430 75 70 74 72 29 70 2d 3e 70 42 74 3c 28 75 70 74  uptr)p->pBt<(upt
14440 72 29 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  r)pSib->pBt ){. 
14450 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
14460 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
14470 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
14480 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
14490 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
144a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
144b0 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
144c0 62 2d 3e 70 4e 65 78 74 20 26 26 20 28 75 70 74  b->pNext && (upt
144d0 72 29 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e 70  r)pSib->pNext->p
144e0 42 74 3c 28 75 70 74 72 29 70 2d 3e 70 42 74 20  Bt<(uptr)p->pBt 
144f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
14500 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78  Sib = pSib->pNex
14510 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
14520 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
14530 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  t = pSib->pNext;
14540 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
14550 72 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  rev = pSib;.    
14560 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65        if( p->pNe
14570 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  xt ){.          
14580 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
14590 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20  v = p;.         
145a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69   }.          pSi
145b0 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20  b->pNext = p;.  
145c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
145d0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
145e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
145f0 20 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a    *ppBtree = p;.
14600 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a  .btree_open_out:
14610 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14620 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
14630 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67  pBt && pBt->pPag
14640 65 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  er ){.      sqli
14650 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
14660 74 2d 3e 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  t->pPager, 0);. 
14670 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
14680 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
14690 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
146a0 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
146b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
146c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
146d0 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  ile;..    /* If 
146e0 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20 73  the B-Tree was s
146f0 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65 6e  uccessfully open
14700 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67 65  ed, set the page
14710 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f 20  r-cache size to 
14720 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
14730 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
14740 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 6f  , when opening o
14750 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68  n an existing sh
14760 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65  ared pager-cache
14770 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74 20  ,.    ** do not 
14780 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 72  change the pager
14790 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20 20  -cache size..   
147a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
147b0 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 70  te3BtreeSchema(p
147c0 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  , 0, 0)==0 ){.  
147d0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
147e0 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d 3e  SetCachesize(p->
147f0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
14800 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48  ITE_DEFAULT_CACH
14810 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a 0a  E_SIZE);.    }..
14820 20 20 20 20 70 46 69 6c 65 20 3d 20 73 71 6c 69      pFile = sqli
14830 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
14840 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
14850 66 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  f( pFile->pMetho
14860 64 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ds ){.      sqli
14870 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
14880 48 69 6e 74 28 70 46 69 6c 65 2c 20 53 51 4c 49  Hint(pFile, SQLI
14890 54 45 5f 46 43 4e 54 4c 5f 50 44 42 2c 20 28 76  TE_FCNTL_PDB, (v
148a0 6f 69 64 2a 29 26 70 42 74 2d 3e 64 62 29 3b 0a  oid*)&pBt->db);.
148b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
148c0 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20 20 20  mutexOpen ){.   
148d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
148e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75 74 65  _mutex_held(mute
148f0 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20 73 71  xOpen) );.    sq
14900 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
14910 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20  e(mutexOpen);.  
14920 7d 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  }.  assert( rc!=
14930 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 71 6c  SQLITE_OK || sql
14940 69 74 65 33 42 74 72 65 65 43 6f 6e 6e 65 63 74  ite3BtreeConnect
14950 69 6f 6e 43 6f 75 6e 74 28 2a 70 70 42 74 72 65  ionCount(*ppBtre
14960 65 29 3e 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  e)>0 );.  return
14970 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
14980 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
14990 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
149a0 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
149b0 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
149c0 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
149d0 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
149e0 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
149f0 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
14a00 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
14a10 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
14a20 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
14a30 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
14a40 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
14a50 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
14a60 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
14a70 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
14a80 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
14a90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14aa0 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
14ab0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
14ac0 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73  ite3_mutex *pMas
14ad0 74 65 72 3b 20 29 0a 20 20 42 74 53 68 61 72 65  ter; ).  BtShare
14ae0 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
14af0 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
14b00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
14b10 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
14b20 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 4d  t->mutex) );.  M
14b30 55 54 45 58 5f 4c 4f 47 49 43 28 20 70 4d 61 73  UTEX_LOGIC( pMas
14b40 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  ter = sqlite3Mut
14b50 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
14b60 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54  UTEX_STATIC_MAST
14b70 45 52 29 3b 20 29 0a 20 20 73 71 6c 69 74 65 33  ER); ).  sqlite3
14b80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
14b90 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52  ster);.  pBt->nR
14ba0 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d  ef--;.  if( pBt-
14bb0 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20  >nRef<=0 ){.    
14bc0 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  if( GLOBAL(BtSha
14bd0 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
14be0 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70 42  edCacheList)==pB
14bf0 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42 41  t ){.      GLOBA
14c00 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14c10 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14c20 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74  st) = pBt->pNext
14c30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14c40 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42 41     pList = GLOBA
14c50 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14c60 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14c70 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  st);.      while
14c80 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
14c90 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 21  && pList->pNext!
14ca0 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
14cb0 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e 65  pList=pList->pNe
14cc0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
14cd0 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c 69    if( ALWAYS(pLi
14ce0 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  st) ){.        p
14cf0 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 42  List->pNext = pB
14d00 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  t->pNext;.      
14d10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
14d20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
14d30 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E ){.      sqlit
14d40 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 42  e3_mutex_free(pB
14d50 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d  t->mutex);.    }
14d60 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20 31  .    removed = 1
14d70 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
14d80 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
14d90 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
14da0 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20 20  emoved;.#else.  
14db0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
14dc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
14dd0 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  ure pBt->pTmpSpa
14de0 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  ce points to an 
14df0 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a  allocation of .*
14e00 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  * MX_CELL_SIZE(p
14e10 42 74 29 20 62 79 74 65 73 20 77 69 74 68 20 61  Bt) bytes with a
14e20 20 34 2d 62 79 74 65 20 70 72 65 66 69 78 20 66   4-byte prefix f
14e30 6f 72 20 61 20 6c 65 66 74 2d 63 68 69 6c 64 0a  or a left-child.
14e40 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  ** pointer..*/.s
14e50 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
14e60 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
14e70 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
14e80 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
14e90 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
14ea0 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
14eb0 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
14ec0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 0a  t->pageSize );..
14ed0 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
14ee0 65 20 75 73 65 73 20 6f 66 20 70 42 74 2d 3e 70  e uses of pBt->p
14ef0 54 6d 70 53 70 61 63 65 20 69 73 20 74 6f 20 66  TmpSpace is to f
14f00 6f 72 6d 61 74 20 63 65 6c 6c 73 20 62 65 66 6f  ormat cells befo
14f10 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
14f20 69 6e 67 20 74 68 65 6d 20 69 6e 74 6f 20 61 20  ing them into a 
14f30 6c 65 61 66 20 70 61 67 65 20 28 66 75 6e 63 74  leaf page (funct
14f40 69 6f 6e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29  ion fillInCell()
14f50 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 63  ). If.    ** a c
14f60 65 6c 6c 20 69 73 20 6c 65 73 73 20 74 68 61 6e  ell is less than
14f70 20 34 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   4 bytes in size
14f80 2c 20 69 74 20 69 73 20 72 6f 75 6e 64 65 64 20  , it is rounded 
14f90 75 70 20 74 6f 20 34 20 62 79 74 65 73 0a 20 20  up to 4 bytes.  
14fa0 20 20 2a 2a 20 62 79 20 74 68 65 20 76 61 72 69    ** by the vari
14fb0 6f 75 73 20 72 6f 75 74 69 6e 65 73 20 74 68 61  ous routines tha
14fc0 74 20 6d 61 6e 69 70 75 6c 61 74 65 20 62 69 6e  t manipulate bin
14fd0 61 72 79 20 63 65 6c 6c 73 2e 20 57 68 69 63 68  ary cells. Which
14fe0 0a 20 20 20 20 2a 2a 20 63 61 6e 20 6d 65 61 6e  .    ** can mean
14ff0 20 74 68 61 74 20 66 69 6c 6c 49 6e 43 65 6c 6c   that fillInCell
15000 28 29 20 6f 6e 6c 79 20 69 6e 69 74 69 61 6c 69  () only initiali
15010 7a 65 73 20 74 68 65 20 66 69 72 73 74 20 32 20  zes the first 2 
15020 6f 72 20 33 0a 20 20 20 20 2a 2a 20 62 79 74 65  or 3.    ** byte
15030 73 20 6f 66 20 70 54 6d 70 53 70 61 63 65 2c 20  s of pTmpSpace, 
15040 62 75 74 20 74 68 61 74 20 74 68 65 20 66 69 72  but that the fir
15050 73 74 20 34 20 62 79 74 65 73 20 61 72 65 20 63  st 4 bytes are c
15060 6f 70 69 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  opied from.    *
15070 2a 20 69 74 20 69 6e 74 6f 20 61 20 64 61 74 61  * it into a data
15080 62 61 73 65 20 70 61 67 65 2e 20 54 68 69 73 20  base page. This 
15090 69 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  is not actually 
150a0 61 20 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 69  a problem, but i
150b0 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20 63 61  t.    ** does ca
150c0 75 73 65 20 61 20 76 61 6c 67 72 69 6e 64 20 65  use a valgrind e
150d0 72 72 6f 72 20 77 68 65 6e 20 74 68 65 20 31 20  rror when the 1 
150e0 6f 72 20 32 20 62 79 74 65 73 20 6f 66 20 75 6e  or 2 bytes of un
150f0 69 74 69 61 6c 69 7a 65 64 20 0a 20 20 20 20 2a  itialized .    *
15100 2a 20 64 61 74 61 20 69 73 20 70 61 73 73 65 64  * data is passed
15110 20 74 6f 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   to system call 
15120 77 72 69 74 65 28 29 2e 20 53 6f 20 74 6f 20 61  write(). So to a
15130 76 6f 69 64 20 74 68 69 73 20 65 72 72 6f 72 2c  void this error,
15140 0a 20 20 20 20 2a 2a 20 7a 65 72 6f 20 74 68 65  .    ** zero the
15150 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
15160 66 20 74 65 6d 70 20 73 70 61 63 65 20 68 65 72  f temp space her
15170 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
15180 20 41 6c 73 6f 3a 20 20 50 72 6f 76 69 64 65 20   Also:  Provide 
15190 66 6f 75 72 20 62 79 74 65 73 20 6f 66 20 69 6e  four bytes of in
151a0 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
151b0 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
151c0 2a 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70  * beginning of p
151d0 54 6d 70 53 70 61 63 65 20 61 73 20 61 6e 20 61  TmpSpace as an a
151e0 72 65 61 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  rea available to
151f0 20 70 72 65 70 65 6e 64 20 74 68 65 0a 20 20 20   prepend the.   
15200 20 2a 2a 20 6c 65 66 74 2d 63 68 69 6c 64 20 70   ** left-child p
15210 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 65  ointer to the be
15220 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 63 65 6c  ginning of a cel
15230 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
15240 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
15250 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
15260 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 2c  (pBt->pTmpSpace,
15270 20 30 2c 20 38 29 3b 0a 20 20 20 20 20 20 70 42   0, 8);.      pB
15280 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2b 3d 20  t->pTmpSpace += 
15290 34 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  4;.    }.  }.}..
152a0 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70  /*.** Free the p
152b0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c  Bt->pTmpSpace al
152c0 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  location.*/.stat
152d0 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70  ic void freeTemp
152e0 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a  Space(BtShared *
152f0 70 42 74 29 7b 0a 20 20 69 66 28 20 70 42 74 2d  pBt){.  if( pBt-
15300 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
15310 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
15320 20 2d 3d 20 34 3b 0a 20 20 20 20 73 71 6c 69 74   -= 4;.    sqlit
15330 65 33 50 61 67 65 46 72 65 65 28 70 42 74 2d 3e  e3PageFree(pBt->
15340 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
15350 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
15360 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
15370 20 43 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64   Close an open d
15380 61 74 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61  atabase and inva
15390 6c 69 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f  lidate all curso
153a0 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
153b0 65 33 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72  e3BtreeClose(Btr
153c0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
153d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
153e0 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  ;.  BtCursor *pC
153f0 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  ur;..  /* Close 
15400 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  all cursors open
15410 65 64 20 76 69 61 20 74 68 69 73 20 68 61 6e 64  ed via this hand
15420 6c 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  le.  */.  assert
15430 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15440 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15450 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15460 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15470 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75 72  pCur = pBt->pCur
15480 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70 43  sor;.  while( pC
15490 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72 73  ur ){.    BtCurs
154a0 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72 3b  or *pTmp = pCur;
154b0 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75 72  .    pCur = pCur
154c0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28  ->pNext;.    if(
154d0 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d 70   pTmp->pBtree==p
154e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
154f0 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f  3BtreeCloseCurso
15500 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a 20  r(pTmp);.    }. 
15510 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61 63   }..  /* Rollbac
15520 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72 61  k any active tra
15530 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72 65  nsaction and fre
15540 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74 72  e the handle str
15550 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68 65  ucture..  ** The
15560 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
15570 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 20  BtreeRollback() 
15580 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65 2d  drops any table-
15590 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20 20  locks held by.  
155a0 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 0a  ** this handle..
155b0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
155c0 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 53  reeRollback(p, S
155d0 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
155e0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
155f0 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  e(p);..  /* If t
15600 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f  here are still o
15610 74 68 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67  ther outstanding
15620 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
15630 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a  he shared-btree.
15640 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20    ** structure, 
15650 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20  return now. The 
15660 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69  remainder of thi
15670 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
15680 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20  ns .  ** up the 
15690 73 68 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20  shared-btree..  
156a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
156b0 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26  wantToLock==0 &&
156c0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
156d0 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
156e0 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f  ble || removeFro
156f0 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74  mSharingList(pBt
15700 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  ) ){.    /* The 
15710 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  pBt is no longer
15720 20 6f 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20   on the sharing 
15730 6c 69 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20  list, so we can 
15740 61 63 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74  access.    ** it
15750 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
15760 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
15770 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
15780 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64   Clean out and d
15790 65 6c 65 74 65 20 74 68 65 20 42 74 53 68 61 72  elete the BtShar
157a0 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a  ed object..    *
157b0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
157c0 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20  Bt->pCursor );. 
157d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
157e0 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
157f0 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66  , p->db);.    if
15800 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65  ( pBt->xFreeSche
15810 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65  ma && pBt->pSche
15820 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  ma ){.      pBt-
15830 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70 42 74  >xFreeSchema(pBt
15840 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
15850 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
15860 72 65 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68  ree(0, pBt->pSch
15870 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
15880 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
15890 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
158a0 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
158b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
158c0 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
158d0 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
158e0 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
158f0 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
15900 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
15910 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
15920 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
15930 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
15940 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
15950 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
15960 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
15970 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
15980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15990 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
159a0 22 73 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20  "soft" limit on 
159b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
159c0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
159d0 2e 0a 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20  ..** Unused and 
159e0 75 6e 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73  unmodified pages
159f0 20 77 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65   will be recycle
15a00 64 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  d when the numbe
15a10 72 20 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e  r of.** pages in
15a20 20 74 68 65 20 63 61 63 68 65 20 65 78 63 65 65   the cache excee
15a30 64 73 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d  ds this soft lim
15a40 69 74 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a  it.  But the siz
15a50 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68  e of the.** cach
15a60 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  e is allowed to 
15a70 67 72 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e  grow larger than
15a80 20 74 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69   this limit if i
15a90 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69  t contains.** di
15aa0 72 74 79 20 70 61 67 65 73 20 6f 72 20 70 61 67  rty pages or pag
15ab0 65 73 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69  es still in acti
15ac0 76 65 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  ve use..*/.int s
15ad0 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
15ae0 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  cheSize(Btree *p
15af0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
15b00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15b10 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72   p->pBt;.  asser
15b20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
15b30 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
15b40 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
15b50 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15b60 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15b70 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70  Cachesize(pBt->p
15b80 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15b90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15ba0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15bc0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15bd0 22 73 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e  "spill" limit on
15be0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
15bf0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
15c00 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  e..** If the num
15c10 62 65 72 20 6f 66 20 70 61 67 65 73 20 65 78 63  ber of pages exc
15c20 65 65 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20  eeds this limit 
15c30 64 75 72 69 6e 67 20 61 20 77 72 69 74 65 20 74  during a write t
15c40 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74  ransaction,.** t
15c50 68 65 20 70 61 67 65 72 20 6d 69 67 68 74 20 61  he pager might a
15c60 74 74 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c  ttempt to "spill
15c70 22 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a  " pages to the j
15c80 6f 75 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a  ournal early in.
15c90 2a 2a 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65  ** order to free
15ca0 20 75 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a   up memory..**.*
15cb0 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
15cc0 72 6e 65 64 20 69 73 20 74 68 65 20 63 75 72 72  rned is the curr
15cd0 65 6e 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20  ent spill size. 
15ce0 20 49 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73   If zero is pass
15cf0 65 64 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75  ed.** as an argu
15d00 6d 65 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73  ment, no changes
15d10 20 61 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65   are made to the
15d20 20 73 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74   spill size sett
15d30 69 6e 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67  ing, so.** using
15d40 20 6d 78 50 61 67 65 20 6f 66 20 30 20 69 73 20   mxPage of 0 is 
15d50 61 20 77 61 79 20 74 6f 20 71 75 65 72 79 20 74  a way to query t
15d60 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
15d70 20 73 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   size..*/.int sq
15d80 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 70 69  lite3BtreeSetSpi
15d90 6c 6c 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c  llSize(Btree *p,
15da0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
15db0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15dc0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65  p->pBt;.  int re
15dd0 73 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  s;.  assert( sql
15de0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15df0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15e00 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15e10 6e 74 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d  nter(p);.  res =
15e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
15e30 53 70 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70  Spillsize(pBt->p
15e40 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a  Pager, mxPage);.
15e50 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
15e60 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
15e70 20 72 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c   res;.}..#if SQL
15e80 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
15e90 45 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  E>0./*.** Change
15ea0 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68   the limit on th
15eb0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
15ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
15ed0 61 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d  at may be.** mem
15ee0 6f 72 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69  ory mapped..*/.i
15ef0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15f00 65 74 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65  etMmapLimit(Btre
15f10 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  e *p, sqlite3_in
15f20 74 36 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42  t64 szMmap){.  B
15f30 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15f40 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
15f50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
15f60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
15f70 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15f80 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
15f90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d  qlite3PagerSetMm
15fa0 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61  apLimit(pBt->pPa
15fb0 67 65 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20  ger, szMmap);.  
15fc0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15fd0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15fe0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
15ff0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58  if /* SQLITE_MAX
16000 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
16010 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
16020 65 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79  e way data is sy
16030 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20  nced to disk in 
16040 6f 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73  order to increas
16050 65 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a  e or decrease.**
16060 20 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61   how well the da
16070 74 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64  tabase resists d
16080 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
16090 63 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65  crashes and powe
160a0 72 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20  r.** failures.  
160b0 4c 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73  Level 1 is the s
160c0 61 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e  ame as asynchron
160d0 6f 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20  ous (no syncs() 
160e0 6f 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65  occur and.** the
160f0 72 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f  re is a high pro
16100 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
16110 67 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20  ge)  Level 2 is 
16120 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68  the default.  Th
16130 65 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79  ere.** is a very
16140 20 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72   low but non-zer
16150 6f 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  o probability of
16160 20 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20   damage.  Level 
16170 33 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a  3 reduces the.**
16180 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
16190 64 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a  damage to near z
161a0 65 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77  ero but with a w
161b0 72 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rite performance
161c0 20 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23   reduction..*/.#
161d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
161e0 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
161f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16200 65 53 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a  eSetPagerFlags(.
16210 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
16220 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16230 62 74 72 65 65 20 74 6f 20 73 65 74 20 74 68 65  btree to set the
16240 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e   safety level on
16250 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70   */.  unsigned p
16260 67 46 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20  gFlags       /* 
16270 56 61 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20  Various PAGER_* 
16280 66 6c 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74  flags */.){.  Bt
16290 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
162a0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
162b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
162c0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
162d0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
162e0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
162f0 6c 69 74 65 33 50 61 67 65 72 53 65 74 46 6c 61  lite3PagerSetFla
16300 67 73 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  gs(pBt->pPager, 
16310 70 67 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69  pgFlags);.  sqli
16320 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
16330 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16340 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
16350 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
16360 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
16370 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
16380 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
16390 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
163a0 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70 61 67  * Or, if the pag
163b0 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72 65 61  e size has alrea
163c0 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c 20 72  dy been fixed, r
163d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
163e0 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68 6f 75  DONLY .** withou
163f0 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79 74 68  t changing anyth
16400 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ing..**.** The p
16410 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65  age size must be
16420 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65   a power of 2 be
16430 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
16440 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67  536.  If the pag
16450 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69  e.** size suppli
16460 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74  ed does not meet
16470 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74   this constraint
16480 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73   then the page s
16490 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68  ize is not.** ch
164a0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67  anged..**.** Pag
164b0 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73  e sizes are cons
164c0 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20  trained to be a 
164d0 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20  power of two so 
164e0 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a  that the region.
164f0 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ** of the databa
16500 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72  se file used for
16510 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e   locking (beginn
16520 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42  ing at PENDING_B
16530 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73  YTE,.** the firs
16540 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
16550 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78  1GB boundary, 0x
16560 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20  40000000) needs 
16570 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74  to occur.** at t
16580 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
16590 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  a page..**.** If
165a0 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65   parameter nRese
165b0 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  rve is less than
165c0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
165d0 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76  number of reserv
165e0 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20  ed.** bytes per 
165f0 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63  page is left unc
16600 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
16610 20 74 68 65 20 69 46 69 78 21 3d 30 20 74 68 65   the iFix!=0 the
16620 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45 53 49  n the BTS_PAGESI
16630 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20 69 73  ZE_FIXED flag is
16640 20 73 65 74 20 73 6f 20 74 68 61 74 20 74 68 65   set so that the
16650 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20 61 6e   page size.** an
16660 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d 6f 64  d autovacuum mod
16670 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
16680 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69  be changed..*/.i
16690 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
166a0 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
166b0 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
166c0 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 2c  e, int nReserve,
166d0 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20 69 6e   int iFix){.  in
166e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
166f0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
16700 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
16710 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
16720 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  -1 && nReserve<=
16730 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  255 );.  sqlite3
16740 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 23  BtreeEnter(p);.#
16750 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  if SQLITE_HAS_CO
16760 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73 65 72  DEC.  if( nReser
16770 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  ve>pBt->optimalR
16780 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e 6f 70  eserve ) pBt->op
16790 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d 20 28  timalReserve = (
167a0 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23 65 6e  u8)nReserve;.#en
167b0 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  dif.  if( pBt->b
167c0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
167d0 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29 7b 0a  GESIZE_FIXED ){.
167e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
167f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
16800 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
16810 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ONLY;.  }.  if( 
16820 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20  nReserve<0 ){.  
16830 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74    nReserve = pBt
16840 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
16850 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
16860 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 73  }.  assert( nRes
16870 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65  erve>=0 && nRese
16880 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66  rve<=255 );.  if
16890 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ( pageSize>=512 
168a0 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c  && pageSize<=SQL
168b0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
168c0 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28 70  E &&.        ((p
168d0 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53  ageSize-1)&pageS
168e0 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61  ize)==0 ){.    a
168f0 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65  ssert( (pageSize
16900 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 7)==0 );.    
16910 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
16920 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74  ursor );.    pBt
16930 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 33  ->pageSize = (u3
16940 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2)pageSize;.    
16950 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42  freeTempSpace(pB
16960 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  t);.  }.  rc = s
16970 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
16980 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
16990 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
169a0 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b 0a 20  ze, nReserve);. 
169b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
169c0 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
169d0 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72 76 65   - (u16)nReserve
169e0 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29 20 70  ;.  if( iFix ) p
169f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
16a00 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16a10 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ED;.  sqlite3Btr
16a20 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16a30 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16a40 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
16a50 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
16a60 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
16a70 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
16a80 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
16a90 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
16aa0 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
16ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
16ac0 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
16ad0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  to sqlite3BtreeG
16ae0 65 74 52 65 73 65 72 76 65 28 29 2c 20 65 78 63  etReserve(), exc
16af0 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 6d  ept that it.** m
16b00 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ay only be calle
16b10 64 20 69 66 20 69 74 20 69 73 20 67 75 61 72 61  d if it is guara
16b20 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 20 62  nteed that the b
16b30 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 61  -tree mutex is a
16b40 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64 2e 0a  lready.** held..
16b50 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 75 73  **.** This is us
16b60 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70 65 63  eful in one spec
16b70 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68 65 20  ial case in the 
16b80 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64 65 20  backup API code 
16b90 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a 20 6b  where it is.** k
16ba0 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20 73 68  nown that the sh
16bb0 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75 74 65  ared b-tree mute
16bc0 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74 20 74  x is held, but t
16bd0 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20  he mutex on the 
16be0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
16bf0 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70  dle that owns *p
16c00 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68 69 73   is not. In this
16c10 20 63 61 73 65 20 69 66 20 73 71 6c 69 74 65 33   case if sqlite3
16c20 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a 2a 20  BtreeEnter().** 
16c30 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c 6c 65  were to be calle
16c40 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f 6c 6c  d, it might coll
16c50 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20 6f 74  ide with some ot
16c60 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20 6f 6e  her operation on
16c70 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
16c80 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e   handle that own
16c90 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20 75 6e  s *p, causing un
16ca0 64 65 66 69 6e 65 64 20 62 65 68 61 76 69 6f 72  defined behavior
16cb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16cc0 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e  BtreeGetReserveN
16cd0 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a 70 29  oMutex(Btree *p)
16ce0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61 73 73  {.  int n;.  ass
16cf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16d00 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e  ex_held(p->pBt->
16d10 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20 3d 20  mutex) );.  n = 
16d20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
16d30 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
16d40 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  eSize;.  return 
16d50 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
16d60 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
16d70 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
16d80 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
16d90 65 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a  ery page that.**
16da0 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79   are intentually
16db0 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54   left unused.  T
16dc0 68 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65  his is the "rese
16dd0 72 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74  rved" space that
16de0 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73   is.** sometimes
16df0 20 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69   used by extensi
16e00 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ons..**.** If SQ
16e10 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58 20 69  LITE_HAS_MUTEX i
16e20 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20 74  s defined then t
16e30 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75 72 6e  he number return
16e40 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67 72 65  ed is the.** gre
16e50 61 74 65 72 20 6f 66 20 74 68 65 20 63 75 72 72  ater of the curr
16e60 65 6e 74 20 72 65 73 65 72 76 65 64 20 73 70 61  ent reserved spa
16e70 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78 69 6d  ce and the maxim
16e80 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a 2a 20  um requested.** 
16e90 72 65 73 65 72 76 65 20 73 70 61 63 65 2e 0a 2a  reserve space..*
16ea0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16eb0 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65 73 65  eeGetOptimalRese
16ec0 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  rve(Btree *p){. 
16ed0 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
16ee0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
16ef0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42 74 72    n = sqlite3Btr
16f00 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75  eeGetReserveNoMu
16f10 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66 20 53  tex(p);.#ifdef S
16f20 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
16f30 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74 2d 3e    if( n<p->pBt->
16f40 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29  optimalReserve )
16f50 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f 70 74   n = p->pBt->opt
16f60 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23 65 6e  imalReserve;.#en
16f70 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42 74 72  dif.  sqlite3Btr
16f80 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
16f90 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  turn n;.}.../*.*
16fa0 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75  * Set the maximu
16fb0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72  m page count for
16fc0 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d   a database if m
16fd0 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76  xPage is positiv
16fe0 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73  e..** No changes
16ff0 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50   are made if mxP
17000 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61  age is 0 or nega
17010 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c  tive..** Regardl
17020 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
17030 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
17040 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70  rn the maximum p
17050 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e  age count..*/.in
17060 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61  t sqlite3BtreeMa
17070 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65  xPageCount(Btree
17080 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29   *p, int mxPage)
17090 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c  {.  int n;.  sql
170a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
170b0 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33  );.  n = sqlite3
170c0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
170d0 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  t(p->pBt->pPager
170e0 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c  , mxPage);.  sql
170f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17100 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
17110 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
17120 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17130 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46 6c 61  E flag if newFla
17140 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20 49 66  g is 0 or 1.  If
17150 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31 2c 0a   newFlag is -1,.
17160 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e 6f 20  ** then make no 
17170 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61 79 73  changes.  Always
17180 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   return the valu
17190 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53 45 43  e of the BTS_SEC
171a0 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20 73 65  URE_DELETE.** se
171b0 74 74 69 6e 67 20 61 66 74 65 72 20 74 68 65 20  tting after the 
171c0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  change..*/.int s
171d0 71 6c 69 74 65 33 42 74 72 65 65 53 65 63 75 72  qlite3BtreeSecur
171e0 65 44 65 6c 65 74 65 28 42 74 72 65 65 20 2a 70  eDelete(Btree *p
171f0 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29 7b 0a  , int newFlag){.
17200 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28 20 70    int b;.  if( p
17210 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17220 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17230 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 6e 65  ter(p);.  if( ne
17240 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20 20 20  wFlag>=0 ){.    
17250 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  p->pBt->btsFlags
17260 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52 45 5f   &= ~BTS_SECURE_
17270 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66 28 20  DELETE;.    if( 
17280 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70 42 74  newFlag ) p->pBt
17290 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
172a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
172b0 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70 2d 3e  .  } .  b = (p->
172c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
172d0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
172e0 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74 65 33  E)!=0;.  sqlite3
172f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17300 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a   return b;.}../*
17310 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 27  .** Change the '
17320 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
17330 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61 74  perty of the dat
17340 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27 61  abase. If the 'a
17350 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70 61  utoVacuum'.** pa
17360 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a  rameter is non-z
17370 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d 76  ero, then auto-v
17380 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65 6e  acuum mode is en
17390 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c 20  abled. If zero, 
173a0 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c 65  it.** is disable
173b0 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 76  d. The default v
173c0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75 74  alue for the aut
173d0 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72 74  o-vacuum propert
173e0 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d 69  y is .** determi
173f0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ned by the SQLIT
17400 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
17410 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69  CUUM macro..*/.i
17420 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
17430 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72  etAutoVacuum(Btr
17440 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f 56  ee *p, int autoV
17450 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20 53  acuum){.#ifdef S
17460 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
17470 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 53  ACUUM.  return S
17480 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
17490 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65 64  #else.  BtShared
174a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
174b0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
174c0 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20 3d 20  E_OK;.  u8 av = 
174d0 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d 3b 0a  (u8)autoVacuum;.
174e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
174f0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 28  nter(p);.  if( (
17500 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
17510 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
17520 45 44 29 21 3d 30 20 26 26 20 28 61 76 20 3f 31  ED)!=0 && (av ?1
17530 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61  :0)!=pBt->autoVa
17540 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
17550 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
17570 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d  Bt->autoVacuum =
17580 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20 70 42   av ?1:0;.    pB
17590 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
175a0 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20 7d 0a  av==2 ?1:0;.  }.
175b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
175c0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
175d0 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
175e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
175f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61 75  value of the 'au
17600 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65  to-vacuum' prope
17610 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61 63  rty. If auto-vac
17620 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62 6c  uum is .** enabl
17630 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65 64  ed 1 is returned
17640 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a 2a  . Otherwise 0..*
17650 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17660 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d 28  eeGetAutoVacuum(
17670 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64 65  Btree *p){.#ifde
17680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
17690 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72  TOVACUUM.  retur
176a0 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55  n BTREE_AUTOVACU
176b0 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20  UM_NONE;.#else. 
176c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
176d0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
176e0 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28 21  .  rc = (.    (!
176f0 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  p->pBt->autoVacu
17700 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56 41  um)?BTREE_AUTOVA
17710 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28  CUUM_NONE:.    (
17720 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61 63  !p->pBt->incrVac
17730 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
17740 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20  ACUUM_FULL:.    
17750 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
17760 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71 6c  _INCR.  );.  sql
17770 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17780 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17790 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
177a0 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63 65   Get a reference
177b0 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74 68   to pPage1 of th
177c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
177d0 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20 61    This will.** a
177e0 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72 65  lso acquire a re
177f0 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 66  adlock on that f
17800 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ile..**.** SQLIT
17810 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
17820 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66   on success.  If
17830 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
17840 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65   a.** well-forme
17850 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  d database file,
17860 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f 52   then SQLITE_COR
17870 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65 64  RUPT is returned
17880 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59  ..** SQLITE_BUSY
17890 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
178a0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
178b0 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45 5f  locked.  SQLITE_
178c0 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74 75  NOMEM.** is retu
178d0 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20 6f  rned if we run o
178e0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a  ut of memory. .*
178f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
17900 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64 20  kBtree(BtShared 
17910 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b  *pBt){.  int rc;
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17930 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f   Result code fro
17940 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73 20 2a  m subfunctions *
17950 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
17960 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ge1;     /* Page
17970 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61   1 of the databa
17980 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
17990 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
179a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
179b0 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
179c0 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  base */.  int nP
179d0 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20 20 2f  ageFile = 0;   /
179e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
179f0 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
17a00 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
17a10 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20 20 20  nPageHeader;    
17a20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17a30 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17a40 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ase according to
17a50 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72   hdr */..  asser
17a60 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
17a70 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
17a80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
17a90 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 3b  Bt->pPage1==0 );
17aa0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
17ab0 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70  agerSharedLock(p
17ac0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
17ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ae0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
17af0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
17b00 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
17b10 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
17b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17b30 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
17b40 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
17b50 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
17b60 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
17b70 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
17b80 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
17b90 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 6e   file. .  */.  n
17ba0 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65 61 64  Page = nPageHead
17bb0 65 72 20 3d 20 67 65 74 34 62 79 74 65 28 32 38  er = get4byte(28
17bc0 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44  +(u8*)pPage1->aD
17bd0 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  ata);.  sqlite3P
17be0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
17bf0 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
17c00 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 6e 50  eFile);.  if( nP
17c10 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70  age==0 || memcmp
17c20 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65 31 2d  (24+(u8*)pPage1-
17c30 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38 2a 29  >aData, 92+(u8*)
17c40 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 34 29  pPage1->aData,4)
17c50 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  !=0 ){.    nPage
17c60 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a 20 20   = nPageFile;.  
17c70 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 30 20  }.  if( nPage>0 
17c80 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67 65 53  ){.    u32 pageS
17c90 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75 73 61  ize;.    u32 usa
17ca0 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
17cb0 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
17cc0 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
17cd0 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
17ce0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
17cf0 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39 39 39  OF: R-43737-3999
17d00 39 20 45 76 65 72 79 20 76 61 6c 69 64 20 53 51  9 Every valid SQ
17d10 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 66 69  Lite database fi
17d20 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20 2a 2a  le begins.    **
17d30 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
17d40 69 6e 67 20 31 36 20 62 79 74 65 73 20 28 69 6e  ing 16 bytes (in
17d50 20 68 65 78 29 3a 20 35 33 20 35 31 20 34 63 20   hex): 53 51 4c 
17d60 36 39 20 37 34 20 36 35 20 32 30 20 36 36 20 36  69 74 65 20 66 6
17d70 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a 20 36  f 72 6d.    ** 6
17d80 31 20 37 34 20 32 30 20 33 33 20 30 30 2e 20 2a  1 74 20 33 00. *
17d90 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
17da0 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65  (page1, zMagicHe
17db0 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a  ader, 16)!=0 ){.
17dc0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17dd0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17de0 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
17df0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
17e00 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
17e10 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74  ){.      pBt->bt
17e20 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45  sFlags |= BTS_RE
17e30 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  AD_ONLY;.    }. 
17e40 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
17e50 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
17e60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
17e70 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ed;.    }.#else.
17e80 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 38      if( page1[18
17e90 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ]>2 ){.      pBt
17ea0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
17eb0 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20  S_READ_ONLY;.   
17ec0 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
17ed0 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20  [19]>2 ){.      
17ee0 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17ef0 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
17f00 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77 72 69     /* If the wri
17f10 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20 73 65  te version is se
17f20 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64 61 74  t to 2, this dat
17f30 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62 65 20  abase should be 
17f40 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a 2a 20  accessed.    ** 
17f50 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49 66 20  in WAL mode. If 
17f60 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74 20 61  the log is not a
17f70 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f 70 65  lready open, ope
17f80 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e 20 0a  n it now. Then .
17f90 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51      ** return SQ
17fa0 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 74 75  LITE_OK and retu
17fb0 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70 75 6c  rn without popul
17fc0 61 74 69 6e 67 20 42 74 53 68 61 72 65 64 2e 70  ating BtShared.p
17fd0 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20 54 68  Page1..    ** Th
17fe0 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63 74 73  e caller detects
17ff0 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c 73 20   this and calls 
18000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 67  this function ag
18010 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20 20 20  ain. This is.   
18020 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61 73 20   ** required as 
18030 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 70  the version of p
18040 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c 79 20  age 1 currently 
18050 69 6e 20 74 68 65 20 70 61 67 65 31 20 62 75 66  in the page1 buf
18060 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  fer.    ** may n
18070 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65 73 74  ot be the latest
18080 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65 72 65   version - there
18090 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65 72 20   may be a newer 
180a0 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67 0a 20  one in the log. 
180b0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
180c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  */.    if( page1
180d0 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42 74 2d  [19]==2 && (pBt-
180e0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
180f0 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a 20 20  NO_WAL)==0 ){.  
18100 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e 20 3d      int isOpen =
18110 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
18120 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 57  qlite3PagerOpenW
18130 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  al(pBt->pPager, 
18140 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20  &isOpen);.      
18150 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18160 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
18170 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18180 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  led;.      }else
18190 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  {.#if SQLITE_DEF
181a0 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  AULT_SYNCHRONOUS
181b0 21 3d 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  !=SQLITE_DEFAULT
181c0 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55 53  _WAL_SYNCHRONOUS
181d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
181e0 20 2a 64 62 3b 0a 20 20 20 20 20 20 20 20 44 62   *db;.        Db
181f0 20 2a 70 44 62 3b 0a 20 20 20 20 20 20 20 20 69   *pDb;.        i
18200 66 28 20 28 64 62 3d 70 42 74 2d 3e 64 62 29 21  f( (db=pBt->db)!
18210 3d 30 20 26 26 20 28 70 44 62 3d 64 62 2d 3e 61  =0 && (pDb=db->a
18220 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
18230 20 20 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e      while( pDb->
18240 70 42 74 3d 3d 30 20 7c 7c 20 70 44 62 2d 3e 70  pBt==0 || pDb->p
18250 42 74 2d 3e 70 42 74 21 3d 70 42 74 20 29 7b 20  Bt->pBt!=pBt ){ 
18260 70 44 62 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  pDb++; }.       
18270 20 20 20 69 66 28 20 70 44 62 2d 3e 62 53 79 6e     if( pDb->bSyn
18280 63 53 65 74 3d 3d 30 0a 20 20 20 20 20 20 20 20  cSet==0.        
18290 20 20 20 26 26 20 70 44 62 2d 3e 73 61 66 65 74     && pDb->safet
182a0 79 5f 6c 65 76 65 6c 3d 3d 53 51 4c 49 54 45 5f  y_level==SQLITE_
182b0 44 45 46 41 55 4c 54 5f 53 59 4e 43 48 52 4f 4e  DEFAULT_SYNCHRON
182c0 4f 55 53 2b 31 0a 20 20 20 20 20 20 20 20 20 20  OUS+1.          
182d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
182e0 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c  Db->safety_level
182f0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
18300 54 5f 57 41 4c 5f 53 59 4e 43 48 52 4f 4e 4f 55  T_WAL_SYNCHRONOU
18310 53 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  S+1;.           
18320 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
18330 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61 67 65  Flags(pBt->pPage
18340 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
18350 20 20 70 44 62 2d 3e 73 61 66 65 74 79 5f 6c 65    pDb->safety_le
18360 76 65 6c 20 7c 20 28 64 62 2d 3e 66 6c 61 67 73  vel | (db->flags
18370 20 26 20 50 41 47 45 52 5f 46 4c 41 47 53 5f 4d   & PAGER_FLAGS_M
18380 41 53 4b 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ASK));.         
18390 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
183a0 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
183b0 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20  isOpen==0 ){.   
183c0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
183d0 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
183e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
183f0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
18400 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
18410 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41  rc = SQLITE_NOTA
18420 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  DB;.    }.#endif
18430 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ..    /* EVIDENC
18440 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32 30  E-OF: R-15465-20
18450 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  813 The maximum 
18460 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62 65  and minimum embe
18470 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20 20  dded payload.   
18480 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61 6e   ** fractions an
18490 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c 6f  d the leaf paylo
184a0 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c 75  ad fraction valu
184b0 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20 33  es must be 64, 3
184c0 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20 2a  2, and 32..    *
184d0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69  *.    ** The ori
184e0 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c  ginal design all
184f0 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e  owed these amoun
18500 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20  ts to vary, but 
18510 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72  as of.    ** ver
18520 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72  sion 3.6.0, we r
18530 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62  equire them to b
18540 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a  e fixed..    */.
18550 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26      if( memcmp(&
18560 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30  page1[21], "\100
18570 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20  \040\040",3)!=0 
18580 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
18590 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
185a0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56  .    }.    /* EV
185b0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38  IDENCE-OF: R-518
185c0 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67  73-39618 The pag
185d0 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74  e size for a dat
185e0 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20  abase file is.  
185f0 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
18600 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e  by the 2-byte in
18610 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74  teger located at
18620 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36   an offset of 16
18630 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20   bytes from.    
18640 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  ** the beginning
18650 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
18660 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 61   file. */.    pa
18670 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31 5b  geSize = (page1[
18680 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65 31  16]<<8) | (page1
18690 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 2f  [17]<<16);.    /
186a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
186b0 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68 65  -25008-21688 The
186c0 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20   size of a page 
186d0 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  is a power of tw
186e0 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65 6e  o.    ** between
186f0 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20 69   512 and 65536 i
18700 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20 20  nclusive. */.   
18710 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
18720 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 0a  1)&pageSize)!=0.
18730 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
18740 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
18750 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20 70  _SIZE .     || p
18760 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20 20  ageSize<=256 .  
18770 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
18780 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18790 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  d;.    }.    ass
187a0 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
187b0 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f 2a   7)==0 );.    /*
187c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
187d0 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65 20  59310-51205 The 
187e0 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65 22  "reserved space"
187f0 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d 62   size in the 1-b
18800 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67  yte.    ** integ
18810 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30 20  er at offset 20 
18820 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
18830 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
18840 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20 20  at the end of.  
18850 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20 74    ** each page t
18860 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65 78  o reserve for ex
18870 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20 2a  tensions. .    *
18880 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  *.    ** EVIDENC
18890 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
188a0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
188b0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
188c0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ion is.    ** de
188d0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
188e0 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
188f0 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
18900 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
18910 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  20.    ** into t
18920 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18930 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20   header. */.    
18940 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61 67  usableSize = pag
18950 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32 30  eSize - page1[20
18960 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32 29  ];.    if( (u32)
18970 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70  pageSize!=pBt->p
18980 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ageSize ){.     
18990 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69 6e   /* After readin
189a0 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
189b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
189c0 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67 65   assuming a page
189d0 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f   size.      ** o
189e0 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65 53  f BtShared.pageS
189f0 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69 73  ize, we have dis
18a00 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68 65  covered that the
18a10 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20 20   page-size is.  
18a20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20      ** actually 
18a30 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b  pageSize. Unlock
18a40 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6c   the database, l
18a50 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65 31  eave pBt->pPage1
18a60 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72   at.      ** zer
18a70 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  o and return SQL
18a80 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c  ITE_OK. The call
18a90 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69  er will call thi
18aa0 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  s function.     
18ab0 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20 74   ** again with t
18ac0 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65 2d  he correct page-
18ad0 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  size..      */. 
18ae0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
18af0 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20  (pPage1);.      
18b00 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
18b10 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  = usableSize;.  
18b20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
18b30 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
18b40 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61 63      freeTempSpac
18b50 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63  e(pBt);.      rc
18b60 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
18b70 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
18b80 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
18b90 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20  geSize,.        
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18bb0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 53             pageS
18bc0 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29 3b  ize-usableSize);
18bd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18bf0 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  (pBt->db->flags 
18c00 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65 72  & SQLITE_Recover
18c10 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50 61  yMode)==0 && nPa
18c20 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b 0a  ge>nPageFile ){.
18c30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
18c40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18c50 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
18c60 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
18c70 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
18c80 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32 2d  NCE-OF: R-28312-
18c90 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20 74  64704 However, t
18ca0 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20 69  he usable size i
18cb0 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  s not allowed to
18cc0 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73 20  .    ** be less 
18cd0 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74 68  than 480. In oth
18ce0 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
18cf0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35 31   page size is 51
18d00 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  2, then the.    
18d10 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61 63  ** reserved spac
18d20 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65 78  e size cannot ex
18d30 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20 20  ceed 32. */.    
18d40 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 34  if( usableSize<4
18d50 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  80 ){.      goto
18d60 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
18d70 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  ed;.    }.    pB
18d80 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
18d90 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d  geSize;.    pBt-
18da0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73  >usableSize = us
18db0 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65  ableSize;.#ifnde
18dc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18dd0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
18de0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
18df0 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
18e00 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 4*4])?1:0);
18e10 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
18e20 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
18e30 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34  (&page1[36 + 7*4
18e40 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a  ])?1:0);.#endif.
18e50 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63    }..  /* maxLoc
18e60 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  al is the maximu
18e70 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
18e80 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63  oad to store loc
18e90 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20  ally for.  ** a 
18ea0 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65  cell.  Make sure
18eb0 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f   it is small eno
18ec0 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c  ugh so that at l
18ed0 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20  east minFanout. 
18ee0 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69   ** cells can wi
18ef0 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61  ll fit on one pa
18f00 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61  ge.  We assume a
18f10 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65   10-byte page he
18f20 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64  ader..  ** Besid
18f30 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20  es the payload, 
18f40 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74  the cell must st
18f50 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d  ore:.  **     2-
18f60 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20  byte pointer to 
18f70 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20  the cell.  **   
18f80 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70    4-byte child p
18f90 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20  ointer.  **     
18fa0 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75  9-byte nKey valu
18fb0 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  e.  **     4-byt
18fc0 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20  e nData value.  
18fd0 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76  **     4-byte ov
18fe0 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e  erflow page poin
18ff0 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65  ter.  ** So a ce
19000 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ll consists of a
19010 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 2c   2-byte pointer,
19020 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
19030 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
19040 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
19050 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
19060 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
19070 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
19080 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
19090 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
190a0 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
190b0 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
190c0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
190d0 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  64/255 - 23);.  
190e0 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
190f0 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62  (u16)((pBt->usab
19100 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
19110 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e  5 - 23);.  pBt->
19120 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29 28  maxLeaf = (u16)(
19130 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
19140 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 35);.  pBt->mi
19150 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28 70  nLeaf = (u16)((p
19160 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31  Bt->usableSize-1
19170 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b  2)*32/255 - 23);
19180 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78 4c  .  if( pBt->maxL
19190 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20 20  ocal>127 ){.    
191a0 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
191b0 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d 65  load = 127;.  }e
191c0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  lse{.    pBt->ma
191d0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
191e0 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  (u8)pBt->maxLoca
191f0 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  l;.  }.  assert(
19200 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20   pBt->maxLeaf + 
19210 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49  23 <= MX_CELL_SI
19220 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74  ZE(pBt) );.  pBt
19230 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67 65  ->pPage1 = pPage
19240 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20  1;.  pBt->nPage 
19250 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75 72  = nPage;.  retur
19260 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61  n SQLITE_OK;..pa
19270 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a  ge1_init_failed:
19280 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
19290 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70  Page1);.  pBt->p
192a0 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74  Page1 = 0;.  ret
192b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
192c0 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ef NDEBUG./*.** 
192d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
192e0 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70 65  r of cursors ope
192f0 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20 69  n on pBt. This i
19300 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20  s for use.** in 
19310 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73  assert() express
19320 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f  ions, so it is o
19330 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20  nly compiled if 
19340 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a  NDEBUG is not.**
19350 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20   defined..**.** 
19360 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
19370 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20 69  rs are counted i
19380 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75 65  f wrOnly is true
19390 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73 0a  .  If wrOnly is.
193a0 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61 6c  ** false then al
193b0 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  l cursors are co
193c0 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  unted..**.** For
193d0 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
193e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61   this routine, a
193f0 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63   cursor is any c
19400 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
19410 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61 64   capable of read
19420 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74  ing or writing t
19430 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
19440 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a 2a   Cursors that.**
19450 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70 70   have been tripp
19460 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52 53  ed into the CURS
19470 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20 61  OR_FAULT state a
19480 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e 0a  re not counted..
19490 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
194a0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
194b0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 69  BtShared *pBt, i
194c0 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42 74  nt wrOnly){.  Bt
194d0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
194e0 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72  int r = 0;.  for
194f0 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73  (pCur=pBt->pCurs
19500 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70  or; pCur; pCur=p
19510 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Cur->pNext){.   
19520 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30 20   if( (wrOnly==0 
19530 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  || (pCur->curFla
19540 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46  gs & BTCF_WriteF
19550 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26 26  lag)!=0).     &&
19560 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
19570 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
19580 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
19590 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
195a0 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
195b0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
195c0 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
195d0 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
195e0 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
195f0 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
19600 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
19610 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19620 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
19630 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
19640 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
19650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19660 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
19670 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
19680 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
19690 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
196a0 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61 6e   there is a tran
196b0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
196c0 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ess, this routin
196d0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
196e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c  .static void unl
196f0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
19700 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
19710 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19720 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
19730 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
19740 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
19750 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29 3d  dCursors(pBt,0)=
19760 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  =0 || pBt->inTra
19770 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f 4e  nsaction>TRANS_N
19780 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42 74  ONE );.  if( pBt
19790 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
197a0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70  =TRANS_NONE && p
197b0 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b  Bt->pPage1!=0 ){
197c0 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
197d0 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
197e0 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e1;.    assert( 
197f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b  pPage1->aData );
19800 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
19810 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
19820 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d  t(pBt->pPager)==
19830 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  1 );.    pBt->pP
19840 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72 65  age1 = 0;.    re
19850 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
19860 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d 0a  (pPage1);.  }.}.
19870 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70 6f  ./*.** If pBt po
19880 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74 79  ints to an empty
19890 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76 65   file then conve
198a0 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66 69  rt that empty fi
198b0 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65 77  le.** into a new
198c0 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65 20   empty database 
198d0 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  by initializing 
198e0 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
198f0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
19900 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
19910 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53   newDatabase(BtS
19920 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d  hared *pBt){.  M
19930 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75  emPage *pP1;.  u
19940 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
19950 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ta;.  int rc;.. 
19960 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
19970 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
19980 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
19990 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 7b   pBt->nPage>0 ){
199a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
199b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 31  TE_OK;.  }.  pP1
199c0 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
199d0 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d 30    assert( pP1!=0
199e0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 31   );.  data = pP1
199f0 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d 20  ->aData;.  rc = 
19a00 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
19a10 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29 3b  e(pP1->pDbPage);
19a20 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
19a30 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79 28  rn rc;.  memcpy(
19a40 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61 64  data, zMagicHead
19a50 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67 69  er, sizeof(zMagi
19a60 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73 73  cHeader));.  ass
19a70 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61 67  ert( sizeof(zMag
19a80 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29 3b  icHeader)==16 );
19a90 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28 75  .  data[16] = (u
19aa0 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  8)((pBt->pageSiz
19ab0 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20 64  e>>8)&0xff);.  d
19ac0 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28 28  ata[17] = (u8)((
19ad0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 31  pBt->pageSize>>1
19ae0 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74 61  6)&0xff);.  data
19af0 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
19b00 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73 65  [19] = 1;.  asse
19b10 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  rt( pBt->usableS
19b20 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ize<=pBt->pageSi
19b30 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62 6c  ze && pBt->usabl
19b40 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d 3e  eSize+255>=pBt->
19b50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
19b60 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42 74  a[20] = (u8)(pBt
19b70 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74  ->pageSize - pBt
19b80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
19b90 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
19ba0 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
19bb0 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
19bc0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
19bd0 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
19be0 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
19bf0 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
19c00 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
19c10 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74 73  TA );.  pBt->bts
19c20 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47  Flags |= BTS_PAG
19c30 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66  ESIZE_FIXED;.#if
19c40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19c50 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
19c60 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
19c70 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
19c80 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
19c90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
19ca0 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
19cb0 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
19cc0 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
19cd0 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
19ce0 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
19cf0 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
19d00 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
19d10 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
19d20 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42 74  m);.#endif.  pBt
19d30 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 64  ->nPage = 1;.  d
19d40 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20 72  ata[31] = 1;.  r
19d50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
19d70 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20 70  lize the first p
19d80 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
19d90 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74 69  ase file (creati
19da0 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  ng a database.**
19db0 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61   consisting of a
19dc0 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e 64   single page and
19dd0 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65 63   no schema objec
19de0 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ts). Return SQLI
19df0 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63 63  TE_OK.** if succ
19e00 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51  essful, or an SQ
19e10 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
19e20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 6e  otherwise..*/.in
19e30 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
19e40 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  wDb(Btree *p){. 
19e50 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
19e60 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
19e70 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67 65  .  p->pBt->nPage
19e80 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65 77   = 0;.  rc = new
19e90 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74 29  Database(p->pBt)
19ea0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19eb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
19ec0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19ed0 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
19ee0 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
19ef0 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
19f00 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
19f10 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
19f20 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
19f30 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
19f40 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
19f50 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
19f60 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
19f70 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
19f80 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
19f90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
19fa0 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
19fb0 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
19fc0 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
19fd0 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
19fe0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
19ff0 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
1a000 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
1a010 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
1a020 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
1a030 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
1a040 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
1a050 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
1a060 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
1a070 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
1a080 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
1a090 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
1a0a0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
1a0b0 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
1a0c0 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
1a0d0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
1a0e0 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
1a0f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1a100 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
1a110 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
1a120 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1a130 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
1a140 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
1a150 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
1a160 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
1a170 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
1a180 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
1a190 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
1a1a0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a1b0 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
1a1c0 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
1a1d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
1a1e0 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
1a1f0 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
1a200 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
1a210 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
1a220 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
1a230 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
1a240 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
1a250 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
1a260 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
1a270 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
1a280 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
1a290 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
1a2a0 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
1a2b0 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
1a2c0 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
1a2d0 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
1a2e0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
1a2f0 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
1a300 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
1a310 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
1a320 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
1a330 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
1a340 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
1a350 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
1a360 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
1a370 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
1a380 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
1a390 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
1a3a0 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
1a3b0 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
1a3c0 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
1a3d0 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
1a3e0 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
1a3f0 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
1a400 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
1a410 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
1a420 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
1a430 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
1a440 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
1a450 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
1a460 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
1a470 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
1a480 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
1a490 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
1a4a0 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
1a4b0 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
1a4c0 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
1a4d0 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
1a4e0 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
1a4f0 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
1a500 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
1a510 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
1a520 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
1a530 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
1a540 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
1a550 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
1a560 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
1a570 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
1a580 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
1a590 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  g){.  BtShared *
1a5a0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
1a5b0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a5c0 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  OK;..  sqlite3Bt
1a5d0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 62  reeEnter(p);.  b
1a5e0 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
1a5f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62  ;..  /* If the b
1a600 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
1a610 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  in a write-trans
1a620 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20  action, or it.  
1a630 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ** is already in
1a640 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1a650 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74  ion and a read-t
1a660 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20  ransaction.  ** 
1a670 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
1a680 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  is is a no-op.. 
1a690 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
1a6a0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
1a6b0 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73  E || (p->inTrans
1a6c0 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20  ==TRANS_READ && 
1a6d0 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20  !wrflag) ){.    
1a6e0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a6f0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1a700 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a710 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
1a720 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  || IfNotOmitAV(p
1a730 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 29  Bt->bDoTruncate)
1a740 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69  ==0 );..  /* Wri
1a750 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te transactions 
1a760 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  are not possible
1a770 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   on a read-only 
1a780 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 66  database */.  if
1a790 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  ( (pBt->btsFlags
1a7a0 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59   & BTS_READ_ONLY
1a7b0 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20 29  )!=0 && wrflag )
1a7c0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a7d0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
1a7e0 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
1a7f0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
1a800 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1a810 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20 20  D_CACHE.  {.    
1a820 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b 20  sqlite3 *pBlock 
1a830 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20 61  = 0;.    /* If a
1a840 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20  nother database 
1a850 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65 61  handle has alrea
1a860 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69 74  dy opened a writ
1a870 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20  e transaction . 
1a880 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68     ** on this sh
1a890 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
1a8a0 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
1a8b0 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
1a8c0 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  ion is.    ** re
1a8d0 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20  quested, return 
1a8e0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 20  SQLITE_LOCKED.. 
1a8f0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1a900 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e  rflag && pBt->in
1a910 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a920 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20 7c  NS_WRITE).     |
1a930 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  | (pBt->btsFlags
1a940 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29 21   & BTS_PENDING)!
1a950 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
1a960 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
1a970 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20 7d  riter->db;.    }
1a980 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
1a990 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f 63  1 ){.      BtLoc
1a9a0 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20 20  k *pIter;.      
1a9b0 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70  for(pIter=pBt->p
1a9c0 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74  Lock; pIter; pIt
1a9d0 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29  er=pIter->pNext)
1a9e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1a9f0 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29  ter->pBtree!=p )
1aa00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c 6f  {.          pBlo
1aa10 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74 72  ck = pIter->pBtr
1aa20 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  ee->db;.        
1aa30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
1aa40 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1aa50 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b 20  .    if( pBlock 
1aa60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1aa70 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
1aa80 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b 29  d(p->db, pBlock)
1aa90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1aaa0 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
1aab0 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67 6f  DCACHE;.      go
1aac0 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
1aad0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1aae0 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d  ..  /* Any read-
1aaf0 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69  only or read-wri
1ab00 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1ab10 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f  mplies a read-lo
1ab20 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65  ck on .  ** page
1ab30 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f   1. So if some o
1ab40 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68  ther shared-cach
1ab50 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79  e client already
1ab60 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63   has a write-loc
1ab70 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20  k .  ** on page 
1ab80 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  1, the transacti
1ab90 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  on cannot be ope
1aba0 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71  ned. */.  rc = q
1abb0 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
1abc0 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
1abd0 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
1abe0 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  CK);.  if( SQLIT
1abf0 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20  E_OK!=rc ) goto 
1ac00 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20  trans_begun;..  
1ac10 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1ac20 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f   ~BTS_INITIALLY_
1ac30 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74  EMPTY;.  if( pBt
1ac40 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74  ->nPage==0 ) pBt
1ac50 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
1ac60 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54  S_INITIALLY_EMPT
1ac70 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a  Y;.  do {.    /*
1ac80 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28   Call lockBtree(
1ac90 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70  ) until either p
1aca0 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f  Bt->pPage1 is po
1acb0 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a  pulated or.    *
1acc0 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65  * lockBtree() re
1acd0 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20  turns something 
1ace0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
1acf0 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28  E_OK. lockBtree(
1ad00 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74  ).    ** may ret
1ad10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  urn SQLITE_OK bu
1ad20 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61  t leave pBt->pPa
1ad30 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20  ge1 set to 0 if 
1ad40 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61  after.    ** rea
1ad50 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64  ding page 1 it d
1ad60 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68  iscovers that th
1ad70 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74  e page-size of t
1ad80 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20  he database .   
1ad90 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20   ** file is not 
1ada0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49  pBt->pageSize. I
1adb0 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b  n this case lock
1adc0 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64  Btree() will upd
1add0 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e  ate.    ** pBt->
1ade0 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20  pageSize to the 
1adf0 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65  page-size of the
1ae00 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
1ae10 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28     */.    while(
1ae20 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
1ae30 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72  && SQLITE_OK==(r
1ae40 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
1ae50 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  t)) );..    if( 
1ae60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ae70 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1ae80 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c   if( (pBt->btsFl
1ae90 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
1aea0 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  NLY)!=0 ){.     
1aeb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
1aec0 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
1aed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
1aee0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1aef0 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72  egin(pBt->pPager
1af00 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65  ,wrflag>1,sqlite
1af10 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d  3TempInMemory(p-
1af20 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69  >db));.        i
1af30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1af40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1af50 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
1af60 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  Bt);.        }. 
1af70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
1af80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1af90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75  TE_OK ){.      u
1afa0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1afb0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
1afc0 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46   }while( (rc&0xF
1afd0 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  F)==SQLITE_BUSY 
1afe0 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
1aff0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  ction==TRANS_NON
1b000 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62  E &&.          b
1b010 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
1b020 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20  ndler(pBt) );.. 
1b030 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b040 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
1b050 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1b060 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
1b070 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
1b080 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  +;.#ifndef SQLIT
1b090 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1b0a0 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d  CHE.      if( p-
1b0b0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
1b0c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
1b0d0 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26  lock.pBtree==p &
1b0e0 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65  & p->lock.iTable
1b0f0 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==1 );.        p
1b100 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52  ->lock.eLock = R
1b110 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  EAD_LOCK;.      
1b120 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20    p->lock.pNext 
1b130 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20  = pBt->pLock;.  
1b140 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b        pBt->pLock
1b150 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20   = &p->lock;.   
1b160 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1b170 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73  }.    p->inTrans
1b180 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53   = (wrflag?TRANS
1b190 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41  _WRITE:TRANS_REA
1b1a0 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  D);.    if( p->i
1b1b0 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72  nTrans>pBt->inTr
1b1c0 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1b1d0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
1b1e0 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61  ction = p->inTra
1b1f0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ns;.    }.    if
1b200 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrflag ){.    
1b210 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b220 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1b230 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b240 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1b250 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  E.      assert( 
1b260 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b  !pBt->pWriter );
1b270 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69  .      pBt->pWri
1b280 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70  ter = p;.      p
1b290 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1b2a0 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a  ~BTS_EXCLUSIVE;.
1b2b0 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67        if( wrflag
1b2c0 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61  >1 ) pBt->btsFla
1b2d0 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53  gs |= BTS_EXCLUS
1b2e0 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  IVE;.#endif..   
1b2f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d     /* If the db-
1b300 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c  size header fiel
1b310 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28  d is incorrect (
1b320 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20  as it may be if 
1b330 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20  an old.      ** 
1b340 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20  client has been 
1b350 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
1b360 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61  base file), upda
1b370 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67  te it now. Doing
1b380 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73  .      ** this s
1b390 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61  ooner rather tha
1b3a0 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68  n later means th
1b3b0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b3c0 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20  can safely .    
1b3d0 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65    ** re-read the
1b3e0 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66   database size f
1b3f0 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20  rom page 1 if a 
1b400 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61  savepoint or tra
1b410 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
1b420 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72  * rollback occur
1b430 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61  s within the tra
1b440 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
1b450 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  */.      if( pBt
1b460 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74  ->nPage!=get4byt
1b470 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1b480 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  [28]) ){.       
1b490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1b4a0 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e  erWrite(pPage1->
1b4b0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1b4c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b4d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1b4e0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1b4f0 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42  1->aData[28], pB
1b500 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  t->nPage);.     
1b510 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1b520 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62   }.  }...trans_b
1b530 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d  egun:.  if( rc==
1b540 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
1b550 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  lag ){.    /* Th
1b560 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75  is call makes su
1b570 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  re that the page
1b580 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63  r has the correc
1b590 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20  t number of.    
1b5a0 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  ** open savepoin
1b5b0 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e  ts. If the secon
1b5c0 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67  d parameter is g
1b5d0 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e  reater than 0 an
1b5e0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62  d.    ** the sub
1b5f0 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20  -journal is not 
1b600 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68  already open, th
1b610 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70  en it will be op
1b620 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a  ened here..    *
1b630 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1b640 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70  e3PagerOpenSavep
1b650 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
1b660 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f  , p->db->nSavepo
1b670 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72  int);.  }..  btr
1b680 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
1b690 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1b6a0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1b6b0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
1b6c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1b6d0 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65  VACUUM../*.** Se
1b6e0 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  t the pointer-ma
1b6f0 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c  p entries for al
1b700 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61  l children of pa
1b710 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20  ge pPage. Also, 
1b720 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74  if.** pPage cont
1b730 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20  ains cells that 
1b740 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
1b750 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65  w pages, set the
1b760 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20   pointer.** map 
1b770 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20  entries for the 
1b780 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  overflow pages a
1b790 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  s well..*/.stati
1b7a0 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74  c int setChildPt
1b7b0 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70  rmaps(MemPage *p
1b7c0 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1b7f0 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20  ounter variable 
1b800 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20  */.  int nCell; 
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b820 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b830 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61  r of cells in pa
1b840 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e  ge pPage */.  in
1b850 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1b880 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
1b890 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
1b8a0 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67  .  u8 isInitOrig
1b8b0 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74   = pPage->isInit
1b8c0 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20  ;.  Pgno pgno = 
1b8d0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20  pPage->pgno;..  
1b8e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b8f0 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
1b900 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
1b910 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69  .  rc = btreeIni
1b920 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
1b930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b940 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65  K ){.    goto se
1b950 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
1b960 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c  out;.  }.  nCell
1b970 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1b980 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ..  for(i=0; i<n
1b990 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
1b9a0 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1b9b0 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1b9c0 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76  .    ptrmapPutOv
1b9d0 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  flPtr(pPage, pCe
1b9e0 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69  ll, &rc);..    i
1b9f0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1ba00 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
1ba10 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1ba20 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
1ba30 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1ba40 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41  childPgno, PTRMA
1ba50 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26  P_BTREE, pgno, &
1ba60 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  rc);.    }.  }..
1ba70 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1ba80 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63  af ){.    Pgno c
1ba90 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1baa0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1bab0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1bac0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d  et+8]);.    ptrm
1bad0 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
1bae0 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
1baf0 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a  EE, pgno, &rc);.
1bb00 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70    }..set_child_p
1bb10 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50  trmaps_out:.  pP
1bb20 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
1bb30 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75  InitOrig;.  retu
1bb40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1bb50 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61  Somewhere on pPa
1bb60 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ge is a pointer 
1bb70 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20  to page iFrom.  
1bb80 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e  Modify this poin
1bb90 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69  ter so.** that i
1bba0 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e  t points to iTo.
1bbb0 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65   Parameter eType
1bbc0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74   describes the t
1bbd0 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74  ype of pointer t
1bbe0 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64  o.** be modified
1bbf0 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  , as  follows:.*
1bc00 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45  *.** PTRMAP_BTRE
1bc10 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20  E:     pPage is 
1bc20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
1bc30 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
1bc40 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20   at a child .** 
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc60 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e    page of pPage.
1bc70 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
1bc80 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69  ERFLOW1: pPage i
1bc90 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20  s a btree-page. 
1bca0 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  The pointer poin
1bcb0 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f  ts at an overflo
1bcc0 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  w.**            
1bcd0 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e         page poin
1bce0 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66  ted to by one of
1bcf0 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50   the cells on pP
1bd00 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41  age..**.** PTRMA
1bd10 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61  P_OVERFLOW2: pPa
1bd20 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
1bd30 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e  w-page. The poin
1bd40 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68  ter points at th
1bd50 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20  e next.**       
1bd60 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72              over
1bd70 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
1bd80 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
1bd90 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50   int modifyPageP
1bda0 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a  ointer(MemPage *
1bdb0 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f  pPage, Pgno iFro
1bdc0 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20  m, Pgno iTo, u8 
1bdd0 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  eType){.  assert
1bde0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1bdf0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
1be00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1be10 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
1be20 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
1be30 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
1be40 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1be50 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b  MAP_OVERFLOW2 ){
1be60 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  .    /* The poin
1be70 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68  ter is always th
1be80 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1be90 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  of the page in t
1bea0 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
1beb0 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70    if( get4byte(p
1bec0 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46  Page->aData)!=iF
1bed0 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rom ){.      ret
1bee0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1bef0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
1bf00 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67     put4byte(pPag
1bf10 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a  e->aData, iTo);.
1bf20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
1bf30 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
1bf40 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20  ge->isInit;.    
1bf50 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
1bf60 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63  Cell;.    int rc
1bf70 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  ;..    rc = btre
1bf80 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29  eInitPage(pPage)
1bf90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
1bfa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43  eturn rc;.    nC
1bfb0 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
1bfc0 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30  ll;..    for(i=0
1bfd0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
1bfe0 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  .      u8 *pCell
1bff0 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1c000 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28  e, i);.      if(
1c010 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1c020 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20  VERFLOW1 ){.    
1c030 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
1c040 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  o;.        pPage
1c050 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
1c060 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
1c070 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
1c080 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e  nfo.nLocal<info.
1c090 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20 20  nPayload.       
1c0a0 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e    && pCell+info.
1c0b0 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67 65 2d 3e  nSize-1<=pPage->
1c0c0 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73  aData+pPage->mas
1c0d0 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20 26  kPage.         &
1c0e0 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  & iFrom==get4byt
1c0f0 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  e(pCell+info.nSi
1c100 7a 65 2d 34 29 0a 20 20 20 20 20 20 20 20 29 7b  ze-4).        ){
1c110 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1c120 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e  yte(pCell+info.n
1c130 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20 20  Size-4, iTo);.  
1c140 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c160 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1c170 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1c180 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1c190 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1c1a0 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1c1b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c1c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c1d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1c1e0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1c1f0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1c200 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1c210 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1c220 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c230 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c240 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1c250 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c260 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c270 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c280 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1c290 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c2a0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
1c2b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1c2c0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
1c2d0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
1c2e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c2f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1c300 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1c310 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
1c320 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
1c330 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
1c340 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
1c350 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
1c360 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
1c370 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
1c380 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
1c390 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
1c3a0 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
1c3b0 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
1c3c0 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
1c3d0 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
1c3e0 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1c3f0 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
1c400 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
1c410 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
1c420 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
1c430 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
1c440 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
1c450 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1c460 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
1c470 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1c480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1c490 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
1c4a0 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
1c4b0 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
1c4c0 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
1c4d0 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
1c4e0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c4f0 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
1c500 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1c510 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
1c520 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1c530 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
1c540 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
1c550 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1c560 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
1c570 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
1c580 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
1c590 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
1c5a0 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1c5b0 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
1c5c0 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
1c5d0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1c5e0 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
1c5f0 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
1c600 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1c610 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
1c620 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
1c630 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
1c640 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
1c650 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
1c660 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1c670 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1c680 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
1c690 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1c6a0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c6b0 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
1c6c0 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
1c6d0 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1c6e0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c6f0 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1c700 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c710 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1c720 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
1c730 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
1c740 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
1c750 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
1c760 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
1c770 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
1c780 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
1c790 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
1c7a0 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
1c7b0 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
1c7c0 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
1c7d0 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
1c7e0 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1c7f0 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
1c800 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
1c810 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1c820 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
1c830 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
1c840 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
1c850 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1c870 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1c880 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
1c890 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
1c8a0 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
1c8b0 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
1c8c0 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
1c8d0 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
1c8e0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
1c8f0 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1c900 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
1c910 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
1c920 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
1c930 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
1c940 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
1c950 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
1c960 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1c970 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
1c980 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1c990 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
1c9a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
1c9b0 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1c9c0 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
1c9d0 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1c9e0 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
1c9f0 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
1ca00 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
1ca10 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
1ca20 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
1ca30 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
1ca40 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1ca50 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1ca60 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1ca70 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
1ca80 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
1ca90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1caa0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1cab0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
1cac0 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
1cad0 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
1cae0 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
1caf0 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
1cb00 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
1cb10 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
1cb20 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
1cb30 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
1cb40 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1cb50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cb60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1cb70 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1cb80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1cb90 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
1cba0 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
1cbb0 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
1cbc0 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
1cbd0 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
1cbe0 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
1cbf0 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
1cc00 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
1cc10 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
1cc20 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
1cc30 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1cc40 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1cc50 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1cc60 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
1cc70 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
1cc80 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1cc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cca0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ccb0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1ccc0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1ccd0 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
1cce0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ccf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cd00 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1cd10 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
1cd20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cd30 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
1cd40 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
1cd50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
1cd60 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
1cd70 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1cd80 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1cd90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cda0 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
1cdb0 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
1cdc0 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
1cdd0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1cde0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1cdf0 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1ce00 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
1ce10 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
1ce20 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
1ce30 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1ce40 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
1ce50 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
1ce60 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
1ce70 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
1ce80 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
1ce90 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
1cea0 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
1ceb0 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1cec0 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
1ced0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1cee0 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
1cef0 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
1cf00 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
1cf10 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
1cf20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
1cf30 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
1cf40 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
1cf50 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
1cf60 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1cf70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
1cf80 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
1cf90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
1cfa0 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
1cfb0 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
1cfc0 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
1cfd0 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
1cfe0 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
1cff0 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
1d000 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
1d010 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
1d020 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
1d030 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1d040 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
1d050 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
1d060 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d070 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
1d080 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1d090 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
1d0a0 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
1d0b0 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
1d0c0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1d0d0 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1d0e0 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
1d0f0 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
1d100 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
1d110 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1d120 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
1d130 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
1d140 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
1d150 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
1d160 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
1d170 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
1d180 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
1d190 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1d1a0 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
1d1b0 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
1d1c0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1d1d0 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
1d1e0 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
1d1f0 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
1d200 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
1d210 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d220 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
1d230 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
1d240 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1d250 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d260 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d270 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d280 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
1d290 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
1d2a0 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1d2b0 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
1d2c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d2d0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
1d2e0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
1d2f0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
1d300 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
1d310 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1d320 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d330 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
1d340 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
1d350 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1d360 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1d370 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1d380 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
1d390 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
1d3a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d3b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1d3c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d3d0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1d3e0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d3f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d400 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d410 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1d420 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1d430 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1d440 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1d450 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
1d460 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
1d470 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
1d480 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
1d490 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
1d4a0 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
1d4b0 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
1d4c0 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
1d4d0 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
1d4e0 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
1d4f0 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1d500 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1d510 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
1d520 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
1d530 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
1d540 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
1d550 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
1d560 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
1d570 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1d580 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
1d590 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1d5a0 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1d5b0 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1d5c0 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1d5d0 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
1d5e0 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
1d5f0 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
1d600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1d620 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d630 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1d640 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
1d650 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
1d660 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1d670 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d680 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
1d690 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
1d6a0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d6b0 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
1d6c0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
1d6d0 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
1d6e0 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
1d6f0 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
1d700 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
1d710 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
1d720 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1d730 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
1d740 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
1d750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
1d760 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
1d770 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1d780 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
1d790 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1d7a0 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
1d7b0 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
1d7c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d7d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d7e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d7f0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1d800 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
1d810 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1d820 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
1d830 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
1d840 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
1d850 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
1d860 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
1d870 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
1d880 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
1d890 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
1d8a0 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
1d8b0 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
1d8c0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1d8d0 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
1d8e0 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
1d8f0 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
1d900 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
1d910 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
1d920 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
1d930 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
1d940 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
1d950 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1d960 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
1d970 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
1d980 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
1d990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
1d9a0 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
1d9b0 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1d9c0 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1d9d0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1d9e0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1d9f0 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
1da00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1da10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1da20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1da30 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1da40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1da50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1da60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1da70 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1da80 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
1da90 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
1daa0 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
1dab0 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
1dac0 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
1dad0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
1dae0 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
1daf0 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
1db00 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
1db10 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
1db20 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1db30 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1db40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1db50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1db60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1db70 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
1db80 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
1db90 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
1dba0 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
1dbb0 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
1dbc0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
1dbd0 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
1dbe0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
1dbf0 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
1dc00 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
1dc10 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
1dc20 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
1dc30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1dc40 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
1dc50 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
1dc60 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1dc70 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
1dc80 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
1dc90 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
1dca0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
1dcb0 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
1dcc0 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
1dcd0 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
1dce0 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1dcf0 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
1dd00 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
1dd10 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
1dd20 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
1dd30 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
1dd40 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
1dd50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
1dd60 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd80 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1dd90 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
1dda0 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
1ddb0 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
1ddc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1ddd0 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
1dde0 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
1ddf0 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de10 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1de20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
1de30 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
1de40 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
1de50 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
1de60 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
1de70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
1de80 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
1de90 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
1dea0 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
1deb0 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
1dec0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1ded0 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1dee0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1def0 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1df00 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1df10 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1df20 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1df30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1df40 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1df50 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1df60 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1df70 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1df80 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1df90 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1dfa0 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1dfb0 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1dfc0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1dfd0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1dfe0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1dff0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1e000 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1e010 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1e020 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1e030 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1e040 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1e050 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1e060 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1e070 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1e080 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1e090 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e0a0 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1e0b0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1e0c0 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1e0d0 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1e0e0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1e0f0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1e100 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1e110 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1e120 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1e130 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1e140 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1e150 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1e160 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1e170 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1e180 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1e190 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1e1a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1e1b0 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1e1c0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e1d0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1e1e0 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e1f0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e200 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1e210 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1e220 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1e230 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1e240 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1e250 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1e260 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1e270 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1e280 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e290 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1e2a0 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1e2b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e2c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1e2d0 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1e2e0 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1e2f0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1e300 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1e310 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1e320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e340 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e350 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e360 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1e370 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e380 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1e390 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1e3a0 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1e3b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e3c0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1e3d0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1e3e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1e3f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1e400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e410 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e420 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1e430 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1e440 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1e450 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1e460 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1e470 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1e480 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1e490 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e4a0 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1e4b0 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1e4c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1e4d0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1e4e0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1e4f0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1e500 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1e510 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1e520 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1e530 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1e540 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1e550 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1e560 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1e570 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1e580 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1e590 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1e5a0 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1e5b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e5c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e5d0 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1e5e0 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1e5f0 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1e600 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1e610 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ; )..  assert( s
1e620 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e630 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e640 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1e650 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1e660 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1e670 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1e680 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1e690 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1e6a0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1e6b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1e6c0 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1e6d0 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1e6e0 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1e6f0 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1e700 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e710 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1e720 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1e730 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1e740 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1e750 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1e760 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1e770 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1e780 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1e790 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1e7a0 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1e7b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e7c0 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1e7d0 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1e7e0 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1e7f0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e800 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1e810 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1e820 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1e830 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1e840 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1e850 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1e860 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1e870 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1e880 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1e890 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1e8a0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1e8b0 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1e8c0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1e8d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1e8e0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1e8f0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1e900 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1e910 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1e920 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1e930 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1e940 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1e950 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1e960 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1e970 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1e980 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1e990 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1e9a0 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1e9b0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1e9c0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1e9d0 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1e9e0 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1e9f0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1ea00 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1ea10 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1ea20 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1ea30 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1ea40 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1ea50 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
1ea60 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
1ea70 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1ea80 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ea90 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1eaa0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1eab0 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1eac0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1ead0 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1eae0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1eaf0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1eb00 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1eb10 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1eb20 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1eb30 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1eb40 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1eb50 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1eb60 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1eb70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1eb80 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1eb90 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1eba0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1ebb0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1ebc0 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1ebd0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1ebe0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ebf0 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1ec00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ec10 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1ec20 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1ec30 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1ec40 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1ec50 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1ec60 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1ec70 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1ec80 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1ec90 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1eca0 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1ecb0 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1ecc0 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1ecd0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1ece0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1ecf0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1ed00 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1ed10 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1ed20 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1ed30 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1ed40 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1ed50 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1ed60 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1ed70 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1ed80 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1ed90 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1eda0 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1edb0 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1edc0 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1edd0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1ede0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1edf0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1ee00 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1ee10 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1ee20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1ee30 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1ee40 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1ee50 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1ee60 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1ee70 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1ee80 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1ee90 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1eea0 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1eeb0 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1eec0 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1eed0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1eee0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1eef0 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1ef00 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1ef10 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1ef20 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1ef30 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1ef40 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1ef50 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1ef60 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1ef70 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1ef80 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1ef90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1efa0 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1efb0 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1efc0 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1efd0 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1efe0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1eff0 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1f000 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1f010 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1f020 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1f030 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1f040 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1f050 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1f060 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1f070 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1f080 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1f090 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1f0a0 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1f0b0 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1f0c0 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1f0d0 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1f0e0 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1f0f0 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1f100 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1f110 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1f120 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1f130 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1f140 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1f150 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1f160 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1f170 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1f180 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1f190 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1f1a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f1b0 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1f1c0 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1f1d0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1f1e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f1f0 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1f200 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1f210 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1f220 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f230 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1f240 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1f250 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f260 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1f270 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1f290 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1f2a0 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1f2b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f2c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1f2d0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1f2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f2f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f300 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1f310 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1f320 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1f330 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1f340 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1f350 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1f360 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1f370 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f380 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1f390 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1f3a0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f3b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1f3c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f3d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f3e0 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1f3f0 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1f400 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1f410 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1f420 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1f430 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1f440 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1f450 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1f460 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1f470 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1f480 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f490 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f4a0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1f4b0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1f4c0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1f4d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f4e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1f4f0 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f500 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1f510 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1f520 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1f530 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1f540 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1f550 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1f560 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1f570 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1f580 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1f590 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1f5a0 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1f5b0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1f5c0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1f5d0 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1f5e0 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1f5f0 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1f600 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1f610 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1f620 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1f630 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1f640 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1f650 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1f660 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1f670 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1f680 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1f690 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1f6a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1f6b0 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1f6c0 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1f6d0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1f6e0 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1f6f0 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1f700 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1f710 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1f720 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f730 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1f740 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1f750 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1f760 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1f770 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1f780 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1f790 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1f7a0 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1f7b0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1f7c0 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1f7d0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1f7e0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1f7f0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1f800 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1f810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f820 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1f830 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1f840 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1f850 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1f860 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1f870 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1f880 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1f890 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1f8a0 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1f8b0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1f8c0 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1f8d0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1f8e0 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1f8f0 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1f900 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1f910 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1f920 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1f930 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1f940 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1f950 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1f960 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1f970 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1f980 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1f990 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1f9a0 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1f9b0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1f9c0 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1f9d0 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1f9e0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1f9f0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1fa00 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1fa10 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1fa20 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1fa30 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1fa40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1fa50 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1fa60 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1fa70 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1fa80 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1fa90 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1faa0 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1fab0 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1fac0 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1fad0 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1fae0 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1faf0 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1fb00 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1fb10 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1fb20 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1fb30 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1fb40 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1fb50 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1fb60 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1fb70 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1fb80 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1fb90 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1fba0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1fbb0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1fbc0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1fbd0 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1fbe0 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1fbf0 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1fc00 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1fc10 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1fc20 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1fc30 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1fc40 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1fc50 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1fc60 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1fc70 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1fc80 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1fc90 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1fca0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fcb0 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1fcc0 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1fcd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fce0 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1fcf0 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1fd00 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1fd10 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1fd20 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1fd30 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1fd40 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1fd50 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1fd60 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1fd70 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1fd80 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1fd90 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1fda0 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1fdb0 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1fdc0 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1fdd0 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1fde0 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1fdf0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1fe00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1fe10 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1fe20 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1fe30 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1fe40 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1fe50 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1fe60 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1fe70 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1fe80 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
1fe90 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1fea0 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
1feb0 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
1fec0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1fed0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
1fee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fef0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1ff00 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
1ff10 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
1ff20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
1ff30 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
1ff40 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
1ff50 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
1ff60 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
1ff70 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
1ff80 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
1ff90 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
1ffa0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
1ffb0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1ffc0 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
1ffd0 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
1ffe0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1fff0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
20000 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
20010 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
20020 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
20030 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
20040 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
20050 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
20060 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
20070 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
20080 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
20090 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
200a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
200b0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
200c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
200d0 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
200e0 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
200f0 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
20100 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
20110 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
20120 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
20130 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
20140 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
20150 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
20160 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
20170 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
20180 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
201a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
201b0 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
201c0 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
201d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
201e0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
201f0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
20200 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20220 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
20230 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
20240 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20250 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
20260 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
20270 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
20280 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20290 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
202a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
202b0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
202c0 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
202d0 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
202e0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
202f0 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
20300 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
20310 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
20320 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
20330 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
20340 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
20350 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
20360 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
20370 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
20380 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
20390 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
203a0 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
203b0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
203c0 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
203d0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
203e0 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
203f0 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
20400 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
20410 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
20420 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
20430 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
20440 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
20450 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
20460 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
20470 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
20480 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
20490 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
204a0 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
204b0 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
204c0 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
204d0 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
204e0 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
204f0 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
20500 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
20510 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
20520 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
20530 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
20540 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
20550 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
20560 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
20570 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
20580 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
20590 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
205a0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
205b0 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
205c0 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
205d0 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
205e0 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
205f0 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
20600 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
20610 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
20620 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
20630 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
20640 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
20650 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
20660 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
20670 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
20680 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
20690 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
206a0 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
206b0 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
206c0 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
206d0 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
206e0 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
206f0 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
20700 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
20710 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
20720 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
20730 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
20740 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
20750 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
20760 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
20770 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
20780 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
20790 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
207a0 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
207b0 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
207c0 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
207d0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
207e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
207f0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
20800 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
20810 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
20820 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
20830 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
20840 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
20850 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
20860 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
20870 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
20880 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
20890 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
208a0 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77  t i;.      if( w
208b0 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e  riteOnly && (p->
208c0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
208d0 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b  WriteFlag)==0 ){
208e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
208f0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20900 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74  ALID || p->eStat
20910 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
20920 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
20930 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
20940 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
20950 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20960 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20970 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
20980 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20990 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20  Cursors(pBtree, 
209a0 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rc, 0);.        
209b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
209c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
209d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
209e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
209f0 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
20a00 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  ;.        p->eSt
20a10 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
20a20 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  LT;.        p->s
20a30 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
20a40 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
20a50 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
20a60 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
20a70 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20a80 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
20a90 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67          p->apPag
20aa0 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[i] = 0;.      
20ab0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
20ac0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
20ad0 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
20ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20af0 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
20b00 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
20b10 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
20b20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
20b30 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
20b40 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
20b50 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
20b60 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
20b70 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
20b80 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20b90 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
20ba0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
20bb0 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
20bc0 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
20bd0 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
20be0 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
20bf0 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
20c00 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
20c10 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
20c20 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
20c30 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
20c40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20c50 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
20c60 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
20c70 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
20c80 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
20c90 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
20ca0 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
20cb0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
20cc0 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
20cd0 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
20ce0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
20cf0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
20d00 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
20d10 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
20d20 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
20d30 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
20d40 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
20d50 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
20d60 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
20d70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
20d80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
20d90 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
20da0 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
20db0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
20dc0 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
20dd0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
20de0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20df0 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
20e00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
20e10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20e20 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
20e30 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
20e40 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20e50 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
20e60 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
20e70 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20e80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
20e90 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
20ea0 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
20eb0 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
20ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
20ed0 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
20ee0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
20ef0 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
20f00 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
20f10 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
20f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
20f30 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
20f40 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
20f50 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
20f60 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
20f70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
20f80 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
20f90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
20fa0 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
20fb0 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
20fc0 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
20fd0 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
20fe0 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
20ff0 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
21000 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
21010 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
21020 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
21030 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
21040 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
21050 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
21060 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
21070 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
21080 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21090 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
210a0 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
210b0 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
210c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
210d0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
210e0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
210f0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
21100 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
21110 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
21120 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
21130 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
21140 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
21150 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
21160 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
21170 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
21180 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
21190 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
211a0 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
211b0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
211c0 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
211d0 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
211e0 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
211f0 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
21200 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
21210 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21220 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
21230 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
21240 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
21250 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
21260 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
21270 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
21280 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
21290 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
212a0 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
212b0 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
212c0 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
212d0 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
212e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
212f0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
21300 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
21310 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
21320 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
21330 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
21340 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
21350 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
21360 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
21370 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
21380 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
21390 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
213a0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
213b0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
213c0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
213d0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
213e0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
213f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
21400 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
21410 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
21420 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
21430 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
21440 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
21450 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
21460 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
21470 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
21480 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
21490 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
214a0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
214b0 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
214c0 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
214d0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
214e0 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
214f0 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
21500 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
21510 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
21520 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
21530 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
21540 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
21550 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
21560 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
21570 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
21580 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
21590 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
215a0 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
215b0 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
215c0 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
215d0 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
215e0 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
215f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21600 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
21610 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21620 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
21630 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
21640 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
21650 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
21660 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
21670 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21680 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
21690 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
216a0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
216b0 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
216c0 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
216d0 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
216e0 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
216f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
21700 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
21710 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
21720 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
21730 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
21740 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
21750 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
21760 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
21770 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21780 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
21790 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
217a0 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
217b0 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
217c0 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
217d0 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
217e0 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
217f0 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
21800 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
21810 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
21820 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
21830 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
21840 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
21850 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
21860 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
21870 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
21880 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
21890 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
218a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
218b0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
218c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
218d0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
218e0 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
218f0 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
21900 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
21910 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
21920 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
21930 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
21940 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
21950 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
21960 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
21970 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
21980 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
21990 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
219a0 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
219b0 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
219c0 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
219d0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
219e0 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
219f0 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
21a00 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
21a10 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
21a20 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
21a30 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
21a40 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
21a50 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
21a60 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
21a70 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
21a80 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
21a90 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
21aa0 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
21ab0 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
21ac0 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
21ad0 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
21ae0 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
21af0 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
21b00 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21b10 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
21b20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
21b30 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
21b40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21b50 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
21b60 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
21b70 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
21b80 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21b90 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
21ba0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
21bb0 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
21bc0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
21bd0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
21be0 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
21bf0 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
21c00 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
21c10 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
21c20 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21c30 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
21c40 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
21c50 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21c60 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
21c70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21c80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21c90 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
21ca0 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
21cb0 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
21cc0 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
21cd0 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
21ce0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
21cf0 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
21d00 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
21d10 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
21d20 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
21d30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
21d40 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
21d50 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
21d60 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
21d70 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
21d80 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
21d90 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
21da0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
21db0 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
21dc0 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
21dd0 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
21de0 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
21df0 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
21e00 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
21e10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21e20 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21e30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21e50 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
21e60 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
21e70 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
21e80 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
21e90 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
21ea0 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
21eb0 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
21ec0 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
21ed0 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
21ee0 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
21ef0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
21f00 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
21f10 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
21f20 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
21f30 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
21f40 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
21f50 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
21f60 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
21f70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
21f80 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
21f90 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20 62  he BTREE_WRCSR b
21fa0 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73 20  it of wrFlag is 
21fb0 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65 20  clear, then the 
21fc0 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 0a  cursor can only.
21fd0 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ** be used for r
21fe0 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65 20  eading.  If the 
21ff0 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74 20  BTREE_WRCSR bit 
22000 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65  is set, then the
22010 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 62   cursor.** can b
22020 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
22030 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69 6e  ng or for writin
22040 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64 69  g if other condi
22050 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69 6e  tions for writin
22060 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d 65  g.** are also me
22070 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74 68  t.  These are th
22080 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61  e conditions tha
22090 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69 6e  t must be met in
220a0 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77 72   order.** for wr
220b0 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c 6f  iting to be allo
220c0 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54  wed:.**.** 1:  T
220d0 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 68  he cursor must h
220e0 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  ave been opened 
220f0 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e 74  with wrFlag cont
22100 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52 43  aining BTREE_WRC
22110 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  SR.**.** 2:  Oth
22120 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
22130 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
22140 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
22150 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
22160 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
22170 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
22180 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
22190 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
221a0 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
221b0 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
221c0 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
221d0 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
221e0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
221f0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
22200 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
22210 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
22220 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
22230 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
22240 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
22250 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
22260 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
22270 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
22280 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
22290 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
222a0 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
222b0 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
222c0 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  action..**.** Th
222d0 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  e BTREE_FORDELET
222e0 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20  E bit of wrFlag 
222f0 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62  may optionally b
22300 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f 57  e set if BTREE_W
22310 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e 20  RCSR.** is set. 
22320 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69 73   If FORDELETE is
22330 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61 20   set, that is a 
22340 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70 6c  hint to the impl
22350 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a  ementation that.
22360 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20 77  ** this cursor w
22370 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
22380 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64 20   to seek to and 
22390 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20 6f  delete entries o
223a0 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61 73  f an index.** as
223b0 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
223c0 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
223d0 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c 45  nt.  The FORDELE
223e0 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20 75  TE hint is not u
223f0 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 69  sed by.** this i
22400 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
22410 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68 65  But in a hypothe
22420 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69 76  tical alternativ
22430 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e 65  e storage engine
22440 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69 6e   .** in which in
22450 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65 20  dex entries are 
22460 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
22470 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72 65  leted when corre
22480 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a 2a  sponding table.*
22490 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65 74  * rows are delet
224a0 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45 54  ed, the FORDELET
224b0 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e 74  E flag is a hint
224c0 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20 61   that all SEEK a
224d0 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70 65  nd DELETE.** ope
224e0 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73 20  rations on this 
224f0 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e 6f  cursor can be no
22500 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45 41  -ops and all REA
22510 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61 6e  D operations can
22520 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e 75   .** return a nu
22530 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73 3a  ll row (2-bytes:
22540 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a 0a   0x01 0x00)..**.
22550 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69  ** No checking i
22560 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73  s done to make s
22570 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54  ure that page iT
22580 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74  able really is t
22590 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  he.** root page 
225a0 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66  of a b-tree.  If
225b0 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e   it is not, then
225c0 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75   the cursor acqu
225d0 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ired.** will not
225e0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
225f0 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  .**.** It is ass
22600 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73 71  umed that the sq
22610 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22620 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e 20  Zero() has been 
22630 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43 75  called.** on pCu
22640 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20  r to initialize 
22650 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  the memory space
22660 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69   prior to invoki
22670 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
22680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
22690 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
226a0 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
226b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226c0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
226d0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
226e0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
226f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22700 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61   Root page of ta
22710 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ble to open */. 
22720 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20   int wrFlag,    
22730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22740 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20          /* 1 to 
22750 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e  write. 0 read-on
22760 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b  ly */.  struct K
22770 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
22780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
22790 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63  * First arg to c
227a0 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
227b0 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  on */.  BtCursor
227c0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
227d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
227e0 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20  * Space for new 
227f0 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 42  cursor */.){.  B
22800 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
22810 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
22820 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
22830 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a 2f  b-tree handle */
22840 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58 3b  .  BtCursor *pX;
22850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
22870 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72 20  ping over other 
22880 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a 0a  all cursors */..
22890 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
228a0 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
228b0 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  (p) );.  assert(
228c0 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20 20   wrFlag==0 .    
228d0 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42 54     || wrFlag==BT
228e0 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20 20  REE_WRCSR .     
228f0 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42 54    || wrFlag==(BT
22900 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45 5f  REE_WRCSR|BTREE_
22910 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29 3b  FORDELETE) .  );
22920 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
22930 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61 74  wing assert stat
22940 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74 68  ements verify th
22950 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61 20  at if this is a 
22960 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20 62  sharable .  ** b
22970 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c 20  -tree database, 
22980 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  the connection i
22990 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72 65  s holding the re
229a0 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f 63  quired table loc
229b0 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ks, .  ** and th
229c0 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  at no other conn
229d0 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20 6f  ection has any o
229e0 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74 20  pen cursor that 
229f0 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 0a  conflicts with .
22a00 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e 20    ** this lock. 
22a10 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68 61   */.  assert( ha
22a20 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  sSharedCacheTabl
22a30 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65 2c  eLock(p, iTable,
22a40 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28 77   pKeyInfo!=0, (w
22a50 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a 20  rFlag?2:1)) );. 
22a60 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22a70 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43 6f  =0 || !hasReadCo
22a80 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
22a90 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65  e) );..  /* Asse
22aa0 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  rt that the call
22ab0 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74 68  er has opened th
22ac0 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e 73  e required trans
22ad0 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73 73  action. */.  ass
22ae0 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e  ert( p->inTrans>
22af0 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
22b00 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22b10 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  0 || p->inTrans=
22b20 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
22b30 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
22b40 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70 50  Page1 && pBt->pP
22b50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a 20  age1->aData );. 
22b60 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22b70 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46  =0 || (pBt->btsF
22b80 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
22b90 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20 69  ONLY)==0 );..  i
22ba0 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20  f( wrFlag ){.   
22bb0 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
22bc0 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  ce(pBt);.    if(
22bd0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3d   pBt->pTmpSpace=
22be0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
22bf0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
22c00 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d   }.  if( iTable=
22c10 3d 31 20 26 26 20 62 74 72 65 65 50 61 67 65 63  =1 && btreePagec
22c20 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20 29 7b 0a  ount(pBt)==0 ){.
22c30 20 20 20 20 61 73 73 65 72 74 28 20 77 72 46 6c      assert( wrFl
22c40 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 69 54 61  ag==0 );.    iTa
22c50 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ble = 0;.  }..  
22c60 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f  /* Now that no o
22c70 74 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20  ther errors can 
22c80 6f 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69  occur, finish fi
22c90 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43  lling in the BtC
22ca0 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61  ursor.  ** varia
22cb0 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b 20 74 68  bles and link th
22cc0 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74 68  e cursor into th
22cd0 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74 2e  e BtShared list.
22ce0 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 67 6e    */.  pCur->pgn
22cf0 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54  oRoot = (Pgno)iT
22d00 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d 3e 69 50  able;.  pCur->iP
22d10 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70 43 75 72  age = -1;.  pCur
22d20 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
22d30 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
22d40 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
22d50 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
22d60 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 3d  pCur->curFlags =
22d70 20 77 72 46 6c 61 67 20 3f 20 42 54 43 46 5f 57   wrFlag ? BTCF_W
22d80 72 69 74 65 46 6c 61 67 20 3a 20 30 3b 0a 20 20  riteFlag : 0;.  
22d90 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c  pCur->curPagerFl
22da0 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 30  ags = wrFlag ? 0
22db0 20 3a 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   : PAGER_GET_REA
22dc0 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49 66 20 74  DONLY;.  /* If t
22dd0 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
22de0 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
22df0 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
22e00 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 0a 20 20  then all such.  
22e10 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d 75 73 74  ** cursors *must
22e20 2a 20 68 61 76 65 20 74 68 65 20 42 54 43 46 5f  * have the BTCF_
22e30 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65  Multiple flag se
22e40 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 58 3d 70  t. */.  for(pX=p
22e50 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 58 3b  Bt->pCursor; pX;
22e60 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
22e70 20 20 20 20 69 66 28 20 70 58 2d 3e 70 67 6e 6f      if( pX->pgno
22e80 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69 54 61 62  Root==(Pgno)iTab
22e90 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 58 2d 3e  le ){.      pX->
22ea0 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
22eb0 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 20  _Multiple;.     
22ec0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
22ed0 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
22ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
22ef0 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d  ur->pNext = pBt-
22f00 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70 42 74 2d  >pCursor;.  pBt-
22f10 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 3b  >pCursor = pCur;
22f20 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
22f30 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
22f40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
22f50 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
22f60 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 0a  te3BtreeCursor(.
22f70 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20    Btree *p,     
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22fa0 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
22fb0 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22fe0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
22ff0 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
23000 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
23030 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
23040 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
23050 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
23060 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
23070 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
23080 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65 28  arg to xCompare(
23090 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  ) */.  BtCursor 
230a0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
230b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230c0 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77 20     /* Write new 
230d0 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a 29  cursor here */.)
230e0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
230f0 28 20 69 54 61 62 6c 65 3c 31 20 29 7b 0a 20 20  ( iTable<1 ){.  
23100 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
23110 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 65  RRUPT_BKPT;.  }e
23120 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
23130 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
23140 20 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72     rc = btreeCur
23150 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
23160 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
23170 20 70 43 75 72 29 3b 0a 20 20 20 20 73 71 6c 69   pCur);.    sqli
23180 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
23190 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
231a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
231b0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 61  rn the size of a
231c0 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
231d0 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a   in bytes..**.**
231e0 20 54 68 69 73 20 69 6e 74 65 72 66 61 63 65 73   This interfaces
231f0 20 69 73 20 6e 65 65 64 65 64 20 73 6f 20 74 68   is needed so th
23200 61 74 20 75 73 65 72 73 20 6f 66 20 63 75 72 73  at users of curs
23210 6f 72 73 20 63 61 6e 20 70 72 65 61 6c 6c 6f 63  ors can prealloc
23220 61 74 65 0a 2a 2a 20 73 75 66 66 69 63 69 65 6e  ate.** sufficien
23230 74 20 73 74 6f 72 61 67 65 20 74 6f 20 68 6f 6c  t storage to hol
23240 64 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  d a cursor.  The
23250 20 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74   BtCursor object
23260 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a 20 74 6f   is opaque.** to
23270 20 75 73 65 72 73 20 73 6f 20 74 68 65 79 20 63   users so they c
23280 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20 73 69 7a  annot do the siz
23290 65 6f 66 28 29 20 74 68 65 6d 73 65 6c 76 65 73  eof() themselves
232a0 20 2d 20 74 68 65 79 20 6d 75 73 74 20 63 61 6c   - they must cal
232b0 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  l.** this routin
232c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
232d0 33 42 74 72 65 65 43 75 72 73 6f 72 53 69 7a 65  3BtreeCursorSize
232e0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
232f0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 42   ROUND8(sizeof(B
23300 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a  tCursor));.}../*
23310 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6d  .** Initialize m
23320 65 6d 6f 72 79 20 74 68 61 74 20 77 69 6c 6c 20  emory that will 
23330 62 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74  be converted int
23340 6f 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  o a BtCursor obj
23350 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ect..**.** The s
23360 69 6d 70 6c 65 20 61 70 70 72 6f 61 63 68 20 68  imple approach h
23370 65 72 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 20  ere would be to 
23380 6d 65 6d 73 65 74 28 29 20 74 68 65 20 65 6e 74  memset() the ent
23390 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ire object.** to
233a0 20 7a 65 72 6f 2e 20 20 42 75 74 20 69 74 20 74   zero.  But it t
233b0 75 72 6e 73 20 6f 75 74 20 74 68 61 74 20 74 68  urns out that th
233c0 65 20 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 61  e apPage[] and a
233d0 69 49 64 78 5b 5d 20 61 72 72 61 79 73 0a 2a 2a  iIdx[] arrays.**
233e0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
233f0 62 65 20 7a 65 72 6f 65 64 20 61 6e 64 20 74 68  be zeroed and th
23400 65 79 20 61 72 65 20 6c 61 72 67 65 2c 20 73 6f  ey are large, so
23410 20 77 65 20 63 61 6e 20 73 61 76 65 20 61 20 6c   we can save a l
23420 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d 74 69 6d  ot.** of run-tim
23430 65 20 62 79 20 73 6b 69 70 70 69 6e 67 20 74 68  e by skipping th
23440 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
23450 20 6f 66 20 74 68 6f 73 65 20 65 6c 65 6d 65 6e   of those elemen
23460 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ts..*/.void sqli
23470 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 5a 65  te3BtreeCursorZe
23480 72 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b  ro(BtCursor *p){
23490 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20  .  memset(p, 0, 
234a0 6f 66 66 73 65 74 6f 66 28 42 74 43 75 72 73 6f  offsetof(BtCurso
234b0 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  r, iPage));.}../
234c0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
234d0 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
234e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
234f0 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
23500 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
23510 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
23520 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
23530 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
23540 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
23550 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
23560 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
23570 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
23580 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  tree ){.    int 
23590 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  i;.    BtShared 
235a0 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74  *pBt = pCur->pBt
235b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
235c0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
235d0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
235e0 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
235f0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
23600 70 42 74 2d 3e 70 43 75 72 73 6f 72 21 3d 30 20  pBt->pCursor!=0 
23610 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  );.    if( pBt->
23620 70 43 75 72 73 6f 72 3d 3d 70 43 75 72 20 29 7b  pCursor==pCur ){
23630 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
23640 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
23650 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
23660 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 50      BtCursor *pP
23670 72 65 76 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  rev = pBt->pCurs
23680 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  or;.      do{.  
23690 20 20 20 20 20 20 69 66 28 20 70 50 72 65 76 2d        if( pPrev-
236a0 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20 29 7b 0a  >pNext==pCur ){.
236b0 20 20 20 20 20 20 20 20 20 20 70 50 72 65 76 2d            pPrev-
236c0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
236d0 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
236e0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
236f0 0a 20 20 20 20 20 20 20 20 70 50 72 65 76 20 3d  .        pPrev =
23700 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3b 0a 20   pPrev->pNext;. 
23710 20 20 20 20 20 7d 77 68 69 6c 65 28 20 41 4c 57       }while( ALW
23720 41 59 53 28 70 50 72 65 76 29 20 29 3b 0a 20 20  AYS(pPrev) );.  
23730 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
23740 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b   i<=pCur->iPage;
23750 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c   i++){.      rel
23760 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
23770 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d  pPage[i]);.    }
23780 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  .    unlockBtree
23790 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
237a0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
237b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 29  pCur->aOverflow)
237c0 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  ;.    /* sqlite3
237d0 5f 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a  _free(pCur); */.
237e0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
237f0 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
23800 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
23810 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23820 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
23830 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
23840 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
23850 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
23860 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
23870 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
23880 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
23890 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74 72 65 65  d, call.** btree
238a0 50 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66  ParseCell() to f
238b0 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a  ill it in..**.**
238c0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69   BtCursor.info i
238d0 73 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65  s a cache of the
238e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
238f0 74 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c  the current cell
23900 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20  ..** Using this 
23910 63 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68  cache reduces th
23920 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c  e number of call
23930 73 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  s to btreeParseC
23940 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ell()..*/.#ifnde
23950 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
23960 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
23970 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
23980 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
23990 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e  nfo info;.    in
239a0 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  t iPage = pCur->
239b0 69 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65  iPage;.    memse
239c0 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65  t(&info, 0, size
239d0 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 62  of(info));.    b
239e0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
239f0 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
23a00 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69  ], pCur->aiIdx[i
23a10 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20  Page], &info);. 
23a20 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
23a30 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63 6d 70 28  PT_DB || memcmp(
23a40 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69 6e  &info, &pCur->in
23a50 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29  fo, sizeof(info)
23a60 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73  )==0 );.  }.#els
23a70 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73 65  e.  #define asse
23a80 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23 65  rtCellInfo(x).#e
23a90 6e 64 69 66 0a 73 74 61 74 69 63 20 53 51 4c 49  ndif.static SQLI
23aa0 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
23ab0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43   getCellInfo(BtC
23ac0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23ad0 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
23ae0 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Size==0 ){.    i
23af0 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75 72 2d  nt iPage = pCur-
23b00 3e 69 50 61 67 65 3b 0a 20 20 20 20 70 43 75 72  >iPage;.    pCur
23b10 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54  ->curFlags |= BT
23b20 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20  CF_ValidNKey;.  
23b30 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
23b40 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
23b50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78  age],pCur->aiIdx
23b60 5b 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69  [iPage],&pCur->i
23b70 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nfo);.  }else{. 
23b80 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66     assertCellInf
23b90 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  o(pCur);.  }.}..
23ba0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 20  #ifndef NDEBUG  
23bb0 2f 2a 20 54 68 65 20 6e 65 78 74 20 72 6f 75 74  /* The next rout
23bc0 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79 20 77 69  ine used only wi
23bd0 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  thin assert() st
23be0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a  atements */./*.*
23bf0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
23c00 20 74 68 65 20 67 69 76 65 6e 20 42 74 43 75 72   the given BtCur
23c10 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 41  sor is valid.  A
23c20 20 76 61 6c 69 64 20 63 75 72 73 6f 72 20 69 73   valid cursor is
23c30 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20 69 73 20   one.** that is 
23c40 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
23c50 6e 67 20 74 6f 20 61 20 72 6f 77 20 69 6e 20 61  ng to a row in a
23c60 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20 74 61 62   (non-empty) tab
23c70 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  le..** This is a
23c80 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 72 6f   verification ro
23c90 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 6f 6e  utine is used on
23ca0 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74  ly within assert
23cb0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  () statements..*
23cc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
23cd0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
23ce0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23cf0 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 20 26  .  return pCur &
23d00 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  & pCur->eState==
23d10 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
23d20 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45 42 55 47  #endif /* NDEBUG
23d30 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42   */.int sqlite3B
23d40 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
23d50 64 4e 4e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  dNN(BtCursor *pC
23d60 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ur){.  assert( p
23d70 43 75 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  Cur!=0 );.  retu
23d80 72 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  rn pCur->eState=
23d90 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d  =CURSOR_VALID;.}
23da0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
23db0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
23dc0 69 6e 74 65 67 65 72 20 6b 65 79 20 6f 72 20 22  integer key or "
23dd0 72 6f 77 69 64 22 20 66 6f 72 20 61 20 74 61 62  rowid" for a tab
23de0 6c 65 20 62 74 72 65 65 2e 0a 2a 2a 20 54 68 69  le btree..** Thi
23df0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
23e00 79 20 76 61 6c 69 64 20 66 6f 72 20 61 20 63 75  y valid for a cu
23e10 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
23e20 6e 74 69 6e 67 20 69 6e 74 6f 20 61 0a 2a 2a 20  nting into a.** 
23e30 6f 72 64 69 6e 61 72 79 20 74 61 62 6c 65 20 62  ordinary table b
23e40 74 72 65 65 2e 20 20 49 66 20 74 68 65 20 63 75  tree.  If the cu
23e50 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  rsor points to a
23e60 6e 20 69 6e 64 65 78 20 62 74 72 65 65 20 6f 72  n index btree or
23e70 0a 2a 2a 20 69 73 20 69 6e 76 61 6c 69 64 2c 20  .** is invalid, 
23e80 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
23e90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 6e  is routine is un
23ea0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 69 36 34 20  defined..*/.i64 
23eb0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 74 65  sqlite3BtreeInte
23ec0 67 65 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20  gerKey(BtCursor 
23ed0 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
23ee0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
23ef0 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
23f00 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
23f10 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23f20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
23f30 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 3b  ur->curIntKey );
23f40 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
23f50 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  Cur);.  return p
23f60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
23f70 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23f80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
23f90 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 20 66  tes of payload f
23fa0 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  or the entry tha
23fb0 74 20 70 43 75 72 20 69 73 0a 2a 2a 20 63 75 72  t pCur is.** cur
23fc0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
23fd0 74 6f 2e 20 20 46 6f 72 20 74 61 62 6c 65 20 62  to.  For table b
23fe0 74 72 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c  trees, this will
23ff0 20 62 65 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   be the amount.*
24000 2a 20 6f 66 20 64 61 74 61 2e 20 20 46 6f 72 20  * of data.  For 
24010 69 6e 64 65 78 20 62 74 72 65 65 73 2c 20 74 68  index btrees, th
24020 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 73  is will be the s
24030 69 7a 65 20 6f 66 20 74 68 65 20 6b 65 79 2e 0a  ize of the key..
24040 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
24050 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20   must guarantee 
24060 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
24070 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
24080 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c   non-NULL.** val
24090 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74  id entry.  In ot
240a0 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63  her words, the c
240b0 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
240c0 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a   must guarantee.
240d0 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ** that the curs
240e0 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53  or has Cursor.eS
240f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
24100 49 44 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  ID..*/.u32 sqlit
24110 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69  e3BtreePayloadSi
24120 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
24130 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
24140 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
24150 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
24160 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
24170 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
24180 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
24190 75 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur);.  return pC
241a0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
241b0 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  d;.}../*.** Give
241c0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
241d0 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
241e0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
241f0 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
24200 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
24210 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
24220 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
24230 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
24240 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
24250 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
24260 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
24270 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
24280 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
24290 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
242a0 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
242b0 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
242c0 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
242d0 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
242e0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
242f0 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
24300 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
24310 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
24320 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e  **.** The page n
24330 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
24340 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
24350 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  in the linked li
24360 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65  st is .** writte
24370 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e  n to *pPgnoNext.
24380 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73   If page ovfl is
24390 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
243a0 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a  n its linked .**
243b0 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
243c0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
243d0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
243e0 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
243f0 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63 65 20  and a reference 
24400 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f  to the MemPage o
24410 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64  bject correspond
24420 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e  ing.** to page n
24430 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20  umber pOvfl was 
24440 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a  obtained, then *
24450 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
24460 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a   point to that.*
24470 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20  * reference. It 
24480 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
24490 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
244a0 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65  ler to call rele
244b0 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20  asePage().** on 
244c0 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65 65 20  *ppPage to free 
244d0 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49  the reference. I
244e0 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77  n no reference w
244f0 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63  as obtained (bec
24500 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e  ause.** the poin
24510 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64  ter-map was used
24520 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76   to obtain the v
24530 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e  alue for *pPgnoN
24540 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70  ext), then.** *p
24550 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
24560 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
24570 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
24580 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
24590 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20  *pBt,           
245a0 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
245b0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67  ase file */.  Pg
245c0 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20  no ovfl,        
245d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
245e0 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70  rrent overflow p
245f0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
24600 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
24610 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
24620 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
24630 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
24640 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
24650 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
24660 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
24670 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
24680 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
24690 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
246a0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
246b0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
246c0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
246d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
246e0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
246f0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
24700 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
24710 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24720 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
24730 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
24740 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
24750 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
24760 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
24770 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
24780 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
24790 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
247a0 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
247b0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
247c0 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
247d0 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
247e0 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
247f0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
24800 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
24810 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
24820 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
24830 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
24840 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
24850 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
24860 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
24870 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
24880 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
24890 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
248a0 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
248b0 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
248c0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
248d0 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
248e0 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
248f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
24900 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
24910 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
24920 47 75 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65  Guess<=btreePage
24930 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
24940 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
24950 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
24960 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
24970 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
24980 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
24990 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
249a0 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
249b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
249c0 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
249d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
249e0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
249f0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
24a00 20 61 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30   assert( next==0
24a10 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44   || rc==SQLITE_D
24a20 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  ONE );.  if( rc=
24a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24a40 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
24a50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26  age(pBt, ovfl, &
24a60 70 50 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d  pPage, (ppPage==
24a70 30 29 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52  0) ? PAGER_GET_R
24a80 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20  EADONLY : 0);.  
24a90 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
24aa0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
24ab0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ==0 );.    if( r
24ac0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24ad0 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
24ae0 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
24af0 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ta);.    }.  }..
24b00 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e    *pPgnoNext = n
24b10 65 78 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67  ext;.  if( ppPag
24b20 65 20 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65  e ){.    *ppPage
24b30 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73   = pPage;.  }els
24b40 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  e{.    releasePa
24b50 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
24b60 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c   return (rc==SQL
24b70 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54  ITE_DONE ? SQLIT
24b80 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f  E_OK : rc);.}../
24b90 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
24ba0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
24bb0 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
24bc0 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
24bd0 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
24be0 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
24bf0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
24c00 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
24c10 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
24c20 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
24c30 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
24c40 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
24c50 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
24c60 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
24c70 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
24c80 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
24c90 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
24ca0 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
24cb0 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
24cc0 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
24cd0 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
24ce0 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
24cf0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
24d00 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
24d10 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
24d20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
24d30 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
24d40 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
24d50 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
24d60 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
24d70 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
24d80 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
24d90 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
24da0 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
24db0 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
24dc0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24dd0 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
24de0 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
24df0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24e00 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
24e10 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
24e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24e30 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
24e40 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
24e50 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
24e60 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
24e70 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
24e80 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
24e90 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
24ea0 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
24eb0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
24ec0 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
24ed0 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
24ee0 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
24ef0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
24f00 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
24f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
24f30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
24f40 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
24f50 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
24f60 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24f70 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
24f80 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
24f90 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
24fa0 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
24fb0 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
24fc0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
24fd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24ff0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
25000 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
25010 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
25020 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
25030 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
25040 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
25050 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
25060 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d  The eOp.** argum
25070 65 6e 74 20 69 73 20 69 6e 74 65 72 70 72 65 74  ent is interpret
25080 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
25090 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70  *.**   0: The op
250a0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
250b0 64 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  d. Populate the 
250c0 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a  overflow cache..
250d0 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72  **   1: The oper
250e0 61 74 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65  ation is a write
250f0 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  . Populate the o
25100 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
25110 2a 20 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61  *   2: The opera
25120 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20  tion is a read. 
25130 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20  Do not populate 
25140 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63  the overflow cac
25150 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  he..**.** A tota
25160 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
25170 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
25180 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
25190 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
251a0 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
251b0 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
251c0 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
251d0 65 20 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20  e content being 
251e0 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
251f0 6d 69 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20  might appear on 
25200 74 68 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a  the main page.**
25210 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
25220 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
25230 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
25240 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
25250 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
25260 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d  ry uses one or m
25270 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
25280 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f  es and the.** eO
25290 70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  p argument is no
252a0 74 20 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69  t 2, this functi
252b0 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20  on may allocate 
252c0 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61  space for and la
252d0 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74  zily .** populat
252e0 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  es the overflow 
252f0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
25300 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e  array (BtCursor.
25310 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20  aOverflow). .** 
25320 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  Subsequent calls
25330 20 75 73 65 20 74 68 69 73 20 63 61 63 68 65 20   use this cache 
25340 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
25350 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
25360 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20  offset .** more 
25370 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
25380 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
25390 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
253a0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
253b0 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
253c0 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
253d0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
253e0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
253f0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
25400 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
25410 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
25420 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
25430 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
25440 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
25450 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
25460 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
25470 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
25480 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
25490 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
254a0 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
254b0 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
254c0 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
254d0 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
254e0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
254f0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
25500 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
25510 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
25520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25530 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
25540 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
25550 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
25560 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
25570 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
25580 2f 0a 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20  /.  u32 offset, 
25590 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
255a0 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
255b0 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
255c0 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20  */.  u32 amt,   
255d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
255e0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
255f0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
25600 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
25610 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
25620 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
25630 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20  */ .  int eOp   
25640 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65             /* ze
25650 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d  ro to read. non-
25660 7a 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a  zero to write. *
25670 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
25680 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
25690 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
256a0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78  E_OK;.  int iIdx
256b0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
256c0 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
256d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
256e0 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67  e]; /* Btree pag
256f0 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74  e of current ent
25700 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
25710 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
25720 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
25730 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69      /* Btree thi
25740 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73  s cursor belongs
25750 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   to */.#ifdef SQ
25760 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52  LITE_DIRECT_OVER
25770 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69  FLOW_READ.  unsi
25780 67 6e 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73  gned char * cons
25790 74 20 70 42 75 66 53 74 61 72 74 20 3d 20 70 42  t pBufStart = pB
257a0 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20  uf;.  int bEnd; 
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257d0 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 69  /* True if readi
257e0 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74  ng to end of dat
257f0 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61  a */.#endif..  a
25800 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
25810 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
25820 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
25830 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
25840 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
25850 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
25860 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
25870 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
25880 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
25890 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
258a0 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20  || offset==0 ); 
258b0 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61     /* Always sta
258c0 72 74 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e  rt from beginnin
258d0 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a  g for eOp==2 */.
258e0 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
258f0 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cur);.  aPayload
25900 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50   = pCur->info.pP
25910 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53  ayload;.#ifdef S
25920 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
25930 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e  RFLOW_READ.  bEn
25940 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d  d = offset+amt==
25950 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
25960 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  oad;.#endif.  as
25970 73 65 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74  sert( offset+amt
25980 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   <= pCur->info.n
25990 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 61 73  Payload );..  as
259a0 73 65 72 74 28 20 61 50 61 79 6c 6f 61 64 20 3e  sert( aPayload >
259b0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b   pPage->aData );
259c0 0a 20 20 69 66 28 20 28 75 70 74 72 29 28 61 50  .  if( (uptr)(aP
259d0 61 79 6c 6f 61 64 20 2d 20 70 50 61 67 65 2d 3e  ayload - pPage->
259e0 61 44 61 74 61 29 20 3e 20 28 70 42 74 2d 3e 75  aData) > (pBt->u
259f0 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 43 75 72  sableSize - pCur
25a00 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 29 20 29  ->info.nLocal) )
25a10 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20  {.    /* Trying 
25a20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
25a30 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
25a40 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20   the data is an 
25a50 65 72 72 6f 72 2e 20 20 54 68 65 0a 20 20 20 20  error.  The.    
25a60 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  ** conditional a
25a70 62 6f 76 65 20 69 73 20 72 65 61 6c 6c 79 3a 0a  bove is really:.
25a80 20 20 20 20 2a 2a 20 20 20 20 26 61 50 61 79 6c      **    &aPayl
25a90 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
25aa0 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d  Local] > &pPage-
25ab0 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62  >aData[pBt->usab
25ac0 6c 65 53 69 7a 65 5d 0a 20 20 20 20 2a 2a 20 62  leSize].    ** b
25ad0 75 74 20 69 73 20 72 65 63 61 73 74 20 69 6e 74  ut is recast int
25ae0 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 66 6f  o its current fo
25af0 72 6d 20 74 6f 20 61 76 6f 69 64 20 69 6e 74 65  rm to avoid inte
25b00 67 65 72 20 6f 76 65 72 66 6c 6f 77 20 70 72 6f  ger overflow pro
25b10 62 6c 65 6d 73 0a 20 20 20 20 2a 2f 0a 20 20 20  blems.    */.   
25b20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25b30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25b40 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
25b50 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
25b60 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
25b70 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
25b80 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
25b90 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
25ba0 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
25bb0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
25bc0 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
25bd0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25be0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
25bf0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25c00 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
25c10 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
25c20 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
25c30 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
25c40 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20  , (eOp & 0x01), 
25c50 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
25c60 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
25c70 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
25c80 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
25c90 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
25ca0 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
25cb0 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20  nLocal;.  }...  
25cc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25cd0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
25ce0 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
25cf0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
25d00 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
25d10 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
25d20 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
25d30 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
25d40 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
25d50 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
25d60 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
25d70 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f  nLocal]);..    /
25d80 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
25d90 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61  r.aOverflow[] ha
25da0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
25db0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
25dc0 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78  t now..    ** Ex
25dd0 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  cept, do not all
25de0 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b  ocate aOverflow[
25df0 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20  ] for eOp==2..  
25e00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
25e10 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
25e20 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e  y is sized at on
25e30 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
25e40 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
25e50 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65     ** in the ove
25e60 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
25e70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25e80 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
25e90 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a  ow page is.    *
25ea0 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  * stored in aOve
25eb0 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41  rflow[0], etc. A
25ec0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
25ed0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
25ee0 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e  rray.    ** mean
25ef0 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
25f00 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  " (the cache is 
25f10 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
25f20 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
25f30 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75  ( eOp!=2 && (pCu
25f40 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
25f50 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
25f60 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
25f70 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
25f80 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
25f90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
25fa0 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
25fb0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  e;.      if( nOv
25fc0 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c  fl>pCur->nOvflAl
25fd0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50  loc ){.        P
25fe0 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e  gno *aNew = (Pgn
25ff0 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  o*)sqlite3Reallo
26000 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
26010 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
26020 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
26030 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
26040 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
26050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
26060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
26070 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EM_BKPT;.       
26080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
26090 20 20 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c    pCur->nOvflAll
260a0 6f 63 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20  oc = nOvfl*2;.  
260b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
260c0 76 65 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a  verflow = aNew;.
260d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
260e0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
260f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26100 20 20 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72       memset(pCur
26110 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20  ->aOverflow, 0, 
26120 6e 4f 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e  nOvfl*sizeof(Pgn
26130 6f 29 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  o));.        pCu
26140 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
26150 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20  TCF_ValidOvfl;. 
26160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26170 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
26180 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
26190 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
261a0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
261b0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
261c0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
261d0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
261e0 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
261f0 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
26200 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
26210 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
26220 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
26230 6c 69 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20  lidOvfl)!=0.    
26240 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
26250 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53  low[offset/ovflS
26260 69 7a 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20  ize].    ){.    
26270 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74    iIdx = (offset
26280 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  /ovflSize);.    
26290 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
262a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
262b0 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  x];.      offset
262c0 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53   = (offset%ovflS
262d0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ize);.    }..   
262e0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
262f0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
26300 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
26310 2b 2b 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ++){..      /* I
26320 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75  f required, popu
26330 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  late the overflo
26340 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
26350 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
26360 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
26370 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
26380 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f  assert( pCur->aO
263a0 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30  verflow[iIdx]==0
263b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
263c0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
263d0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
263e0 61 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  age.            
263f0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
26400 42 20 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75  B );.        pCu
26410 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26420 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20  x] = nextPage;. 
26430 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
26440 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69  ( offset>=ovflSi
26450 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ze ){.        /*
26460 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e   The only reason
26470 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
26480 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20  ge is to obtain 
26490 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
264a0 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74   ** number for t
264b0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
264c0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
264d0 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20  in. The page.   
264e0 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20       ** data is 
264f0 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f  not required. So
26500 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f   first try to lo
26510 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f  okup the overflo
26520 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  w.        ** pag
26530 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66  e-list cache, if
26540 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20   any, then fall 
26550 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f  back to the getO
26560 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20  verflowPage().  
26570 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
26580 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  n..        **.  
26590 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
265a0 61 74 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77  at the aOverflow
265b0 5b 5d 20 61 72 72 61 79 20 6d 75 73 74 20 62 65  [] array must be
265c0 20 61 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75   allocated becau
265d0 73 65 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20  se eOp!=2.      
265e0 20 20 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65    ** here.  If e
265f0 4f 70 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73  Op==2, then offs
26600 65 74 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62  et==0 and this b
26610 72 61 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74  ranch is never t
26620 61 6b 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aken..        */
26630 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26640 20 65 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20   eOp!=2 );.     
26650 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
26660 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
26670 5f 56 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20  _ValidOvfl );.  
26680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26690 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d  ur->pBtree->db==
266a0 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20  pBt->db );.     
266b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
266c0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
266d0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
266e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
266f0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
26700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26710 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
26720 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
26730 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
26740 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
26750 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66      }.        of
26760 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65  fset -= ovflSize
26770 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26780 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74         /* Need t
26790 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
267a0 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f   properly. It co
267b0 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74  ntains some of t
267c0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61  he.        ** ra
267d0 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68 61 74  nge of data that
267e0 20 69 73 20 62 65 69 6e 67 20 72 65 61 64 20 28   is being read (
267f0 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74  eOp==0) or writt
26800 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20  en (eOp!=0)..   
26810 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53       */.#ifdef S
26820 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26830 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
26840 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20     sqlite3_file 
26850 2a 66 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *fd;.#endif.    
26860 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
26870 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 20 2b  .        if( a +
26880 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69   offset > ovflSi
26890 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
268a0 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f  a = ovflSize - o
268b0 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
268c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
268d0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
268e0 52 45 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20  READ.        /* 
268f0 49 66 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f  If all the follo
26900 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
26910 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26920 20 20 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69    **   1) this i
26930 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
26940 6f 6e 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20  on, and .       
26950 20 2a 2a 20 20 20 32 29 20 64 61 74 61 20 69 73   **   2) data is
26960 20 72 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74   required from t
26970 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73  he start of this
26980 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
26990 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
269a0 20 33 29 20 74 68 65 20 64 61 74 61 62 61 73 65   3) the database
269b0 20 69 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c   is file-backed,
269c0 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
269d0 20 20 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f    4) there is no
269e0 20 6f 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e   open write-tran
269f0 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20  saction, and.   
26a00 20 20 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65       **   5) the
26a10 20 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74   database is not
26a20 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
26a30 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29  .        **   6)
26a40 20 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74   all data from t
26a50 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
26a60 20 72 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a   read..        *
26a70 2a 20 20 20 37 29 20 61 74 20 6c 65 61 73 74 20  *   7) at least 
26a80 34 20 62 79 74 65 73 20 68 61 76 65 20 61 6c 72  4 bytes have alr
26a90 65 61 64 79 20 62 65 65 6e 20 72 65 61 64 20 69  eady been read i
26aa0 6e 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62  nto the output b
26ab0 75 66 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a  uffer .        *
26ac0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  *.        ** the
26ad0 6e 20 64 61 74 61 20 63 61 6e 20 62 65 20 72 65  n data can be re
26ae0 61 64 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d  ad directly from
26af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26b00 6c 65 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  le into the.    
26b10 20 20 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75      ** output bu
26b20 66 66 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20  ffer, bypassing 
26b30 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
26b40 6c 74 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20  ltogether. This 
26b50 73 70 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a  speeds.        *
26b60 2a 20 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72  * up loading lar
26b70 67 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20  ge records that 
26b80 73 70 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c  span many overfl
26b90 6f 77 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20  ow pages..      
26ba0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
26bb0 20 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20   (eOp&0x01)==0  
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26be0 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20      /* (1) */.  
26bf0 20 20 20 20 20 20 20 26 26 20 6f 66 66 73 65 74         && offset
26c00 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c30 28 32 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (2) */.         
26c40 26 26 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f  && (bEnd || a==o
26c50 76 66 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20  vflSize)        
26c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c70 20 20 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a        /* (6) */.
26c80 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
26c90 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
26ca0 54 52 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20  TRANS_READ      
26cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26cc0 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (4) */.       
26cd0 20 20 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74    && (fd = sqlit
26ce0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d  e3PagerFile(pBt-
26cf0 3e 70 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68  >pPager))->pMeth
26d00 6f 64 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a  ods     /* (3) *
26d10 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 30 3d  /.         && 0=
26d20 3d 73 71 6c 69 74 65 33 50 61 67 65 72 55 73 65  =sqlite3PagerUse
26d30 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72 29  Wal(pBt->pPager)
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d50 20 2f 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20   /* (5) */.     
26d60 20 20 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d      && &pBuf[-4]
26d70 3e 3d 70 42 75 66 53 74 61 72 74 20 20 20 20 20  >=pBufStart     
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29            /* (7)
26da0 20 2a 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20   */.        ){. 
26db0 20 20 20 20 20 20 20 20 20 75 38 20 61 53 61 76           u8 aSav
26dc0 65 5b 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  e[4];.          
26dd0 75 38 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42  u8 *aWrite = &pB
26de0 75 66 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20  uf[-4];.        
26df0 20 20 61 73 73 65 72 74 28 20 61 57 72 69 74 65    assert( aWrite
26e00 3e 3d 70 42 75 66 53 74 61 72 74 20 29 3b 20 20  >=pBufStart );  
26e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e20 20 20 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20         /* hence 
26e30 28 37 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (7) */.         
26e40 20 6d 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61   memcpy(aSave, a
26e50 57 72 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20  Write, 4);.     
26e60 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26e70 33 4f 73 52 65 61 64 28 66 64 2c 20 61 57 72 69  3OsRead(fd, aWri
26e80 74 65 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42  te, a+4, (i64)pB
26e90 74 2d 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78  t->pageSize*(nex
26ea0 74 50 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20  tPage-1));.     
26eb0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
26ec0 67 65 74 34 62 79 74 65 28 61 57 72 69 74 65 29  get4byte(aWrite)
26ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
26ee0 70 79 28 61 57 72 69 74 65 2c 20 61 53 61 76 65  py(aWrite, aSave
26ef0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 4);.        }e
26f00 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  lse.#endif..    
26f10 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
26f20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
26f30 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26f40 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
26f50 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78  pBt->pPager, nex
26f60 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c  tPage, &pDbPage,
26f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  .              (
26f80 28 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20  (eOp&0x01)==0 ? 
26f90 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
26fa0 4c 59 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20  LY : 0).        
26fb0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
26fc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
26fd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26fe0 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74  aPayload = sqlit
26ff0 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
27000 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
27010 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
27020 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
27030 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
27040 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
27050 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
27060 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28  t+4], pBuf, a, (
27070 65 4f 70 26 30 78 30 31 29 2c 20 70 44 62 50 61  eOp&0x01), pDbPa
27080 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
27090 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
270a0 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
270b0 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20           offset 
270c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
270d0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
270e0 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20     amt -= a;.   
270f0 20 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a       pBuf += a;.
27100 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
27110 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
27120 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20  ITE_OK && amt>0 
27130 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
27140 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
27150 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
27160 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
27170 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 70 61  d part of the pa
27180 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 72 6f  yload for the ro
27190 77 20 61 74 20 77 68 69 63 68 20 74 68 61 74 20  w at which that 
271a0 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20 63  cursor pCur is c
271b0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
271c0 74 69 6e 67 2e 20 20 22 61 6d 74 22 20 62 79 74  ting.  "amt" byt
271d0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
271e0 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66  ferred into pBuf
271f0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
27200 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
27210 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 70  offset"..**.** p
27220 43 75 72 20 63 61 6e 20 62 65 20 70 6f 69 6e 74  Cur can be point
27230 69 6e 67 20 74 6f 20 65 69 74 68 65 72 20 61 20  ing to either a 
27240 74 61 62 6c 65 20 6f 72 20 61 6e 20 69 6e 64 65  table or an inde
27250 78 20 62 2d 74 72 65 65 2e 0a 2a 2a 20 49 66 20  x b-tree..** If 
27260 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 74 61  pointing to a ta
27270 62 6c 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ble btree, then 
27280 74 68 65 20 63 6f 6e 74 65 6e 74 20 73 65 63 74  the content sect
27290 69 6f 6e 20 69 73 20 72 65 61 64 2e 20 20 49 66  ion is read.  If
272a0 0a 2a 2a 20 70 43 75 72 20 69 73 20 70 6f 69 6e  .** pCur is poin
272b0 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65 78  ting to an index
272c0 20 62 2d 74 72 65 65 20 74 68 65 6e 20 74 68 65   b-tree then the
272d0 20 6b 65 79 20 73 65 63 74 69 6f 6e 20 69 73 20   key section is 
272e0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  read..**.** For 
272f0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27300 6f 61 64 28 29 2c 20 74 68 65 20 63 61 6c 6c 65  oad(), the calle
27310 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
27320 61 74 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  at pCur is point
27330 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69  ing.** to a vali
27340 64 20 72 6f 77 20 69 6e 20 74 68 65 20 74 61 62  d row in the tab
27350 6c 65 2e 20 20 46 6f 72 20 73 71 6c 69 74 65 33  le.  For sqlite3
27360 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65 63  BtreePayloadChec
27370 6b 65 64 28 29 2c 20 74 68 65 0a 2a 2a 20 63 75  ked(), the.** cu
27380 72 73 6f 72 20 6d 69 67 68 74 20 62 65 20 69 6e  rsor might be in
27390 76 61 6c 69 64 20 6f 72 20 6d 69 67 68 74 20 6e  valid or might n
273a0 65 65 64 20 74 6f 20 62 65 20 72 65 73 74 6f 72  eed to be restor
273b0 65 64 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20  ed before being 
273c0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  read..**.** Retu
273d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
273e0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
273f0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
27400 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
27410 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
27420 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
27430 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
27440 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
27450 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
27460 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
27470 33 42 74 72 65 65 50 61 79 6c 6f 61 64 28 42 74  3BtreePayload(Bt
27480 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
27490 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
274a0 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
274b0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
274c0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
274d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
274e0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
274f0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
27500 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
27510 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
27520 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27530 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
27540 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
27550 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70  >iPage]<pCur->ap
27560 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27570 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65  ]->nCell );.  re
27580 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  turn accessPaylo
27590 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c  ad(pCur, offset,
275a0 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20   amt, (unsigned 
275b0 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a  char*)pBuf, 0);.
275c0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
275d0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 69  _OMIT_INCRBLOB.i
275e0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
275f0 61 79 6c 6f 61 64 43 68 65 63 6b 65 64 28 42 74  ayloadChecked(Bt
27600 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
27610 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d  2 offset, u32 am
27620 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a  t, void *pBuf){.
27630 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 20 28    int rc;.  if (
27640 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27650 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
27660 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27670 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 20 20  TE_ABORT;.  }.  
27680 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
27690 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
276a0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
276b0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
276c0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
276d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
276e0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
276f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27700 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
27710 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
27720 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50  >=0 && pCur->apP
27730 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
27740 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27750 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
27760 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
27770 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27780 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  e]->nCell );.   
27790 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
277a0 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
277b0 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30 29 3b  , amt, pBuf, 0);
277c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
277d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
277e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
277f0 4f 42 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OB */../*.** Ret
27800 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27810 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
27820 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
27830 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
27840 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
27850 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
27860 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
27870 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
27880 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
27890 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
278a0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
278b0 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
278c0 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
278d0 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
278e0 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
278f0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
27900 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
27910 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
27920 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
27930 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
27940 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
27950 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
27960 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
27970 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27980 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
27990 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
279a0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
279b0 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
279c0 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
279d0 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
279e0 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
279f0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
27a00 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
27a10 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
27a20 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
27a30 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
27a40 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
27a50 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
27a60 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
27a70 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
27a80 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
27a90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
27aa0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
27ab0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
27ac0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
27ad0 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
27ae0 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
27af0 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
27b00 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
27b10 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
27b20 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
27b30 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
27b40 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
27b50 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
27b60 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
27b70 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
27b80 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
27b90 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
27ba0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
27bb0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
27bc0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
27bd0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
27be0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
27bf0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
27c00 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
27c10 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
27c20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
27c30 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
27c40 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
27c50 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
27c60 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
27c70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27c80 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
27c90 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
27ca0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27cb0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
27cc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27cd0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
27ce0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
27cf0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
27d00 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
27d10 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27d20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
27d30 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
27d40 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
27d50 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27d60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27d70 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
27d80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27d90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
27da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27db0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27dc0 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
27dd0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
27de0 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
27df0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27e00 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27e10 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27e20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
27e30 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
27e40 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
27e50 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
27e60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27e70 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
27e80 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
27e90 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
27ea0 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
27eb0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
27ec0 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
27ed0 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
27ee0 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
27ef0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
27f00 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
27f10 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
27f20 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
27f30 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
27f40 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
27f50 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
27f60 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
27f70 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
27f80 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
27f90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
27fa0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
27fb0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
27fc0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
27fd0 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
27fe0 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
27ff0 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
28000 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
28010 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
28020 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
28030 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
28040 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
28050 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
28060 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
28070 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
28080 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
28090 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
280a0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
280b0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
280c0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
280d0 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
280e0 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
280f0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
28100 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
28110 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
28120 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
28130 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
28140 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
28150 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 46  te3BtreePayloadF
28160 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
28170 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
28180 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
28190 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
281a0 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
281b0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
281c0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
281d0 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
281e0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
281f0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
28200 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
28210 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
28220 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28230 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28240 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
28250 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
28260 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
28270 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
28280 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
28290 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
282a0 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
282b0 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
282c0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
282d0 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
282e0 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
282f0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
28300 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
28310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28320 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
28330 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
28340 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
28350 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
28360 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
28370 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28380 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
28390 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
283a0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
283b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
283c0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
283d0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
283e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
283f0 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28  Page>=0 );.  if(
28400 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42   pCur->iPage>=(B
28410 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54  TCURSOR_MAX_DEPT
28420 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75  H-1) ){.    retu
28430 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
28440 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43  T_BKPT;.  }.  pC
28450 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
28460 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
28470 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
28480 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
28490 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72  lidOvfl);.  pCur
284a0 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75  ->iPage++;.  pCu
284b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
284c0 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74  Page] = 0;.  ret
284d0 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61  urn getAndInitPa
284e0 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c  ge(pBt, newPgno,
284f0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70   &pCur->apPage[p
28500 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20  Cur->iPage],.   
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28520 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d       pCur, pCur-
28530 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b  >curPagerFlags);
28540 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
28550 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20  EBUG./*.** Page 
28560 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e  pParent is an in
28570 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66  ternal (non-leaf
28580 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69  ) tree page. Thi
28590 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61  s function .** a
285a0 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65  sserts that page
285b0 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69   number iChild i
285c0 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64  s the left-child
285d0 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a   if the iIdx'th.
285e0 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20  ** cell in page 
285f0 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20  pParent. Or, if 
28600 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f  iIdx is equal to
28610 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
28620 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e  r of.** cells in
28630 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70   pParent, that p
28640 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c  age number iChil
28650 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63  d is the right-c
28660 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70  hild of.** the p
28670 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
28680 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74  oid assertParent
28690 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70  Index(MemPage *p
286a0 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78  Parent, int iIdx
286b0 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a  , Pgno iChild){.
286c0 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
286d0 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
286e0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65  he conditions te
286f0 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74  sted below might
28700 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20   not be true.   
28710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28720 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61           ** in a
28730 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
28740 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  e */.  assert( i
28750 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Idx<=pParent->nC
28760 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64  ell );.  if( iId
28770 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x==pParent->nCel
28780 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  l ){.    assert(
28790 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
287a0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
287b0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
287c0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65  ==iChild );.  }e
287d0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
287e0 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65   get4byte(findCe
287f0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78  ll(pParent, iIdx
28800 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20  ))==iChild );.  
28810 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66  }.}.#else.#  def
28820 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74  ine assertParent
28830 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65  Index(x,y,z) .#e
28840 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ndif../*.** Move
28850 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74   the cursor up t
28860 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  o the parent pag
28870 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69  e..**.** pCur->i
28880 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  dx is set to the
28890 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74   cell index that
288a0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f   contains the po
288b0 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
288c0 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69  page we are comi
288d0 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20  ng from.  If we 
288e0 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20  are coming from 
288f0 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73  the.** right-mos
28900 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65  t child page the
28910 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  n pCur->idx is s
28920 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74  et to one more t
28930 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65  han.** the large
28940 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a  st cell index..*
28950 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f  /.static void mo
28960 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72  veToParent(BtCur
28970 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
28980 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28990 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
289a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
289b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
289c0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
289d0 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
289e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
289f0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28a00 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
28a10 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
28a20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
28a30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
28a40 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  , .    pCur->aiI
28a50 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  dx[pCur->iPage-1
28a60 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70  ], .    pCur->ap
28a70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
28a80 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74  ]->pgno.  );.  t
28a90 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61  estcase( pCur->a
28aa0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
28ab0 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61  -1] > pCur->apPa
28ac0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
28ad0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43  ]->nCell );.  pC
28ae0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
28af0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
28b00 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
28b10 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
28b20 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65  lidOvfl);.  rele
28b30 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
28b40 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28b50 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a  ->iPage--]);.}..
28b60 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
28b70 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
28b80 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  o the root page 
28b90 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74  of its b-tree st
28ba0 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49  ructure..**.** I
28bb0 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20  f the table has 
28bc0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
28bd0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75  age, then the cu
28be0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
28bf0 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65   point.** to the
28c00 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28c10 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ge instead of th
28c20 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61  e actual root pa
28c30 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20  ge. A table has 
28c40 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  a.** virtual roo
28c50 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20  t page when the 
28c60 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  actual root page
28c70 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
28c80 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e  ls and a .** sin
28c90 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20  gle child page. 
28ca0 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
28cb0 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61  ppen with the ta
28cc0 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61  ble rooted at pa
28cd0 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ge 1..**.** If t
28ce0 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  he b-tree struct
28cf0 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  ure is empty, th
28d00 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69  e cursor state i
28d10 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52  s set to .** CUR
28d20 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68  SOR_INVALID. Oth
28d30 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73  erwise, the curs
28d40 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  or is set to poi
28d50 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  nt to the first.
28d60 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20  ** cell located 
28d70 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20  on the root (or 
28d80 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61  virtual root) pa
28d90 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ge and the curso
28da0 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65  r state.** is se
28db0 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49  t to CURSOR_VALI
28dc0 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  D..**.** If this
28dd0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
28de0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
28df0 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  it may be assume
28e00 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61  d that the.** pa
28e10 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20  ge-header flags 
28e20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
28e30 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74  e [virtual] root
28e40 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70  -page is the exp
28e50 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f  ected .** kind o
28e60 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69  f b-tree page (i
28e70 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e  .e. if when open
28e80 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74  ing the cursor t
28e90 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f  he caller did no
28ea0 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b  t.** specify a K
28eb0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
28ec0 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20   the flags byte 
28ed0 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f  is set to 0x05 o
28ee0 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63  r 0x0D,.** indic
28ef0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d  ating a table b-
28f00 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20  tree, or if the 
28f10 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69  caller did speci
28f20 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a  fy a KeyInfo .**
28f30 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66   structure the f
28f40 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74  lags byte is set
28f50 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41   to 0x02 or 0x0A
28f60 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20  , indicating an 
28f70 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29  index.** b-tree)
28f80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28f90 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72  moveToRoot(BtCur
28fa0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65  sor *pCur){.  Me
28fb0 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20  mPage *pRoot;.  
28fc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
28fd0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  OK;..  assert( c
28fe0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
28ff0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
29000 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41  ert( CURSOR_INVA
29010 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  LID < CURSOR_REQ
29020 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
29030 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c  sert( CURSOR_VAL
29040 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45  ID   < CURSOR_RE
29050 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
29060 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41  ssert( CURSOR_FA
29070 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52  ULT   > CURSOR_R
29080 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
29090 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
290a0 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  >=CURSOR_REQUIRE
290b0 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  SEEK ){.    if( 
290c0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
290d0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
290e0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
290f0 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49  ->skipNext!=SQLI
29100 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
29110 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
29120 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
29130 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
29140 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
29150 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
29160 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
29170 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 20  if( pCur->iPage 
29180 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
29190 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
291a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
291b0 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20  iPage]!=0 );.   
291c0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
291d0 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70  NotNull(pCur->ap
291e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
291f0 2d 2d 5d 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  --]);.      }whi
29200 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67 65 29  le( pCur->iPage)
29210 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 6b 69  ;.      goto ski
29220 70 5f 69 6e 69 74 3b 0a 20 20 20 20 7d 0a 20 20  p_init;.    }.  
29230 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72 2d 3e  }else if( pCur->
29240 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20  pgnoRoot==0 ){. 
29250 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
29260 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
29270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
29280 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
29290 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
292a0 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29 20 29  r->iPage==(-1) )
292b0 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e  ;.    rc = getAn
292c0 64 49 6e 69 74 50 61 67 65 28 70 43 75 72 2d 3e  dInitPage(pCur->
292d0 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70 43 75  pBtree->pBt, pCu
292e0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43  r->pgnoRoot, &pC
292f0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20  ur->apPage[0],. 
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29310 20 20 20 20 20 20 20 30 2c 20 70 43 75 72 2d 3e         0, pCur->
29320 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
29330 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
29350 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
29360 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
29370 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
29380 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
29390 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 70  iPage = 0;.    p
293a0 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 3d  Cur->curIntKey =
293b0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
293c0 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20 20  ->intKey;.  }.  
293d0 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
293e0 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
293f0 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
29400 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
29410 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72 2d  ;..  /* If pCur-
29420 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f 74  >pKeyInfo is not
29430 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20   NULL, then the 
29440 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65 6e  caller that open
29450 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a 20  ed this cursor. 
29460 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f 20   ** expected to 
29470 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69 6e  open it on an in
29480 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68 65  dex b-tree. Othe
29490 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49 6e  rwise, if pKeyIn
294a0 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c  fo is.  ** NULL,
294b0 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70 65   the caller expe
294c0 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74 72  cts a table b-tr
294d0 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e  ee. If this is n
294e0 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20 2a  ot the case,.  *
294f0 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 49  * return an SQLI
29500 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72  TE_CORRUPT error
29510 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 72  . .  **.  ** Ear
29520 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
29530 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64 20   SQLite assumed 
29540 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20 63  that this test c
29550 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20 20  ould not fail.  
29560 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20 70  ** if the root p
29570 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79 20  age was already 
29580 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69 73  loaded when this
29590 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 61   function was ca
295a0 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a 20  lled (i.e..  ** 
295b0 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d  if pCur->iPage>=
295c0 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73 20  0). But this is 
295d0 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64 61  not so if the da
295e0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
295f0 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75 63  ted .  ** in suc
29600 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61 67  h a way that pag
29610 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b 65  e pRoot is linke
29620 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64 20  d into a second 
29630 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20 20  b-tree table .  
29640 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65 6c  ** (or the freel
29650 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ist).  */.  asse
29660 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  rt( pRoot->intKe
29670 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69  y==1 || pRoot->i
29680 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69 66  ntKey==0 );.  if
29690 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d  ( pRoot->isInit=
296a0 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b 65  =0 || (pCur->pKe
296b0 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74  yInfo==0)!=pRoot
296c0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
296d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
296e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
296f0 0a 73 6b 69 70 5f 69 6e 69 74 3a 20 20 0a 20 20  .skip_init:  .  
29700 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
29710 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
29720 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
29730 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
29740 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
29750 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
29760 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20  F_ValidOvfl);.. 
29770 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
29780 70 50 61 67 65 5b 30 5d 3b 0a 20 20 69 66 28 20  pPage[0];.  if( 
29790 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pRoot->nCell>0 )
297a0 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
297b0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
297c0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  D;.  }else if( !
297d0 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20  pRoot->leaf ){. 
297e0 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b     Pgno subpage;
297f0 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  .    if( pRoot->
29800 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72 6e  pgno!=1 ) return
29810 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29820 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61 67  BKPT;.    subpag
29830 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
29840 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
29850 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
29860 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
29870 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
29880 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
29890 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75 62  oChild(pCur, sub
298a0 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  page);.  }else{.
298b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
298c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
298d0 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  D;.  }.  return 
298e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
298f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
29900 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
29910 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
29920 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
29930 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
29940 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
29950 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
29960 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
29970 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
29980 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
29990 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
299a0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
299b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
299c0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
299d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
299e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
299f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
29a00 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
29a10 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
29a20 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
29a30 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
29a40 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
29a50 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
29a60 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63  D );.  while( rc
29a70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
29a80 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  (pPage = pCur->a
29a90 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29aa0 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  e])->leaf ){.   
29ab0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29ac0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
29ad0 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
29ae0 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74  ;.    pgno = get
29af0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
29b00 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49 64  Page, pCur->aiId
29b10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 29  x[pCur->iPage]))
29b20 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
29b30 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e  oChild(pCur, pgn
29b40 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
29b50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
29b60 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
29b70 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  wn to the right-
29b80 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20  most leaf entry 
29b90 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70  beneath the.** p
29ba0 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74 20  age to which it 
29bb0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
29bc0 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74  nting.  Notice t
29bd0 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a  he difference.**
29be0 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c   between moveToL
29bf0 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f  eftmost() and mo
29c00 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e  veToRightmost().
29c10 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74    moveToLeftmost
29c20 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20  ().** finds the 
29c30 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20  left-most entry 
29c40 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74  beneath the *ent
29c50 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65  ry* whereas move
29c60 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a  ToRightmost().**
29c70 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68 74   finds the right
29c80 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65  -most entry bene
29c90 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a  ath the *page*..
29ca0 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d  **.** The right-
29cb0 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74 68  most entry is th
29cc0 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c  e one with the l
29cd0 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65  argest key - the
29ce0 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20   last.** key in 
29cf0 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  ascending order.
29d00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
29d10 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42  oveToRightmost(B
29d20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
29d30 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69    Pgno pgno;.  i
29d40 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
29d50 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  K;.  MemPage *pP
29d60 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
29d70 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
29d80 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
29d90 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29da0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29db0 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
29dc0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29dd0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29de0 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29df0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
29e00 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
29e10 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29e20 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
29e30 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29e40 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
29e50 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
29e60 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29e70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
29e80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29e90 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
29ea0 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
29eb0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
29ec0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29ed0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
29ee0 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
29ef0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
29f00 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
29f10 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29f20 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
29f30 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29f40 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
29f50 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
29f60 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
29f70 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
29f80 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
29f90 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
29fa0 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
29fb0 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
29fc0 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
29fd0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
29fe0 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
29ff0 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
2a000 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
2a010 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
2a020 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
2a030 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2a040 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2a050 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2a060 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2a070 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2a080 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
2a090 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2a0a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a0b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
2a0c0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a0d0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
2a0e0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a0f0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2a100 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a110 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
2a120 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
2a130 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
2a140 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2a150 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2a160 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2a170 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  >0 );.      *pRe
2a180 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  s = 0;.      rc 
2a190 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
2a1a0 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
2a1b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2a1c0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
2a1d0 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74  rsor to the last
2a1e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
2a1f0 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
2a200 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
2a210 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
2a220 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
2a230 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
2a240 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
2a250 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
2a260 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
2a270 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2a280 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2a290 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Last(BtCursor *p
2a2a0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2a2b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61  .  int rc;. .  a
2a2c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
2a2d0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
2a2e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2a2f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2a300 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
2a310 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
2a320 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2a330 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20 74  already points t
2a340 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2a350 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
2a360 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52 53  p. */.  if( CURS
2a370 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
2a380 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72 2d  eState && (pCur-
2a390 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2a3a0 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a 23  _AtLast)!=0 ){.#
2a3b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2a3c0 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 62  UG.    /* This b
2a3d0 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20 61  lock serves to a
2a3e0 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65  ssert() that the
2a3f0 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20 64   cursor really d
2a400 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20 2a  oes point .    *
2a410 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e  * to the last en
2a420 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72 65  try in the b-tre
2a430 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69  e. */.    int ii
2a440 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
2a450 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  ii<pCur->iPage; 
2a460 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  ii++){.      ass
2a470 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
2a480 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  [ii]==pCur->apPa
2a490 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  ge[ii]->nCell );
2a4a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2a4b0 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
2a4c0 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43 75  Cur->iPage]==pCu
2a4d0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2a4e0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20  iPage]->nCell-1 
2a4f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
2a500 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a510 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20 29  ->iPage]->leaf )
2a520 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
2a530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2a540 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2a550 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2a560 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a570 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
2a580 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
2a590 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
2a5a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a5b0 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2a5c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2a5d0 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
2a5e0 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65  =0 );.      *pRe
2a5f0 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  s = 1;.    }else
2a600 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2a610 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2a620 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2a630 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2a640 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f       rc = moveTo
2a650 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
2a660 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2a670 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a680 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2a690 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61 73  gs |= BTCF_AtLas
2a6a0 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
2a6b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
2a6c0 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
2a6d0 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d 0a  AtLast;.      }.
2a6e0 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20     .    }.  }.  
2a6f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a700 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
2a710 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
2a720 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
2a730 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
2a740 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49 64  specified by pId
2a750 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e 20  xKey or intKey. 
2a760 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63 65    Return a succe
2a770 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46  ss code..**.** F
2a780 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65 73  or INTKEY tables
2a790 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61 72  , the intKey par
2a7a0 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
2a7b0 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75 73   pIdxKey .** mus
2a7c0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
2a7d0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70 49  index tables, pI
2a7e0 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61 6e  dxKey is used an
2a7f0 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20 69  d intKey.** is i
2a800 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  gnored..**.** If
2a810 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20   an exact match 
2a820 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68  is not found, th
2a830 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  en the cursor is
2a840 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20   always.** left 
2a850 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c 65  pointing at a le
2a860 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77 6f  af page which wo
2a870 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e 74  uld hold the ent
2a880 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72 65  ry if it.** were
2a890 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 63   present.  The c
2a8a0 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e  ursor might poin
2a8b0 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74 68  t to an entry th
2a8c0 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f  at comes.** befo
2a8d0 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65 20  re or after the 
2a8e0 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e  key..**.** An in
2a8f0 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65 6e  teger is written
2a900 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69 63   into *pRes whic
2a910 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74 20  h is the result 
2a920 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67 20  of.** comparing 
2a930 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
2a940 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
2a950 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a 2a  the cursor is .*
2a960 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68 65  * pointing.  The
2a970 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20   meaning of the 
2a980 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e 20  integer written 
2a990 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69 73  into.** *pRes is
2a9a0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
2a9b0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20  **     *pRes<0  
2a9c0 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2a9d0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2a9e0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2a9f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2aa00 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20       is smaller 
2aa10 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78  than intKey/pIdx
2aa20 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61  Key or if the ta
2aa30 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20  ble is empty.** 
2aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa50 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20   and the cursor 
2aa60 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66  is therefore lef
2aa70 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69  t point to nothi
2aa80 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ng..**.**     *p
2aa90 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63  Res==0     The c
2aaa0 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2aab0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2aac0 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63              exac
2aae0 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74 4b  tly matches intK
2aaf0 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2ab00 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20 20  *     *pRes>0   
2ab10 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
2ab20 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2ab30 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
2ab40 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2ab50 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74 68      is larger th
2ab60 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  an intKey/pIdxKe
2ab70 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64  y..**.** For ind
2ab80 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20 70  ex tables, the p
2ab90 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20 66  IdxKey->eqSeen f
2aba0 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20 31  ield is set to 1
2abb0 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78 69   if there.** exi
2abc0 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  sts an entry in 
2abd0 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20 65  the table that e
2abe0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 70  xactly matches p
2abf0 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74  IdxKey.  .*/.int
2ac00 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2ac10 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42  etoUnpacked(.  B
2ac20 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
2ac30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2ac40 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65  ursor to be move
2ac50 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
2ac60 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20  ecord *pIdxKey, 
2ac70 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65  /* Unpacked inde
2ac80 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69  x key */.  i64 i
2ac90 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ntKey,          
2aca0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
2acb0 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69   key */.  int bi
2acc0 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20  asRight,        
2acd0 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
2ace0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
2acf0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
2ad00 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
2ad10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ad20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73  Write search res
2ad30 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ults here */.){.
2ad40 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63 6f    int rc;.  Reco
2ad50 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f 72  rdCompare xRecor
2ad60 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73 73  dCompare;..  ass
2ad70 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2ad80 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2ad90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ada0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
2adb0 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
2adc0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
2add0 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61 73  rt( pRes );.  as
2ade0 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d 3d  sert( (pIdxKey==
2adf0 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79 49  0)==(pCur->pKeyI
2ae00 6e 66 6f 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  nfo==0) );.  ass
2ae10 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
2ae20 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2ae30 7c 7c 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d  || (pIdxKey==0)=
2ae40 3d 28 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  =(pCur->curIntKe
2ae50 79 21 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  y!=0) );..  /* I
2ae60 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2ae70 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
2ae80 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
2ae90 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
2aea0 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
2aeb0 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
2aec0 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
2aed0 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
2aee0 70 49 64 78 4b 65 79 3d 3d 30 0a 20 20 20 26 26  pIdxKey==0.   &&
2aef0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2af00 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 28  URSOR_VALID && (
2af10 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2af20 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29   BTCF_ValidNKey)
2af30 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  !=0.  ){.    if(
2af40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2af50 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
2af60 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2af70 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2af80 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
2af90 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  f( (pCur->curFla
2afa0 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
2afb0 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 6e  )!=0 && pCur->in
2afc0 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20 29  fo.nKey<intKey )
2afd0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2afe0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
2aff0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2b000 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 64  }.  }..  if( pId
2b010 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65 63  xKey ){.    xRec
2b020 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71 6c  ordCompare = sql
2b030 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
2b040 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  are(pIdxKey);.  
2b050 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f    pIdxKey->errCo
2b060 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  de = 0;.    asse
2b070 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65 66  rt( pIdxKey->def
2b080 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20 20  ault_rc==1 .    
2b090 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d       || pIdxKey-
2b0a0 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20 0a  >default_rc==0 .
2b0b0 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78           || pIdx
2b0c0 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d  Key->default_rc=
2b0d0 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c  =-1.    );.  }el
2b0e0 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64 43  se{.    xRecordC
2b0f0 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20 41  ompare = 0; /* A
2b100 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74 65  ll keys are inte
2b110 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 72  gers */.  }..  r
2b120 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2b130 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Cur);.  if( rc )
2b140 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2b150 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
2b160 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30  Cur->pgnoRoot==0
2b170 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65   || pCur->apPage
2b180 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
2b190 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2b1a0 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
2b1b0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2b1c0 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e 69  r->iPage]->isIni
2b1d0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
2b1e0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2b1f0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70  SOR_INVALID || p
2b200 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2b210 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e  ->iPage]->nCell>
2b220 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2b230 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2b240 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a  INVALID ){.    *
2b250 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61  pRes = -1;.    a
2b260 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e  ssert( pCur->pgn
2b270 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72  oRoot==0 || pCur
2b280 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2b290 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
2b2a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
2b2b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
2b2c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2b2d0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d 3d  age[0]->intKey==
2b2e0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2b2f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2b300 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20  r->curIntKey || 
2b310 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
2b320 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
2b330 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b 0a  r, upr, idx, c;.
2b340 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
2b350 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2b360 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2b370 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2b380 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 20  .    u8 *pCell; 
2b390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3a0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2b3b0 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 63  ter to current c
2b3c0 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f 0a  ell in pPage */.
2b3d0 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 6e  .    /* pPage->n
2b3e0 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72 65  Cell must be gre
2b3f0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e 20  ater than zero. 
2b400 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
2b410 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20  oot-page.    ** 
2b420 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  the cursor would
2b430 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41 4c   have been INVAL
2b440 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68 69  ID above and thi
2b450 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a 20  s for(;;) loop. 
2b460 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20 49     ** not run. I
2b470 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68  f this is not th
2b480 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68 65  e root-page, the
2b490 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69 6c  n the moveToChil
2b4a0 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  d() routine.    
2b4b0 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61 6c  ** would have al
2b4c0 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20 64  ready detected d
2b4d0 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53 69  b corruption. Si
2b4e0 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20 6d  milarly, pPage m
2b4f0 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74 68  ust.    ** be th
2b500 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69 6e  e right kind (in
2b510 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f 66  dex or table) of
2b520 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f 74   b-tree page. Ot
2b530 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20 61  herwise.    ** a
2b540 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 6f   moveToChild() o
2b550 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20 63  r moveToRoot() c
2b560 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20 64  all would have d
2b570 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74 69  etected corrupti
2b580 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  on.  */.    asse
2b590 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2b5a0 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
2b5b0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d  ( pPage->intKey=
2b5c0 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29 3b  =(pIdxKey==0) );
2b5d0 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
2b5e0 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
2b5f0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73 65  Cell-1;.    asse
2b600 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d 30  rt( biasRight==0
2b610 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d 31   || biasRight==1
2b620 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75 70   );.    idx = up
2b630 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74 29  r>>(1-biasRight)
2b640 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73 52  ; /* idx = biasR
2b650 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c 77  ight ? upr : (lw
2b660 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20 20  r+upr)/2; */.   
2b670 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2b680 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2b690 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78 52  )idx;.    if( xR
2b6a0 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30 20  ecordCompare==0 
2b6b0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29  ){.      for(;;)
2b6c0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e 43  {.        i64 nC
2b6d0 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2b6e0 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2b6f0 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20 69  PastPtr(pPage, i
2b700 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dx);.        if(
2b710 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
2b720 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2b730 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20 2a  while( 0x80 <= *
2b740 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20 20  (pCell++) ){.   
2b750 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43 65           if( pCe
2b760 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  ll>=pPage->aData
2b770 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c  End ) return SQL
2b780 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2b790 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b7a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b7b0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
2b7c0 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
2b7d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
2b7e0 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20 29  CellKey<intKey )
2b7f0 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2b800 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2b810 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29     if( lwr>upr )
2b820 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b  { c = -1; break;
2b830 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
2b840 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69 6e   if( nCellKey>in
2b850 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
2b860 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2b870 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72           if( lwr
2b880 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b 20  >upr ){ c = +1; 
2b890 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20  break; }.       
2b8a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2b8b0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
2b8c0 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20 20  ey==intKey );.  
2b8d0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69          pCur->ai
2b8e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b8f0 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b900 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67         if( !pPag
2b910 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2b920 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2b930 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2b940 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c  to moveto_next_l
2b950 61 79 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  ayer;.          
2b960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2b970 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2b980 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
2b990 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Key;.           
2b9a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2b9b0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
2b9c0 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69           pCur->i
2b9d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2b9e0 20 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73             *pRes
2b9f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2ba00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ba10 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OK;.          }.
2ba20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ba30 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2ba40 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2ba50 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2ba60 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2ba70 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2ba80 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2ba90 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  .      for(;;){.
2baa0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65 6c          int nCel
2bab0 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74  l;  /* Size of t
2bac0 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69 6e  he pCell cell in
2bad0 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20   bytes */.      
2bae0 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2baf0 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2bb00 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20   idx);..        
2bb10 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 73  /* The maximum s
2bb20 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73 69  upported page-si
2bb30 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74 65  ze is 65536 byte
2bb40 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  s. This means th
2bb50 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  at.        ** th
2bb60 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
2bb70 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65 73   of record bytes
2bb80 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69 6e   stored on an in
2bb90 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20 20  dex B-Tree.     
2bba0 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c 65     ** page is le
2bbb0 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62 79  ss than 16384 by
2bbc0 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20 73  tes and may be s
2bbd0 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79 74  tored as a 2-byt
2bbe0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61 72  e.        ** var
2bbf0 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d  int. This inform
2bc00 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ation is used to
2bc10 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f 69   attempt to avoi
2bc20 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20 20  d parsing .     
2bc30 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
2bc40 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69 6e   cell by checkin
2bc50 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73 20  g for the cases 
2bc60 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72 64  where the record
2bc70 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   is .        ** 
2bc80 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79 20  stored entirely 
2bc90 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72 65  within the b-tre
2bca0 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65 63  e page by inspec
2bcb0 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 0a  ting the first .
2bcc0 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79 74          ** 2 byt
2bcd0 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a  es of the cell..
2bce0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2bcf0 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c 6c     nCell = pCell
2bd00 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [0];.        if(
2bd10 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6d   nCell<=pPage->m
2bd20 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 29  ax1bytePayload )
2bd30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
2bd40 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73 20  his branch runs 
2bd50 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73 69  if the record-si
2bd60 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ze field of the 
2bd70 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20 20  cell is a.      
2bd80 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79      ** single by
2bd90 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2bda0 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65 6e  e record fits en
2bdb0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2bdc0 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  in.          ** 
2bdd0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a 2f  b-tree page.  */
2bde0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2bdf0 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c 6c  ase( pCell+nCell
2be00 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74 61  +1==pPage->aData
2be10 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  End );.         
2be20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70   c = xRecordComp
2be30 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69 64  are(nCell, (void
2be40 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49 64  *)&pCell[1], pId
2be50 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
2be60 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c 6c  else if( !(pCell
2be70 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20 20  [1] & 0x80) .   
2be80 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c 6c         && (nCell
2be90 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66 29   = ((nCell&0x7f)
2bea0 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d 29  <<7) + pCell[1])
2beb0 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  <=pPage->maxLoca
2bec0 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  l.        ){.   
2bed0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
2bee0 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2bef0 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72 69  is a 2 byte vari
2bf00 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2bf10 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  d .          ** 
2bf20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2bf30 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65 65   the main b-tree
2bf40 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2bf50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bf60 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70 50  Cell+nCell+2==pP
2bf70 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2bf80 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2bf90 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2bfa0 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2bfb0 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[2], pIdxKey);
2bfc0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2bfd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2bfe0 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f 76   record flows ov
2bff0 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20 6d  er onto one or m
2c000 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ore overflow pag
2c010 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20  es. In.         
2c020 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74 68   ** this case th
2c030 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65 65  e whole cell nee
2c040 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64 2c  ds to be parsed,
2c050 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63 61   a buffer alloca
2c060 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ted.          **
2c070 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c 6f   and accessPaylo
2c080 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65 74  ad() used to ret
2c090 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72 64  rieve the record
2c0a0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
2c0b0 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62 65      ** buffer be
2c0c0 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64 43  fore VdbeRecordC
2c0d0 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65 20  ompare() can be 
2c0e0 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20 20  called. .       
2c0f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20 20     **.          
2c100 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72 64  ** If the record
2c110 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68 65   is corrupt, the
2c120 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2c130 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61 64  routine may read
2c140 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 70  .          ** up
2c150 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73 20   to two varints 
2c160 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
2c170 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20 65  the buffer. An e
2c180 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20 20  xtra 18 .       
2c190 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20 70     ** bytes of p
2c1a0 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63 61  adding is alloca
2c1b0 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ted at the end o
2c1c0 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 0a  f the buffer in.
2c1d0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61 73            ** cas
2c1e0 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e 20  e this happens. 
2c1f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76 6f   */.          vo
2c200 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
2c210 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f 6e          u8 * con
2c220 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20 70  st pCellBody = p
2c230 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63 68  Cell - pPage->ch
2c240 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20  ildPtrSize;.    
2c250 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61        pPage->xPa
2c260 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
2c270 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72 2d  CellBody, &pCur-
2c280 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  >info);.        
2c290 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29 70    nCell = (int)p
2c2a0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a  Cur->info.nKey;.
2c2b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
2c2c0 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20 20  se( nCell<0 );  
2c2d0 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79 20   /* True if key 
2c2e0 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72 20  size is 2^32 or 
2c2f0 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  more */.        
2c300 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2c310 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==0 );  /* Inva
2c320 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2c330 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a 2f  x80 0x80 0x00 */
2c340 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2c350 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29 3b  ase( nCell==1 );
2c360 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2c370 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2c380 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20 20  0 0x01 */.      
2c390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2c3a0 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d 69  ell==2 );  /* Mi
2c3b0 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64 65  nimum legal inde
2c3c0 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20 20  x key size */.  
2c3d0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2c3e0 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  l<2 ){.         
2c3f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2c400 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2c410 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2c420 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2c430 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c440 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71     pCellKey = sq
2c450 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65  lite3Malloc( nCe
2c460 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20 20  ll+18 );.       
2c470 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d     if( pCellKey=
2c480 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c490 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2c4a0 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2c4b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2c4c0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2c4d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c4e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c4f0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c500 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 72  idx;.          r
2c510 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
2c520 64 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  d(pCur, 0, nCell
2c530 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
2c540 2a 29 70 43 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a  *)pCellKey, 2);.
2c550 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
2c560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c570 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
2c580 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
2c590 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2c5a0 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2c5b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
2c5c0 3d 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  = xRecordCompare
2c5d0 28 6e 43 65 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79  (nCell, pCellKey
2c5e0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2c5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2c600 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
2c610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c620 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 20  assert( .       
2c630 20 20 20 20 20 28 70 49 64 78 4b 65 79 2d 3e 65       (pIdxKey->e
2c640 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 43  rrCode!=SQLITE_C
2c650 4f 52 52 55 50 54 20 7c 7c 20 63 3d 3d 30 29 0a  ORRUPT || c==0).
2c660 20 20 20 20 20 20 20 20 20 26 26 20 28 70 49 64           && (pId
2c670 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2c680 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70  QLITE_NOMEM || p
2c690 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2c6a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 0a 20  >mallocFailed). 
2c6b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
2c6c0 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
2c6d0 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
2c6e0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  +1;.        }els
2c6f0 65 20 69 66 28 20 63 3e 30 20 29 7b 0a 20 20 20  e if( c>0 ){.   
2c700 20 20 20 20 20 20 20 75 70 72 20 3d 20 69 64 78         upr = idx
2c710 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  -1;.        }els
2c720 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  e{.          ass
2c730 65 72 74 28 20 63 3d 3d 30 20 29 3b 0a 20 20 20  ert( c==0 );.   
2c740 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2c750 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2c760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c770 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
2c780 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
2c790 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20   (u16)idx;.     
2c7a0 20 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79       if( pIdxKey
2c7b0 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 63 20 3d  ->errCode ) rc =
2c7c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
2c7d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
2c7e0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c7f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c800 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 20 62   if( lwr>upr ) b
2c810 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 61 73  reak;.        as
2c820 73 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30  sert( lwr+upr>=0
2c830 20 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20   );.        idx 
2c840 3d 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20  = (lwr+upr)>>1; 
2c850 20 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75   /* idx = (lwr+u
2c860 70 72 29 2f 32 20 2a 2f 0a 20 20 20 20 20 20 7d  pr)/2 */.      }
2c870 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2c880 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20 7c 7c  t( lwr==upr+1 ||
2c890 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
2c8a0 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 29  && !pPage->leaf)
2c8b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2c8c0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2c8d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2c8e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 61 73  leaf ){.      as
2c8f0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
2c900 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
2c910 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2c920 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
2c930 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61  );.      pCur->a
2c940 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c950 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20  ] = (u16)idx;.  
2c960 20 20 20 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20      *pRes = c;. 
2c970 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2c980 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
2c990 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c9a0 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74     }.moveto_next
2c9b0 5f 6c 61 79 65 72 3a 0a 20 20 20 20 69 66 28 20  _layer:.    if( 
2c9c0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
2c9d0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
2c9e0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
2c9f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
2ca00 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
2ca10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ca20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2ca30 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
2ca40 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
2ca50 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2ca60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2ca70 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 72 63  (u16)lwr;.    rc
2ca80 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2ca90 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
2caa0 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
2cab0 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
2cac0 69 73 68 3a 0a 20 20 70 43 75 72 2d 3e 69 6e 66  ish:.  pCur->inf
2cad0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 61  o.nSize = 0;.  a
2cae0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2caf0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
2cb00 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20  lidOvfl)==0 );. 
2cb10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2cb20 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2cb30 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2cb40 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2cb50 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2cb60 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2cb70 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2cb80 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2cb90 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2cba0 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2cbb0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2cbc0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2cbd0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2cbe0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2cbf0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2cc00 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2cc10 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2cc20 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2cc30 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2cc40 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2cc50 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2cc60 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2cc70 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2cc80 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2cc90 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2cca0 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2ccb0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2ccc0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2ccd0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2cce0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2ccf0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2cd00 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2cd10 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2cd20 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2cd30 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2cd40 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2cd50 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2cd60 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2cd70 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2cd80 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2cd90 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2cda0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2cdb0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2cdc0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2cdd0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
2cde0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2cdf0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2ce00 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2ce10 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2ce20 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2ce30 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2ce40 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2ce50 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2ce60 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2ce70 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2ce80 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2ce90 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2cea0 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2ceb0 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2cec0 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2ced0 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2cee0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2cef0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2cf00 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2cf10 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2cf20 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2cf30 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2cf40 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2cf50 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2cf60 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2cf70 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2cf80 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2cf90 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2cfa0 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2cfb0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2cfc0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2cfd0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2cfe0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2cff0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2d000 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2d010 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2d020 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2d030 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2d040 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2d050 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2d060 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2d070 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2d080 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2d090 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2d0a0 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2d0b0 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2d0c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2d0d0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2d0e0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2d0f0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2d100 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2d110 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2d120 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2d130 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2d140 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2d150 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2d160 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2d170 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2d180 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2d190 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2d1a0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2d1b0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2d1c0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2d1d0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2d1e0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2d1f0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2d200 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2d210 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2d220 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2d230 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2d240 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2d250 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d260 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2d270 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2d280 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2d290 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d2a0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2d2b0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2d2c0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2d2d0 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2d2e0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2d2f0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2d300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2d310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d320 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2d330 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2d340 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2d350 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2d360 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2d370 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d380 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2d390 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d3a0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2d3b0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2d3c0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2d3d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2d3e0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2d3f0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2d400 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2d410 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2d420 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2d430 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2d440 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2d450 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2d460 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2d470 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2d480 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2d490 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2d4a0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2d4b0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2d4c0 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2d4d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d4e0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2d4f0 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2d500 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2d510 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2d520 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2d530 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2d540 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2d550 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2d560 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2d570 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2d580 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2d590 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2d5a0 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2d5b0 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2d5c0 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2d5d0 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2d5e0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2d5f0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2d600 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2d610 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2d620 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2d630 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2d640 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2d650 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2d660 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2d670 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2d680 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2d690 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2d6a0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2d6b0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2d6c0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2d6d0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2d6e0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2d6f0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2d700 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d710 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2d720 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2d730 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2d740 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2d750 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2d760 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2d770 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d780 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2d790 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d7a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d7b0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2d7c0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2d7d0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2d7e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d7f0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2d800 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2d810 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
2d820 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2d830 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2d840 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2d850 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2d860 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2d870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d890 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2d8a0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2d8b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d8c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2d8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2d8e0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2d8f0 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2d900 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2d910 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2d920 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2d930 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2d940 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2d950 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2d960 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2d970 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d980 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2d990 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2d9a0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d9b0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2d9c0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d9d0 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2d9e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2d9f0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2da00 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2da10 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2da20 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2da30 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2da40 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2da50 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
2da60 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2da70 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2da80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2da90 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70  age];.  if( (++p
2daa0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2dab0 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d  >iPage])>=pPage-
2dac0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
2dad0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2dae0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65  iPage]--;.    re
2daf0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2db00 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2db10 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2db20 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2db30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2db40 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2db50 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2db60 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2db70 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2db80 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2db90 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2dba0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2dbb0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2dbc0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2dbd0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2dbe0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2dbf0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2dc00 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2dc10 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2dc20 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2dc30 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2dc40 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2dc50 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2dc60 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2dc70 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2dc80 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
2dc90 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2dca0 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2dcb0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2dcc0 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
2dcd0 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2dce0 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2dcf0 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2dd00 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
2dd10 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2dd20 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2dd30 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
2dd40 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
2dd50 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2dd60 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2dd70 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2dd80 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
2dd90 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
2dda0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2ddb0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2ddc0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2ddd0 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2dde0 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2ddf0 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2de00 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2de10 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2de20 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2de30 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2de40 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2de50 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2de60 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2de70 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2de80 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2de90 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2dea0 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2deb0 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2dec0 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2ded0 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2dee0 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2def0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2df00 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2df10 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2df20 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2df30 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2df40 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2df50 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2df60 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2df70 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2df80 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2df90 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2dfa0 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2dfb0 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2dfc0 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2dfd0 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2dfe0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2dff0 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2e000 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2e010 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2e020 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2e030 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2e040 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2e050 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2e060 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2e070 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2e080 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
2e090 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2e0a0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2e0b0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e0c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2e0d0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2e0e0 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2e0f0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2e100 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2e110 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2e120 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e130 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2e140 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2e150 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2e160 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2e170 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2e180 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e1a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e1b0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2e1c0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2e1d0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2e1e0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2e1f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e200 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2e210 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2e220 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e230 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2e240 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2e250 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2e260 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2e270 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2e280 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2e290 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2e2a0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2e2b0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2e2c0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2e2d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2e2e0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2e2f0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2e300 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2e310 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2e320 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e330 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2e340 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2e350 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2e360 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2e370 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
2e380 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2e390 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2e3a0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2e3b0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2e3c0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2e3d0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2e3e0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2e3f0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2e400 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2e410 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2e420 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2e430 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
2e440 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2e450 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2e460 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2e470 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2e480 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2e490 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2e4a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2e4b0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2e4c0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2e4d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2e4e0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2e4f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e500 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2e510 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  & (BTCF_ValidOvf
2e520 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70  l))==0 );..    p
2e530 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e540 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70  >iPage]--;.    p
2e550 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2e560 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2e570 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
2e580 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
2e590 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2e5a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e5b0 65 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c  eePrevious(pCur,
2e5c0 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2e5d0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2e5e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
2e5f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e600 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
2e610 65 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72  eePrevious(BtCur
2e620 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
2e630 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28  pRes){.  assert(
2e640 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61   cursorOwnsBtSha
2e650 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61  red(pCur) );.  a
2e660 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2e670 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2e680 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2e690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2e6a0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2e6b0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2e6c0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2e6d0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2e6e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e6f0 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2e700 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2e710 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a  TCF_ValidNKey);.
2e720 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2e730 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ze = 0;.  if( pC
2e740 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2e750 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70  OR_VALID.   || p
2e760 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e770 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c  >iPage]==0.   ||
2e780 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e790 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2e7a0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
2e7b0 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
2e7c0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2e7d0 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
2e7e0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2e7f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e800 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
2e810 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2e820 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
2e830 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2e840 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
2e850 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2e860 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
2e870 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
2e880 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
2e890 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2e8a0 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
2e8b0 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
2e8c0 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
2e8d0 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
2e8e0 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
2e8f0 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
2e900 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
2e910 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2e920 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
2e930 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
2e940 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
2e950 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e960 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
2e970 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
2e980 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
2e990 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
2e9a0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
2e9b0 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65  to NULL in the e
2e9c0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
2e9d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2e9e0 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2e9f0 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2ea00 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2ea10 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2ea20 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2ea30 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2ea40 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2ea50 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2ea60 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2ea70 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2ea80 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2ea90 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2eaa0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2eab0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2eac0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2ead0 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2eae0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2eaf0 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2eb00 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2eb10 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2eb20 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2eb30 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2eb40 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2eb50 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2eb60 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2eb70 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2eb80 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2eb90 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2eba0 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2ebb0 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2ebc0 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2ebd0 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2ebe0 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2ebf0 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2ec00 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2ec10 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2ec20 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2ec30 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2ec40 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2ec50 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2ec60 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2ec70 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2ec80 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2ec90 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2eca0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2ecb0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2ecc0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2ecd0 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2ece0 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2ecf0 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2ed00 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2ed10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2ed20 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2ed30 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2ed40 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2ed50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2ed60 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2ed70 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2ed80 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2ed90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2eda0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2edb0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2edc0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2edd0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2ede0 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2edf0 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2ee00 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2ee10 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2ee20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2ee30 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2ee40 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2ee50 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2ee60 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2ee70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2ee80 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2ee90 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2eea0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2eeb0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2eec0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2eed0 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2eee0 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2eef0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2ef00 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2ef10 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2ef20 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2ef30 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
2ef40 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2ef50 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
2ef60 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2ef70 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2ef80 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
2ef90 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
2efa0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2efb0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2efc0 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
2efd0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2efe0 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
2eff0 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
2f000 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
2f010 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
2f020 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2f030 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2f040 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
2f050 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
2f060 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2f070 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
2f080 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
2f090 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
2f0a0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
2f0b0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
2f0c0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
2f0d0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
2f0e0 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
2f0f0 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
2f100 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
2f110 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2f120 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
2f130 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2f140 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2f150 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2f160 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2f170 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2f180 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2f190 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2f1a0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2f1b0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2f1c0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2f1d0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2f1e0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2f1f0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2f200 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f210 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2f220 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2f230 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2f240 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2f250 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2f260 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2f270 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2f280 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2f290 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2f2a0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2f2b0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2f2c0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2f2d0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2f2e0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2f2f0 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2f300 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2f310 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2f320 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2f330 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2f340 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2f350 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2f360 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2f370 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2f380 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2f390 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2f3a0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2f3b0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2f3c0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2f3d0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2f3e0 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2f3f0 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2f400 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2f410 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2f420 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f430 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2f440 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2f450 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f460 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2f470 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2f480 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2f490 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2f4a0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2f4b0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2f4c0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2f4d0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2f4e0 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2f4f0 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2f500 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2f510 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2f520 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2f530 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2f540 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2f550 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2f560 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2f570 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2f580 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2f590 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2f5a0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2f5b0 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2f5c0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2f5d0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2f5e0 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2f5f0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
2f600 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2f610 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
2f620 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
2f630 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
2f640 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2f650 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
2f660 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
2f670 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2f680 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
2f690 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
2f6a0 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
2f6b0 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
2f6c0 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
2f6d0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
2f6e0 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
2f6f0 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
2f700 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f710 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2f720 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
2f730 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
2f740 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2f750 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
2f760 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
2f770 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2f780 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2f790 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
2f7a0 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
2f7b0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
2f7c0 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
2f7d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
2f7e0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2f7f0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f800 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f810 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2f820 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2f830 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2f840 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
2f850 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
2f860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f870 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2f880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f890 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
2f8a0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
2f8b0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
2f8c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f8d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f8e0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2f8f0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f900 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f910 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2f920 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
2f930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f940 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
2f950 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
2f960 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
2f970 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
2f980 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
2f990 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2f9a0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
2f9b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
2f9c0 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
2f9d0 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
2f9e0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
2f9f0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2fa00 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
2fa10 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
2fa20 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
2fa30 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
2fa40 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
2fa50 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
2fa60 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
2fa70 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
2fa80 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
2fa90 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
2faa0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
2fab0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
2fac0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2fad0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2fae0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
2faf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2fb00 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2fb10 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2fb20 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2fb30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2fb40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fb50 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2fb60 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2fb70 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2fb80 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2fb90 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2fba0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2fbb0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
2fbc0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2fbd0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2fbe0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2fbf0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2fc00 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2fc10 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2fc20 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2fc30 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
2fc40 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
2fc50 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
2fc60 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2fc70 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
2fc80 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
2fc90 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
2fca0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2fcb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fcc0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2fcd0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
2fce0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fcf0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2fd00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
2fd10 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2fd20 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
2fd30 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
2fd40 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
2fd50 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2fd60 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2fd70 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
2fd80 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
2fd90 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
2fda0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
2fdb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
2fdc0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
2fdd0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2fde0 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
2fdf0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fe00 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2fe10 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
2fe20 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2fe30 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2fe40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2fe50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fe60 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2fe70 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2fe80 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2fe90 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fea0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2feb0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2fec0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2fed0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2fee0 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2fef0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2ff00 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2ff10 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2ff20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2ff30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2ff40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2ff50 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2ff60 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2ff70 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2ff80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2ffa0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2ffb0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2ffc0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2ffd0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
2ffe0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2fff0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
30000 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
30010 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30020 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
30030 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
30040 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
30050 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
30060 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
30070 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
30080 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
30090 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
300a0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
300b0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
300c0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
300d0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
300e0 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
300f0 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
30100 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
30110 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
30120 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
30130 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30140 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
30150 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
30160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
30170 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
30180 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
30190 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
301a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
301b0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
301c0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
301d0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
301e0 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
301f0 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
30200 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
30210 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30220 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30230 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30240 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30250 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30260 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
30270 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30280 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
30290 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
302a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
302b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
302c0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
302d0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
302e0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
302f0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30310 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30320 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
30330 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
30340 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30350 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30360 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
30370 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
30380 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
30390 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
303a0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
303b0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
303c0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
303d0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
303e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
303f0 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
30400 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
30410 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
30420 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
30430 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
30440 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
30450 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
30460 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
30470 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
30480 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
304a0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
304b0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
304c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
304d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
304e0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
304f0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30510 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
30520 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
30530 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
30540 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30550 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
30560 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
30570 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
30580 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
30590 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
305a0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
305b0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
305c0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
305d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
305e0 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
305f0 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
30600 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
30610 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
30620 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
30630 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
30640 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
30650 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
30660 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
30670 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
30680 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
30690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
306a0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
306b0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
306c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
306d0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
306e0 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
306f0 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30700 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
30710 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
30720 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
30730 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
30740 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
30750 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
30770 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30780 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30790 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
307a0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
307b0 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
307c0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
307d0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
307e0 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
307f0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
30800 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30810 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
30820 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
30830 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
30840 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
30850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
30860 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
30870 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
30880 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
30890 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
308a0 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
308b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
308c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
308d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
308e0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
308f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
30900 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
30910 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
30920 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
30930 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30940 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
30950 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
30960 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
30970 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30980 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30990 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
309a0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
309b0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
309c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
309d0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
309e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
309f0 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
30a00 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
30a10 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
30a20 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
30a30 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
30a40 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30a50 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
30a60 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
30a70 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
30a80 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
30a90 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
30aa0 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
30ab0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
30ac0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
30ad0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
30ae0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30af0 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
30b00 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
30b10 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
30b20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30b30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30b40 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
30b50 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
30b60 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
30b70 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
30b80 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
30b90 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
30ba0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30bb0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
30bc0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
30bd0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
30be0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
30bf0 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
30c00 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
30c10 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
30c20 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
30c30 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
30c40 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
30c50 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
30c60 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30c70 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
30c80 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
30c90 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
30ca0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30cc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30cd0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
30ce0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
30cf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30d00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30d10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30d20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
30d30 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
30d40 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
30d50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30d60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30d70 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30d80 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
30d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30da0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
30db0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
30dc0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
30dd0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
30de0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
30df0 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
30e00 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
30e10 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
30e20 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
30e30 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
30e40 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
30e50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
30e60 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
30e70 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
30e80 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
30e90 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
30ea0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
30eb0 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
30ec0 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
30ed0 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
30ee0 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
30ef0 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
30f00 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
30f10 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
30f20 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
30f30 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
30f40 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
30f50 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
30f60 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
30f70 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
30f80 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
30f90 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
30fa0 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
30fb0 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
30fc0 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
30fd0 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
30fe0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
30ff0 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
31000 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
31010 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
31020 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
31030 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
31040 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
31050 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
31060 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
31070 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
31080 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
31090 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
310a0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
310b0 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
310c0 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
310d0 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
310e0 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
310f0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
31100 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
31110 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
31120 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
31130 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
31140 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
31150 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
31160 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
31170 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
31180 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
31190 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
311a0 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
311b0 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
311c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
311d0 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
311e0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
311f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
31200 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
31210 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
31220 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
31230 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
31240 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
31250 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
31260 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31270 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
31280 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
31290 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
312a0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
312b0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
312c0 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
312d0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
312e0 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
312f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31300 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31310 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31320 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
31330 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
31340 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
31350 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
31360 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
31370 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
31380 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
31390 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
313a0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
313b0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
313c0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
313d0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
313e0 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
313f0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
31400 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
31410 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
31420 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
31430 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
31440 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
31450 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
31460 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
31470 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
31480 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
31490 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
314a0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
314b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
314c0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
314d0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
314e0 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
314f0 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
31500 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
31510 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31530 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31540 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
31550 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
31560 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
31570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
31580 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
31590 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
315a0 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
315b0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
315c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
315d0 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
315e0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
315f0 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
31600 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
31610 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
31620 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
31630 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
31640 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
31650 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
31660 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
31670 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
31680 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
31690 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
316a0 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
316b0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
316c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
316d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
316e0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
316f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
31700 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31710 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
31720 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
31730 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
31740 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
31750 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
31760 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
31770 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
31780 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
31790 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
317a0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
317b0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
317c0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
317d0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
317e0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
317f0 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
31800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
31810 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
31820 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
31830 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
31840 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
31850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
31860 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
31870 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
31880 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
31890 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
318a0 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
318b0 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
318c0 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
318d0 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
318e0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
318f0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31900 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
31910 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
31920 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
31930 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
31940 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
31950 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
31960 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
31970 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
31980 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
31990 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
319a0 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
319b0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
319c0 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
319d0 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
319e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
319f0 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
31a00 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
31a10 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
31a20 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
31a30 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
31a40 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
31a50 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
31a60 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
31a70 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
31a80 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
31a90 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
31aa0 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
31ab0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
31ac0 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
31ad0 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
31ae0 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
31af0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31b00 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
31b10 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
31b20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
31b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31b40 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
31b50 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
31b60 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
31b70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
31b80 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
31b90 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
31ba0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
31bb0 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
31bc0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31be0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
31bf0 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
31c00 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
31c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
31c30 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
31c40 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31c60 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
31c70 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
31c80 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
31c90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31ca0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
31cb0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31cc0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
31cd0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
31ce0 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
31cf0 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
31d00 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
31d10 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
31d20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31d30 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
31d40 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
31d50 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
31d60 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
31d70 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
31d80 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
31d90 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
31da0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
31db0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
31dc0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
31dd0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
31de0 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
31df0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31e00 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
31e10 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
31e20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31e30 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
31e40 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31e50 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
31e60 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31e70 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
31e80 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
31e90 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
31ea0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
31eb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
31ec0 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
31ed0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
31ee0 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
31ef0 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
31f00 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
31f10 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
31f20 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
31f30 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
31f40 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
31f50 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
31f60 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
31f70 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
31f80 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
31f90 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
31fa0 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
31fb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
31fc0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31fd0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
31fe0 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
31ff0 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
32000 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
32010 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
32020 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
32030 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
32040 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
32050 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
32060 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
32070 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
32080 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
32090 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
320a0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
320b0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
320c0 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
320d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
320e0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
320f0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
32100 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
32110 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
32120 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
32130 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
32140 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
32150 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
32160 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
32170 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
32180 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
32190 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
321a0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
321b0 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
321c0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
321d0 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
321e0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
321f0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
32200 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
32210 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
32220 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
32230 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
32240 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
32250 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
32260 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
32270 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
32280 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
32290 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
322a0 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
322b0 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
322c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
322d0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
322e0 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
322f0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
32300 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
32310 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32320 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
32330 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32340 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
32350 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
32360 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32370 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
32380 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32390 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
323a0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
323b0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
323c0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
323d0 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
323e0 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
323f0 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
32400 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
32410 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32420 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
32430 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32440 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
32450 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
32460 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
32470 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
32480 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
32490 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
324a0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
324b0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
324c0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
324d0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
324e0 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
324f0 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
32500 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
32510 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
32520 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
32530 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
32540 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
32550 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
32560 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
32570 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
32580 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
32590 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
325a0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
325b0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
325c0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
325d0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
325e0 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
325f0 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
32600 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
32610 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
32620 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
32630 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
32640 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
32650 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
32660 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
32670 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
32680 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
32690 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
326a0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
326b0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
326c0 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
326d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
326e0 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
326f0 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
32700 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
32710 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
32720 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
32730 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
32740 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
32750 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
32760 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
32770 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
32780 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
32790 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
327a0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
327b0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
327c0 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
327d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
327e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
327f0 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76  9920-11576 Howev
32800 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f  er, newer versio
32810 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69  ns of SQLite sti
32820 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69  ll.      ** avoi
32830 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74  d using the last
32840 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20   six entries in 
32850 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  the freelist tru
32860 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e  nk page array in
32870 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
32880 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
32890 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e  les created by n
328a0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
328b0 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20   SQLite can be. 
328c0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20       ** read by 
328d0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
328e0 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20  f SQLite..      
328f0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
32900 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32910 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
32920 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
32930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32940 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
32950 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
32960 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
32970 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
32980 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
32990 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
329a0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
329b0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
329c0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
329d0 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
329e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
329f0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
32a00 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
32a10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32a20 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
32a30 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
32a40 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
32a50 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
32a60 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
32a70 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
32a80 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
32a90 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
32aa0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
32ab0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
32ac0 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
32ad0 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
32ae0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
32af0 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
32b00 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
32b10 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
32b20 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
32b30 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
32b40 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
32b50 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
32b60 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
32b70 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
32b80 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
32b90 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
32ba0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
32bb0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
32bc0 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
32bd0 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
32be0 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
32bf0 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
32c00 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
32c10 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
32c20 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
32c30 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
32c40 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32c50 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
32c60 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
32c70 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
32c80 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32c90 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
32ca0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
32cb0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
32cc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32cd0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
32ce0 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
32cf0 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
32d00 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
32d10 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
32d20 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
32d30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
32d40 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32d50 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
32d60 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
32d70 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
32d80 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
32d90 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
32da0 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
32db0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
32dc0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
32dd0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
32de0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
32df0 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
32e00 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
32e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
32e20 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
32e30 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
32e40 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
32e50 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
32e60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
32e70 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
32e80 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
32e90 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
32ea0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
32eb0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
32ec0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
32ed0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
32ee0 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
32ef0 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
32f00 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
32f10 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
32f20 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
32f30 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
32f40 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
32f50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
32f60 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
32f70 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
32f80 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
32f90 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
32fa0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
32fb0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
32fc0 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
32fd0 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
32fe0 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
32ff0 49 6e 66 6f 20 20 20 20 20 20 20 20 20 20 2f 2a  Info          /*
33000 20 53 69 7a 65 20 69 6e 66 6f 72 6d 61 74 69 6f   Size informatio
33010 6e 20 61 62 6f 75 74 20 74 68 65 20 63 65 6c 6c  n about the cell
33020 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
33030 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
33040 70 42 74 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  pBt;.  Pgno ovfl
33050 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
33060 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
33070 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
33080 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
33090 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
330a0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
330b0 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
330c0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
330d0 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
330e0 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63   if( pInfo->nLoc
330f0 61 6c 3d 3d 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c  al==pInfo->nPayl
33100 6f 61 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  oad ){.    retur
33110 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a  n SQLITE_OK;  /*
33120 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   No overflow pag
33130 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f  es. Return witho
33140 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e  ut doing anythin
33150 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  g */.  }.  if( p
33160 43 65 6c 6c 2b 70 49 6e 66 6f 2d 3e 6e 53 69 7a  Cell+pInfo->nSiz
33170 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44 61  e-1 > pPage->aDa
33180 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61  ta+pPage->maskPa
33190 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ge ){.    return
331a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
331b0 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65  BKPT;  /* Cell e
331c0 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20  xtends past end 
331d0 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20  of page */.  }. 
331e0 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34   ovflPgno = get4
331f0 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 70 49 6e  byte(pCell + pIn
33200 66 6f 2d 3e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  fo->nSize - 4);.
33210 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
33220 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
33230 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
33240 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
33250 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
33260 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
33270 64 20 2d 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61  d - pInfo->nLoca
33280 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  l + ovflPageSize
33290 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69   - 1)/ovflPageSi
332a0 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  ze;.  assert( nO
332b0 76 66 6c 3e 30 20 7c 7c 20 0a 20 20 20 20 28 43  vfl>0 || .    (C
332c0 4f 52 52 55 50 54 5f 44 42 20 26 26 20 28 70 49  ORRUPT_DB && (pI
332d0 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 2b 20  nfo->nPayload + 
332e0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c 6f 76  ovflPageSize)<ov
332f0 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20 29 3b  flPageSize).  );
33300 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d  .  while( nOvfl-
33310 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 69 4e  - ){.    Pgno iN
33320 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d 65 6d  ext = 0;.    Mem
33330 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
33340 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50 67 6e  .    if( ovflPgn
33350 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e  o<2 || ovflPgno>
33360 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70  btreePagecount(p
33370 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
33380 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67 61 6c  0 is not a legal
33390 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
333a0 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74 20 62   page 1 cannot b
333b0 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6f  e an .      ** o
333c0 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 54 68  verflow page. Th
333d0 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66 6c 50  erefore if ovflP
333e0 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20 74 68  gno<2 or past th
333f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a 20 20  e end of the .  
33400 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68 65 20      ** file the 
33410 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
33420 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20 20 20   corrupt. */.   
33430 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33440 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33450 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 76     }.    if( nOv
33460 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  fl ){.      rc =
33470 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
33480 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20  (pBt, ovflPgno, 
33490 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74 29 3b  &pOvfl, &iNext);
334a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
334b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
334c0 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f 76 66  ..    if( ( pOvf
334d0 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d 20 62  l || ((pOvfl = b
334e0 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28 70  treePageLookup(p
334f0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29 21 3d  Bt, ovflPgno))!=
33500 30 29 20 29 0a 20 20 20 20 20 26 26 20 73 71 6c  0) ).     && sql
33510 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65 66  ite3PagerPageRef
33520 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70 44 62  count(pOvfl->pDb
33530 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29 7b 0a  Page)!=1.    ){.
33540 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69        /* There i
33550 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e 79 20  s no reason any 
33560 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20 68 61  cursor should ha
33570 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e  ve an outstandin
33580 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20 20 20  g reference .   
33590 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72     ** to an over
335a0 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f 6e 67  flow page belong
335b0 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20 74 68  ing to a cell th
335c0 61 74 20 69 73 20 62 65 69 6e 67 20 64 65 6c 65  at is being dele
335d0 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20 20 20  ted/updated..   
335e0 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68 65 72     ** So if ther
335f0 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20 74 68  e exists more th
33600 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
33610 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c 20 74   to this page, t
33620 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20 2a 2a  hen it .      **
33630 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c 6c 79   must not really
33640 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
33650 70 61 67 65 20 61 6e 64 20 74 68 65 20 64 61 74  page and the dat
33660 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 63 6f  abase must be co
33670 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20 2a 2a  rrupt. .      **
33680 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c 20 74   It is helpful t
33690 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 62 65  o detect this be
336a0 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66 72 65  fore calling fre
336b0 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a 20 20  ePage2(), as .  
336c0 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67 65 32      ** freePage2
336d0 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68 65 20  () may zero the 
336e0 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 69 66  page contents if
336f0 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65 20 6d   secure-delete m
33700 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ode is.      ** 
33710 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 69 73  enabled. If this
33720 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61 67 65   'overflow' page
33730 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61   happens to be a
33740 20 70 61 67 65 20 74 68 61 74 20 74 68 65 0a 20   page that the. 
33750 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 69       ** caller i
33760 73 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  s iterating thro
33770 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69 6e 20  ugh or using in 
33780 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79 2c 20  some other way, 
33790 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 63 61  this.      ** ca
337a0 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74 69 63  n be problematic
337b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
337c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
337d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
337e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
337f0 20 66 72 65 65 50 61 67 65 32 28 70 42 74 2c 20   freePage2(pBt, 
33800 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29  pOvfl, ovflPgno)
33810 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
33820 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20   pOvfl ){.      
33830 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
33840 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65  f(pOvfl->pDbPage
33850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33860 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
33870 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20  .    ovflPgno = 
33880 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  iNext;.  }.  ret
33890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
338a0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ../*.** Create t
338b0 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  he byte sequence
338c0 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65   used to represe
338d0 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67  nt a cell on pag
338e0 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77  e pPage.** and w
338f0 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73  rite that byte s
33900 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65  equence into pCe
33910 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20  ll[].  Overflow 
33920 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c  pages are.** all
33930 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65  ocated and fille
33940 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72  d in as necessar
33950 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  y.  The calling 
33960 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20  procedure.** is 
33970 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
33980 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66  making sure suff
33990 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73  icient space has
339a0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a   been allocated.
339b0 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a  ** for pCell[]..
339c0 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
339d0 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e  pCell does not n
339e0 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f  ecessary need to
339f0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50   point to the pP
33a00 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72  age->aData.** ar
33a10 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74  ea.  pCell might
33a20 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74   point to some t
33a30 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65  emporary storage
33a40 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c  .  The cell will
33a50 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74  .** be construct
33a60 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f  ed in this tempo
33a70 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63  rary area then c
33a80 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65  opied into pPage
33a90 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72  ->aData.** later
33aa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33ab0 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65  fillInCell(.  Me
33ac0 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
33ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33ae0 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
33af0 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20  ntains the cell 
33b00 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
33b10 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  ar *pCell,      
33b20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
33b30 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  text of the cell
33b40 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74 72 65   */.  const Btre
33b50 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20 20 20  ePayload *pX,   
33b60 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61 64 20       /* Payload 
33b70 77 69 74 68 20 77 68 69 63 68 20 74 6f 20 63 6f  with which to co
33b80 6e 73 74 72 75 63 74 20 74 68 65 20 63 65 6c 6c  nstruct the cell
33b90 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
33ba0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
33bb0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
33bc0 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
33bd0 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
33be0 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
33bf0 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
33c00 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
33c10 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
33c20 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
33c30 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
33c40 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
33c50 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
33c60 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
33c70 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
33c80 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
33c90 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
33ca0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
33cb0 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
33cc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
33cd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
33ce0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
33cf0 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
33d00 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
33d10 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
33d20 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
33d30 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
33d40 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
33d50 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
33d60 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
33d70 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
33d80 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
33d90 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
33da0 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
33db0 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
33dc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
33dd0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33de0 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
33df0 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
33e00 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
33e10 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
33e20 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
33e30 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28 20 70  PtrSize;.  if( p
33e40 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
33e50 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 70      nPayload = p
33e60 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d 3e 6e  X->nData + pX->n
33e70 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63 20 3d  Zero;.    pSrc =
33e80 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20   pX->pData;.    
33e90 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61 74 61  nSrc = pX->nData
33ea0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
33eb0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
33ec0 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65 6c 6c  ); /* fillInCell
33ed0 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66  () only called f
33ee0 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 20  or leaves */.   
33ef0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
33f00 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e  arint32(&pCell[n
33f10 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61  Header], nPayloa
33f20 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65 72 20  d);.    nHeader 
33f30 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
33f40 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28  ell[nHeader], *(
33f50 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79 29 3b  u64*)&pX->nKey);
33f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
33f70 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79 3c 3d  sert( pX->nKey<=
33f80 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70 58  0x7fffffff && pX
33f90 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20  ->pKey!=0 );.   
33fa0 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f 61 64   nSrc = nPayload
33fb0 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b 65 79   = (int)pX->nKey
33fc0 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 58 2d  ;.    pSrc = pX-
33fd0 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65 61 64  >pKey;.    nHead
33fe0 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 33  er += putVarint3
33ff0 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72  2(&pCell[nHeader
34000 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20  ], nPayload);.  
34010 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69  }.  .  /* Fill i
34020 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f  n the payload */
34030 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
34040 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
34050 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61   ){.    n = nHea
34060 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a  der + nPayload;.
34070 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d      testcase( n=
34080 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  =3 );.    testca
34090 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20  se( n==4 );.    
340a0 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b  if( n<4 ) n = 4;
340b0 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e  .    *pnSize = n
340c0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
340d0 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
340e0 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a  pPrior = pCell;.
340f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
34100 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e   mn = pPage->min
34110 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d  Local;.    n = m
34120 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  n + (nPayload - 
34130 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42  mn) % (pPage->pB
34140 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
34150 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  4);.    testcase
34160 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  ( n==pPage->maxL
34170 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74  ocal );.    test
34180 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e  case( n==pPage->
34190 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
341a0 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d    if( n > pPage-
341b0 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20  >maxLocal ) n = 
341c0 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66  mn;.    spaceLef
341d0 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69  t = n;.    *pnSi
341e0 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72  ze = n + nHeader
341f0 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72   + 4;.    pPrior
34200 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
34210 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79  r+n];.  }.  pPay
34220 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
34230 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74  eader];..  /* At
34240 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69   this point vari
34250 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20  ables should be 
34260 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  set as follows:.
34270 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79    **.  **   nPay
34280 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20 20 54  load           T
34290 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a  otal payload siz
342a0 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20  e in bytes.  ** 
342b0 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20    pPayload      
342c0 20 20 20 20 20 42 65 67 69 6e 20 77 72 69 74 69       Begin writi
342d0 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a  ng payload here.
342e0 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74    **   spaceLeft
342f0 20 20 20 20 20 20 20 20 20 20 53 70 61 63 65 20            Space 
34300 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61  available at pPa
34310 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c  yload.  If nPayl
34320 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20  oad>spaceLeft,. 
34330 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
34340 20 20 20 20 20 20 20 20 20 74 68 61 74 20 6d 65           that me
34350 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  ans content must
34360 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72   spill into over
34370 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a  flow pages..  **
34380 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20     *pnSize      
34390 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68        Size of th
343a0 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f  e local cell (no
343b0 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66  t counting overf
343c0 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20  low pages).  ** 
343d0 20 20 70 50 72 69 6f 72 20 20 20 20 20 20 20 20    pPrior        
343e0 20 20 20 20 20 57 68 65 72 65 20 74 6f 20 77 72       Where to wr
343f0 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20  ite the pgno of 
34400 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
34410 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a  ow page.  **.  *
34420 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20  * Use a call to 
34430 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
34440 72 28 29 20 74 6f 20 76 65 72 69 66 79 20 74 68  r() to verify th
34450 61 74 20 74 68 65 20 76 61 6c 75 65 73 20 61 62  at the values ab
34460 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f  ove.  ** were co
34470 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79  mputed correctly
34480 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54  ..  */.#if SQLIT
34490 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20  E_DEBUG.  {.    
344a0 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
344b0 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
344c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
344d0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  l, &info);.    a
344e0 73 73 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d  ssert( nHeader==
344f0 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c  (int)(info.pPayl
34500 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a  oad - pCell) );.
34510 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f      assert( info
34520 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65 79 20  .nKey==pX->nKey 
34530 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  );.    assert( *
34540 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e  pnSize == info.n
34550 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
34560 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d 3d  rt( spaceLeft ==
34570 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a   info.nLocal );.
34580 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
34590 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c 6f   Write the paylo
345a0 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61  ad into the loca
345b0 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65  l Cell and any e
345c0 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c  xtra into overfl
345d0 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77 68  ow pages */.  wh
345e0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
345f0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
34600 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64  Left==0 ){.#ifnd
34610 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34620 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
34630 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20  Pgno pgnoPtrmap 
34640 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f  = pgnoOvfl; /* O
34650 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
34660 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20 70  nter-map entry p
34670 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  age */.      if(
34680 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
34690 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
346a0 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f 76            pgnoOv
346b0 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20  fl++;.        } 
346c0 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20 20  while( .        
346d0 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28    PTRMAP_ISPAGE(
346e0 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c  pBt, pgnoOvfl) |
346f0 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44  | pgnoOvfl==PEND
34700 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
34710 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  t) .        );. 
34720 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34730 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
34740 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
34750 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66  &pOvfl, &pgnoOvf
34760 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b  l, pgnoOvfl, 0);
34770 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34780 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
34790 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
347a0 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74  database support
347b0 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61  s auto-vacuum, a
347c0 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72  nd the second or
347d0 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20   subsequent.    
347e0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
347f0 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f  ge is being allo
34800 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e  cated, add an en
34810 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  try to the point
34820 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20  er-map.      ** 
34830 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f  for that page no
34840 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  w. .      **.   
34850 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73     ** If this is
34860 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66   the first overf
34870 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77  low page, then w
34880 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20 65  rite a partial e
34890 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74  ntry .      ** t
348a0 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  o the pointer-ma
348b0 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20 6e  p. If we write n
348c0 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70  othing to this p
348d0 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c  ointer-map slot,
348e0 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74  .      ** then t
348f0 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76  he optimistic ov
34900 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f  erflow chain pro
34910 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72  cessing in clear
34920 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20  Cell().      ** 
34930 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74  may misinterpret
34940 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a   the uninitializ
34950 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65  ed values and de
34960 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a  lete the.      *
34970 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72  * wrong pages fr
34980 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
34990 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
349a0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
349b0 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  uum && rc==SQLIT
349c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
349d0 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f  u8 eType = (pgno
349e0 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56  Ptrmap?PTRMAP_OV
349f0 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f  ERFLOW2:PTRMAP_O
34a00 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20  VERFLOW1);.     
34a10 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
34a20 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70  , pgnoOvfl, eTyp
34a30 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26  e, pgnoPtrmap, &
34a40 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rc);.        if(
34a50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
34a60 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76   releasePage(pOv
34a70 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  fl);.        }. 
34a80 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
34a90 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
34aa0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
34ab0 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
34ac0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
34ad0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
34ae0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
34af0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
34b00 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74 73  an pPrior points
34b10 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20 61   into the data a
34b20 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  rea.      ** of 
34b30 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
34b40 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
34b50 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
34b60 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  able. */.      a
34b70 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73  ssert( pToReleas
34b80 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50  e==0 || sqlite3P
34b90 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
34ba0 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50  pToRelease->pDbP
34bb0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  age) );..      /
34bc0 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20 70  * If pPrior is p
34bd0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
34be0 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74  area of pPage, t
34bf0 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50  hen make sure pP
34c00 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  age.      ** is 
34c10 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20  still writeable 
34c20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
34c30 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61   pPrior<pPage->a
34c40 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d  Data || pPrior>=
34c50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
34c60 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
34c70 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
34c80 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34c90 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
34ca0 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70 75  ge) );..      pu
34cb0 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
34cc0 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
34cd0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
34ce0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
34cf0 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
34d00 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
34d10 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
34d20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
34d30 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
34d40 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
34d50 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
34d60 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
34d70 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34d80 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
34d90 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
34da0 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
34db0 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
34dc0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54 6f  ;..    /* If pTo
34dd0 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a  Release is not z
34de0 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f 61  ero than pPayloa
34df0 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68  d points into th
34e00 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20 20  e data area.    
34e10 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65  ** of pToRelease
34e20 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f  .  Make sure pTo
34e30 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c  Release is still
34e40 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20   writeable. */. 
34e50 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
34e60 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
34e70 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
34e80 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
34e90 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34ea0 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64 20   /* If pPayload 
34eb0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
34ec0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
34ed0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
34ee0 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69  e pPage.    ** i
34ef0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
34f00 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  e */.    assert(
34f10 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d   pPayload<pPage-
34f20 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f  >aData || pPaylo
34f30 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ad>=&pPage->aDat
34f40 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
34f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
34f60 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
34f70 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
34f80 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
34f90 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
34fa0 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
34fb0 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
34fc0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
34fd0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
34fe0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
34ff0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
35000 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
35010 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
35020 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
35030 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
35040 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
35050 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
35060 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
35070 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  ft -= n;.  }.  r
35080 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65  eleasePage(pToRe
35090 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e  lease);.  return
350a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
350b0 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20  *.** Remove the 
350c0 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70  i-th cell from p
350d0 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74  Page.  This rout
350e0 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61 67  ine effects pPag
350f0 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63  e only..** The c
35100 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  ell content is n
35110 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c  ot freed or deal
35120 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73 20  located.  It is 
35130 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20  assumed that.** 
35140 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
35150 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64   has been copied
35160 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e   someplace else.
35170 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
35180 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74  ust.** removes t
35190 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  he reference to 
351a0 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50  the cell from pP
351b0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20  age..**.** "sz" 
351c0 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62  must be the numb
351d0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
351e0 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  he cell..*/.stat
351f0 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c  ic void dropCell
35200 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
35210 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a   int idx, int sz
35220 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75  , int *pRC){.  u
35230 33 32 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f  32 pc;         /
35240 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c  * Offset to cell
35250 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c   content of cell
35260 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
35270 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
35280 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44      /* pPage->aD
35290 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  ata */.  u8 *ptr
352a0 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64  ;        /* Used
352b0 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61   to move bytes a
352c0 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74  round within dat
352d0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  a[] */.  int rc;
352e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
352f0 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
35300 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
35310 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66   /* Beginning of
35320 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 30 20   the header.  0 
35330 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31 30 30  most pages.  100
35340 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66   page 1 */..  if
35350 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
35360 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
35370 30 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e  0 && idx<pPage->
35380 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
35390 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
353a0 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
353b0 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
353c0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
353d0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
353e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
353f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
35400 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
35410 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
35420 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
35430 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
35440 72 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c  r = &pPage->aCel
35450 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70  lIdx[2*idx];.  p
35460 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72  c = get2byte(ptr
35470 29 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  );.  hdr = pPage
35480 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74  ->hdrOffset;.  t
35490 65 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74  estcase( pc==get
354a0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
354b0 35 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73  5]) );.  testcas
354c0 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d  e( pc+sz==pPage-
354d0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
354e0 20 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28   );.  if( pc < (
354f0 75 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61  u32)get2byte(&da
35500 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63  ta[hdr+5]) || pc
35510 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
35520 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  ->usableSize ){.
35530 20 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54      *pRC = SQLIT
35540 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
35550 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
35560 20 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65    rc = freeSpace
35570 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
35580 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
35590 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
355a0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50  return;.  }.  pP
355b0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
355c0 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  if( pPage->nCell
355d0 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ==0 ){.    memse
355e0 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  t(&data[hdr+1], 
355f0 30 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b  0, 4);.    data[
35600 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20  hdr+7] = 0;.    
35610 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
35620 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42  dr+5], pPage->pB
35630 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
35640 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
35650 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
35660 73 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67  sableSize - pPag
35670 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20  e->hdrOffset.   
35680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35690 20 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69      - pPage->chi
356a0 6c 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20  ldPtrSize - 8;. 
356b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d   }else{.    memm
356c0 6f 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20  ove(ptr, ptr+2, 
356d0 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
356e0 2d 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74  - idx));.    put
356f0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
35700 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
35710 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
35720 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a  ree += 2;.  }.}.
35730 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
35740 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
35750 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
35760 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
35770 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
35780 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
35790 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
357a0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
357b0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
357c0 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
357d0 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
357e0 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
357f0 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
35800 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
35810 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
35820 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
35830 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
35840 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
35850 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
35860 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70  .** in pPage->ap
35870 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
35880 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
35890 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
358a0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
358b0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
358c0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
358d0 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
358e0 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
358f0 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
35900 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
35910 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
35920 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
35930 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
35940 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20 6d 75 73  ..**.** *pRC mus
35950 74 20 62 65 20 53 51 4c 49 54 45 5f 4f 4b 20 77  t be SQLITE_OK w
35960 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
35970 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
35980 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73 65 72  tatic void inser
35990 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65  tCell(.  MemPage
359a0 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61   *pPage,   /* Pa
359b0 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65  ge into which we
359c0 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a   are copying */.
359d0 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20    int i,        
359e0 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20      /* New cell 
359f0 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68  becomes the i-th
35a00 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67   cell of the pag
35a10 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  e */.  u8 *pCell
35a20 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74  ,        /* Cont
35a30 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ent of the new c
35a40 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c  ell */.  int sz,
35a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
35a60 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69  tes of content i
35a70 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  n pCell */.  u8 
35a80 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f  *pTemp,        /
35a90 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73  * Temp storage s
35aa0 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20  pace for pCell, 
35ab0 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 50  if needed */.  P
35ac0 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
35ad0 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 2c   /* If non-zero,
35ae0 20 72 65 70 6c 61 63 65 20 66 69 72 73 74 20 34   replace first 4
35af0 20 62 79 74 65 73 20 77 69 74 68 20 74 68 69 73   bytes with this
35b00 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
35b10 2a 70 52 43 20 20 20 20 20 20 20 20 20 20 2f 2a  *pRC          /*
35b20 20 52 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   Read and write 
35b30 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  return code from
35b40 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
35b50 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20 20 20  t idx = 0;      
35b60 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
35b70 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74 65  e new cell conte
35b80 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  nt in data[] */.
35b90 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
35ba0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
35bb0 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74  ter */.  u8 *dat
35bc0 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  a;         /* Th
35bd0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
35be0 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a 20   whole page */. 
35bf0 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20 20 20   u8 *pIns;      
35c00 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20     /* The point 
35c10 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  in pPage->aCellI
35c20 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20 63 65  dx[] where no ce
35c30 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 0a  ll inserted */..
35c40 20 20 61 73 73 65 72 74 28 20 2a 70 52 43 3d 3d    assert( *pRC==
35c50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
35c60 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
35c70 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70  <=pPage->nCell+p
35c80 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
35c90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f  );.  assert( MX_
35ca0 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29  CELL(pPage->pBt)
35cb0 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73  <=10921 );.  ass
35cc0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
35cd0 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
35ce0 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50  ->pBt) || CORRUP
35cf0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
35d00 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
35d10 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50  ow<=ArraySize(pP
35d20 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a  age->apOvfl) );.
35d30 20 20 61 73 73 65 72 74 28 20 41 72 72 61 79 53    assert( ArrayS
35d40 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  ize(pPage->apOvf
35d50 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50  l)==ArraySize(pP
35d60 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a  age->aiOvfl) );.
35d70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35d80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
35d90 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
35da0 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c  );.  /* The cell
35db0 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79   should normally
35dc0 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63   be sized correc
35dd0 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77  tly.  However, w
35de0 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a  hen moving a.  *
35df0 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c  * malformed cell
35e00 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67   from a leaf pag
35e10 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72  e to an interior
35e20 20 70 61 67 65 2c 20 69 66 20 74 68 65 20 63 65   page, if the ce
35e30 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e  ll size.  ** wan
35e40 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74  ted to be less t
35e50 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f  han 4 but got ro
35e60 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e  unded up to 4 on
35e70 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20   the leaf, then 
35e80 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20  size.  ** might 
35e90 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28  be less than 8 (
35ea0 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e  leaf-size + poin
35eb0 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65  ter) on the inte
35ec0 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63  rior node.  Henc
35ed0 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20  e.  ** the term 
35ee0 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20  after the || in 
35ef0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
35f00 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73  sert(). */.  ass
35f10 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e  ert( sz==pPage->
35f20 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  xCellSize(pPage,
35f30 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d   pCell) || (sz==
35f40 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29  8 && iChild>0) )
35f50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e  ;.  if( pPage->n
35f60 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32  Overflow || sz+2
35f70 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b  >pPage->nFree ){
35f80 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20 29  .    if( pTemp )
35f90 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
35fa0 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29  Temp, pCell, sz)
35fb0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
35fc0 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20  pTemp;.    }.   
35fd0 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20   if( iChild ){. 
35fe0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
35ff0 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  ell, iChild);.  
36000 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
36010 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
36020 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 69 73 6f      /* Compariso
36030 6e 20 61 67 61 69 6e 73 74 20 41 72 72 61 79 53  n against ArrayS
36040 69 7a 65 2d 31 20 73 69 6e 63 65 20 77 65 20 68  ize-1 since we h
36050 6f 6c 64 20 62 61 63 6b 20 6f 6e 65 20 65 78 74  old back one ext
36060 72 61 20 73 6c 6f 74 0a 20 20 20 20 2a 2a 20 61  ra slot.    ** a
36070 73 20 61 20 63 6f 6e 74 69 6e 67 65 6e 63 79 2e  s a contingency.
36080 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
36090 2c 20 6e 65 76 65 72 20 6e 65 65 64 20 6d 6f 72  , never need mor
360a0 65 20 74 68 61 6e 20 33 20 6f 76 65 72 66 6c 6f  e than 3 overflo
360b0 77 0a 20 20 20 20 2a 2a 20 73 6c 6f 74 73 20 62  w.    ** slots b
360c0 75 74 20 34 20 61 72 65 20 61 6c 6c 6f 63 61 74  ut 4 are allocat
360d0 65 64 2c 20 6a 75 73 74 20 74 6f 20 62 65 20 73  ed, just to be s
360e0 61 66 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  afe. */.    asse
360f0 72 74 28 20 6a 20 3c 20 41 72 72 61 79 53 69 7a  rt( j < ArraySiz
36100 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
36110 2d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  -1 );.    pPage-
36120 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65  >apOvfl[j] = pCe
36130 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61  ll;.    pPage->a
36140 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29  iOvfl[j] = (u16)
36150 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  i;..    /* When 
36160 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
36170 77 73 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61  ws occur, they a
36180 72 65 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e  re always sequen
36190 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20  tial and in.    
361a0 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  ** sorted order.
361b0 20 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74    This invariant
361c0 73 20 61 72 69 73 65 20 62 65 63 61 75 73 65 20  s arise because 
361d0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
361e0 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e  ws can.    ** on
361f0 6c 79 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e  ly occur when in
36200 73 65 72 74 69 6e 67 20 64 69 76 69 64 65 72 20  serting divider 
36210 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70  cells into the p
36220 61 72 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e  arent page durin
36230 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69  g.    ** balanci
36240 6e 67 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69  ng, and the divi
36250 64 65 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e  ders are adjacen
36260 74 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20  t and sorted..  
36270 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
36280 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e   j==0 || pPage->
36290 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36  aiOvfl[j-1]<(u16
362a0 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  )i ); /* Overflo
362b0 77 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ws in sorted ord
362c0 65 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  er */.    assert
362d0 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61  ( j==0 || i==pPa
362e0 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b  ge->aiOvfl[j-1]+
362f0 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  1 );   /* Overfl
36300 6f 77 73 20 61 72 65 20 73 65 71 75 65 6e 74 69  ows are sequenti
36310 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  al */.  }else{. 
36320 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
36330 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
36340 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
36350 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
36360 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70  E_OK ){.      *p
36370 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72  RC = rc;.      r
36380 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
36390 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
363a0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
363b0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
363c0 20 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70   );.    data = p
363d0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Page->aData;.   
363e0 20 61 73 73 65 72 74 28 20 26 64 61 74 61 5b 70   assert( &data[p
363f0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
36400 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49  ]==pPage->aCellI
36410 64 78 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  dx );.    rc = a
36420 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
36430 67 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20  ge, sz, &idx);. 
36440 20 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52     if( rc ){ *pR
36450 43 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20  C = rc; return; 
36460 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c  }.    /* The all
36470 6f 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75  ocateSpace() rou
36480 74 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20  tine guarantees 
36490 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  the following pr
364a0 6f 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20  operties.    ** 
364b0 69 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75  if it returns su
364c0 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20  ccessfully */.  
364d0 20 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d    assert( idx >=
364e0 20 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74   0 );.    assert
364f0 28 20 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e  ( idx >= pPage->
36500 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
36510 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43  ge->nCell+2 || C
36520 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
36530 20 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20   assert( idx+sz 
36540 3c 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70  <= (int)pPage->p
36550 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
36560 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
36570 65 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20  ee -= (u16)(2 + 
36580 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  sz);.    memcpy(
36590 26 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c  &data[idx], pCel
365a0 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20  l, sz);.    if( 
365b0 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
365c0 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69  put4byte(&data[i
365d0 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  dx], iChild);.  
365e0 20 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70    }.    pIns = p
365f0 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b  Page->aCellIdx +
36600 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76   i*2;.    memmov
36610 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20  e(pIns+2, pIns, 
36620 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  2*(pPage->nCell 
36630 2d 20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62  - i));.    put2b
36640 79 74 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a  yte(pIns, idx);.
36650 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
36660 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65  ++;.    /* incre
36670 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f  ment the cell co
36680 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  unt */.    if( (
36690 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  ++data[pPage->hd
366a0 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29  rOffset+4])==0 )
366b0 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72   data[pPage->hdr
366c0 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20  Offset+3]++;.   
366d0 20 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74   assert( get2byt
366e0 65 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68  e(&data[pPage->h
366f0 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50  drOffset+3])==pP
36700 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69  age->nCell );.#i
36710 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
36720 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
36730 20 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d   if( pPage->pBt-
36740 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
36750 20 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c       /* The cell
36760 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70   may contain a p
36770 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65  ointer to an ove
36780 72 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73  rflow page. If s
36790 6f 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a  o, write.      *
367a0 2a 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  * the entry for 
367b0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
367c0 65 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  e into the point
367d0 65 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f  er map..      */
367e0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
367f0 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70  OvflPtr(pPage, p
36800 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20  Cell, pRC);.    
36810 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  }.#endif.  }.}..
36820 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61  /*.** A CellArra
36830 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  y object contain
36840 73 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69  s a cache of poi
36850 6e 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20  nters and sizes 
36860 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75  for a.** consecu
36870 74 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66  tive sequence of
36880 20 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68   cells that migh
36890 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 6d 75 6c  t be held on mul
368a0 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a  tiple pages..*/.
368b0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
368c0 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72  ellArray CellArr
368d0 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41  ay;.struct CellA
368e0 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65  rray {.  int nCe
368f0 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
36900 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
36910 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
36920 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  */.  MemPage *pR
36930 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef;          /* 
36940 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a  Reference page *
36950 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
36960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
36970 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
36980 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
36990 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
369a0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
369b0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
369c0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d  in apCell[] */.}
369d0 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
369e0 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  re the cell size
369f0 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c  s at idx, idx+1,
36a00 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61   ..., idx+N-1 ha
36a10 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75  ve been.** compu
36a20 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
36a30 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c  oid populateCell
36a40 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20  Cache(CellArray 
36a50 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
36a60 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   N){.  assert( i
36a70 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d  dx>=0 && idx+N<=
36a80 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68  p->nCell );.  wh
36a90 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20  ile( N>0 ){.    
36aa0 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c  assert( p->apCel
36ab0 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20  l[idx]!=0 );.   
36ac0 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69   if( p->szCell[i
36ad0 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx]==0 ){.      
36ae0 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d  p->szCell[idx] =
36af0 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
36b00 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
36b10 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20  apCell[idx]);.  
36b20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
36b30 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
36b40 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  B ||.           
36b50 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
36b60 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c  ]==p->pRef->xCel
36b70 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
36b80 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29  ->apCell[idx]) )
36b90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b  ;.    }.    idx+
36ba0 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a  +;.    N--;.  }.
36bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
36bc0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
36bd0 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  Nth element of t
36be0 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f  he cell array.*/
36bf0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
36c00 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70  OINLINE u16 comp
36c10 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  uteCellSize(Cell
36c20 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
36c30 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
36c40 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
36c50 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
36c60 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20  zCell[N]==0 );. 
36c70 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20   p->szCell[N] = 
36c80 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
36c90 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
36ca0 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74  pCell[N]);.  ret
36cb0 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36cc0 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
36cd0 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65  achedCellSize(Ce
36ce0 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36cf0 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
36d00 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
36d10 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43   );.  if( p->szC
36d20 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20  ell[N] ) return 
36d30 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20  p->szCell[N];.  
36d40 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65  return computeCe
36d50 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a  llSize(p, N);.}.
36d60 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
36d70 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70  ell[] contains p
36d80 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c  ointers to nCell
36d90 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c   b-tree page cel
36da0 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65  ls. The .** szCe
36db0 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ll[] array conta
36dc0 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
36dd0 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65  bytes of each ce
36de0 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
36df0 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68  n.** replaces th
36e00 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
36e10 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77  ts of page pPg w
36e20 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
36e30 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   of the cell.** 
36e40 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  array..**.** Som
36e50 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69  e of the cells i
36e60 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63  n apCell[] may c
36e70 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
36e80 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a  ed in pPg. This.
36e90 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  ** function work
36ea0 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  s around problem
36eb0 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73  s caused by this
36ec0 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70   by making a cop
36ed0 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63  y of any .** suc
36ee0 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f  h cells before o
36ef0 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70  verwriting the p
36f00 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  age data..**.** 
36f10 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65  The MemPage.nFre
36f20 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
36f30 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66  idated by this f
36f40 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74  unction. It is t
36f50 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
36f60 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
36f70 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
36f80 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
36f90 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61  ic int rebuildPa
36fa0 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
36fb0 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
36fc0 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
36fd0 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
36fe0 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
36ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37000 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
37010 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
37020 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
37030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37040 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
37050 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
37060 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
37070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
37080 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
37090 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
370a0 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
370b0 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
370c0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
370d0 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
370e0 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
370f0 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
37100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
37110 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
37120 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
37130 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
37140 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
37150 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
37160 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
37170 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
37180 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
37190 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
371a0 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
371b0 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
371c0 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
371d0 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
371e0 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
371f0 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
37200 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
37210 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
37220 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
37230 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
37240 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
37250 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
37260 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
37270 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
37280 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
37290 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61  WITHIN(pCell,aDa
372a0 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  ta,pEnd) ){.    
372b0 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
372c0 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
372d0 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
372e0 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
372f0 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
37300 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44  ptr, (pData - aD
37310 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c  ata));.    pCell
37320 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66  ptr += 2;.    if
37330 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70  ( pData < pCellp
37340 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  tr ) return SQLI
37350 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
37360 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
37370 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  a, pCell, szCell
37380 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [i]);.    assert
37390 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67  ( szCell[i]==pPg
373a0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
373b0 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
373c0 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73  PT_DB );.    tes
373d0 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d  tcase( szCell[i]
373e0 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65  !=pPg->xCellSize
373f0 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20  (pPg,pCell) );. 
37400 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67   }..  /* The pPg
37410 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  ->nFree field is
37420 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65   now set incorre
37430 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ctly. The caller
37440 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f   will fix it. */
37450 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20  .  pPg->nCell = 
37460 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f  nCell;.  pPg->nO
37470 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
37480 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
37490 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75  hdr+1], 0);.  pu
374a0 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
374b0 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c  r+3], pPg->nCell
374c0 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
374d0 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61  Data[hdr+5], pDa
374e0 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61  ta - aData);.  a
374f0 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78  Data[hdr+7] = 0x
37500 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  00;.  return SQL
37510 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
37520 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
37530 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
37540 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
37550 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
37560 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e  zCell.** contain
37570 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
37580 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
37590 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
375a0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
375b0 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c   .** add the cel
375c0 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ls stored in the
375d0 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70   array to page p
375e0 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74  Pg. If it cannot
375f0 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68   (because .** th
37600 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
37610 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20  be defragmented 
37620 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73  before the cells
37630 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d   will fit), non-
37640 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72  zero.** is retur
37650 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
37660 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  if the cells are
37670 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
37680 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20  lly, zero is.** 
37690 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
376a0 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74  Argument pCellpt
376b0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
376c0 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
376d0 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
376e0 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f  array.** (part o
376f0 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70  f page pPg) to p
37700 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63  opulate. After c
37710 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73  ell apCell[0] is
37720 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
37730 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20  ** page body, a 
37740 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73  16-bit offset is
37750 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c   written to pCel
37760 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c  lptr. And so on,
37770 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c   for each.** cel
37780 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  l in the array. 
37790 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
377a0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
377b0 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65  caller to ensure
377c0 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73  .** that it is s
377d0 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65  afe to overwrite
377e0 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
377f0 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
37800 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rray..**.** When
37810 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
37820 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74  s called, *ppDat
37830 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  a points to the 
37840 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a  start of the .**
37850 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e   content area on
37860 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68   page pPg. If th
37870 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
37880 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78  ntent area is ex
37890 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61  tended,.** *ppDa
378a0 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ta is updated to
378b0 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
378c0 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  w start of the c
378d0 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62  ontent area.** b
378e0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
378f0 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
37900 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20  argument pBegin 
37910 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79  points to the by
37920 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  te immediately f
37930 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20  ollowing the.** 
37940 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65  end of the space
37950 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
37960 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63  s page for the c
37970 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
37980 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c   (for.** all cel
37990 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68  ls - not just th
379a0 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20  ose inserted by 
379b0 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c  the current call
379c0 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  ). If the conten
379d0 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62  t.** area must b
379e0 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65  e extended to be
379f0 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20  fore this point 
37a00 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f  in order to acco
37a10 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65  modate all.** ce
37a20 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c  lls in apCell[],
37a30 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20   then the cells 
37a40 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e  do not fit and n
37a50 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
37a60 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
37a70 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  nt pageInsertArr
37a80 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
37a90 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
37aa0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
37ab0 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f   add cells to */
37ac0 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20  .  u8 *pBegin,  
37ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37ae0 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c     /* End of cel
37af0 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l-pointer array 
37b00 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61  */.  u8 **ppData
37b10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37b20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
37b30 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72  Page content -ar
37b40 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ea pointer */.  
37b50 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20  u8 *pCellptr,   
37b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b70 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65  /* Pointer to ce
37b80 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
37b90 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
37ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37bb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
37bc0 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 61   first cell to a
37bd0 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  dd */.  int nCel
37be0 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37bf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
37c00 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
37c10 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65  d to pPg */.  Ce
37c20 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79  llArray *pCArray
37c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37c40 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
37c50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
37c60 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67   u8 *aData = pPg
37c70 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70  ->aData;.  u8 *p
37c80 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a  Data = *ppData;.
37c90 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69    int iEnd = iFi
37ca0 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61  rst + nCell;.  a
37cb0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
37cc0 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66  B || pPg->hdrOff
37cd0 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
37ce0 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  Never called on 
37cf0 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28  page 1 */.  for(
37d00 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64  i=iFirst; i<iEnd
37d10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
37d20 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a  sz, rc;.    u8 *
37d30 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20  pSlot;.    sz = 
37d40 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70  cachedCellSize(p
37d50 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20  CArray, i);.    
37d60 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30  if( (aData[1]==0
37d70 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29   && aData[2]==0)
37d80 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
37d90 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a  eFindSlot(pPg,sz
37da0 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ,&rc))==0 ){.   
37db0 20 20 20 69 66 28 20 28 70 44 61 74 61 20 2d 20     if( (pData - 
37dc0 70 42 65 67 69 6e 29 3c 73 7a 20 29 20 72 65 74  pBegin)<sz ) ret
37dd0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70 44 61  urn 1;.      pDa
37de0 74 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ta -= sz;.      
37df0 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20  pSlot = pData;. 
37e00 20 20 20 7d 0a 20 20 20 20 2f 2a 20 70 53 6c 6f     }.    /* pSlo
37e10 74 20 61 6e 64 20 70 43 41 72 72 61 79 2d 3e 61  t and pCArray->a
37e20 70 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65  pCell[i] will ne
37e30 76 65 72 20 6f 76 65 72 6c 61 70 20 6f 6e 20 61  ver overlap on a
37e40 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20 20   well-formed.   
37e50 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42   ** database.  B
37e60 75 74 20 74 68 65 79 20 6d 69 67 68 74 20 66 6f  ut they might fo
37e70 72 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  r a corrupt data
37e80 62 61 73 65 2e 20 20 48 65 6e 63 65 20 75 73 65  base.  Hence use
37e90 20 6d 65 6d 6d 6f 76 65 28 29 0a 20 20 20 20 2a   memmove().    *
37ea0 2a 20 73 69 6e 63 65 20 6d 65 6d 63 70 79 28 29  * since memcpy()
37eb0 20 73 65 6e 64 73 20 53 49 47 41 42 4f 52 54 20   sends SIGABORT 
37ec0 77 69 74 68 20 6f 76 65 72 6c 61 70 70 69 6e 67  with overlapping
37ed0 20 62 75 66 66 65 72 73 20 6f 6e 20 4f 70 65 6e   buffers on Open
37ee0 42 53 44 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  BSD */.    asser
37ef0 74 28 20 28 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70  t( (pSlot+sz)<=p
37f00 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
37f10 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 53  ].         || pS
37f20 6c 6f 74 3e 3d 28 70 43 41 72 72 61 79 2d 3e 61  lot>=(pCArray->a
37f30 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20  pCell[i]+sz).   
37f40 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
37f50 5f 44 42 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f  _DB );.    memmo
37f60 76 65 28 70 53 6c 6f 74 2c 20 70 43 41 72 72 61  ve(pSlot, pCArra
37f70 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a  y->apCell[i], sz
37f80 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
37f90 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74  pCellptr, (pSlot
37fa0 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20   - aData));.    
37fb0 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20  pCellptr += 2;. 
37fc0 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70   }.  *ppData = p
37fd0 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30  Data;.  return 0
37fe0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
37ff0 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
38000 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72  ns nCell pointer
38010 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c  s to b-tree cell
38020 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20  s. Array szCell 
38030 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  .** contains the
38040 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
38050 66 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c  f each such cell
38060 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
38070 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63  adds the.** spac
38080 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
38090 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74  h each cell in t
380a0 68 65 20 61 72 72 61 79 20 74 68 61 74 20 69 73  he array that is
380b0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
380c0 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  d .** within the
380d0 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20   body of pPg to 
380e0 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73  the pPg free-lis
380f0 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  t. The cell-poin
38100 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a  ters and other.*
38110 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  * fields of the 
38120 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64  page are not upd
38130 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
38140 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
38150 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
38160 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65  er of cells adde
38170 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
38180 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
38190 74 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28  t pageFreeArray(
381a0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c  .  MemPage *pPg,
381b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
381c0 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64     /* Page to ed
381d0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  it */.  int iFir
381e0 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
381f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
38200 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20   cell to delete 
38210 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
38220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38230 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f       /* Cells to
38240 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c   delete */.  Cel
38250 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20  lArray *pCArray 
38260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38270 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a  Array of cells *
38280 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  /.){.  u8 * cons
38290 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61  t aData = pPg->a
382a0 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e  Data;.  u8 * con
382b0 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61  st pEnd = &aData
382c0 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  [pPg->pBt->usabl
382d0 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63  eSize];.  u8 * c
382e0 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26 61  onst pStart = &a
382f0 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66  Data[pPg->hdrOff
38300 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63  set + 8 + pPg->c
38310 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20  hildPtrSize];.  
38320 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20  int nRet = 0;.  
38330 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e  int i;.  int iEn
38340 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65  d = iFirst + nCe
38350 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20  ll;.  u8 *pFree 
38360 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65  = 0;.  int szFre
38370 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
38380 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20  iFirst; i<iEnd; 
38390 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
383a0 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61  ell = pCArray->a
383b0 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66  pCell[i];.    if
383c0 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28  ( SQLITE_WITHIN(
383d0 70 43 65 6c 6c 2c 20 70 53 74 61 72 74 2c 20 70  pCell, pStart, p
383e0 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  End) ){.      in
383f0 74 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a 20 4e  t sz;.      /* N
38400 6f 20 6e 65 65 64 20 74 6f 20 75 73 65 20 63 61  o need to use ca
38410 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 29 20 68  chedCellSize() h
38420 65 72 65 2e 20 20 54 68 65 20 73 69 7a 65 73 20  ere.  The sizes 
38430 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 74 68 61  of all cells tha
38440 74 0a 20 20 20 20 20 20 2a 2a 20 61 72 65 20 74  t.      ** are t
38450 6f 20 62 65 20 66 72 65 65 64 20 68 61 76 65 20  o be freed have 
38460 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6f 6d  already been com
38470 7