/ Hex Artifact Content
Login

Artifact 4c8caaeed7878aafdb607c3d2bcbc365bb0d19a1:


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 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
3040: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
3050: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
3060: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
3070: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
3080: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
3090: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
30a0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
30b0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
30c0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
30d0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
30e0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
30f0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
3100: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
3110: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
3120: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
3130: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
3140: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
3150: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
3160: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
3170: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
3180: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
3190: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
31a0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
31b0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
31c0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
31d0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
31e0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
3200: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
3210: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
3220: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3230: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3240: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
3250: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
3260: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
3270: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
3280: 0a 2a 2a 20 74 68 65 20 73 65 74 53 68 61 72 65  .** the setShare
3290: 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
32a0: 29 20 70 72 6f 63 65 64 75 72 65 29 20 68 65 6c  ) procedure) hel
32b0: 64 20 62 79 20 42 74 72 65 65 20 6f 62 6a 65 63  d by Btree objec
32c0: 74 20 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  t p..**.** This 
32d0: 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
32e0: 20 74 68 61 74 20 42 74 72 65 65 20 70 20 68 61   that Btree p ha
32f0: 73 20 61 6e 20 6f 70 65 6e 20 72 65 61 64 20 6f  s an open read o
3300: 72 20 77 72 69 74 65 20 0a 2a 2a 20 74 72 61 6e  r write .** tran
3310: 73 61 63 74 69 6f 6e 2e 20 49 66 20 69 74 20 64  saction. If it d
3320: 6f 65 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68  oes not, then th
3330: 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c  e BTS_PENDING fl
3340: 61 67 0a 2a 2a 20 6d 61 79 20 62 65 20 69 6e 63  ag.** may be inc
3350: 6f 72 72 65 63 74 6c 79 20 63 6c 65 61 72 65 64  orrectly cleared
3360: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3370: 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
3380: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42  acheTableLocks(B
3390: 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68  tree *p){.  BtSh
33a0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
33b0: 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a 70  Bt;.  BtLock **p
33c0: 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70 4c  pIter = &pBt->pL
33d0: 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ock;..  assert( 
33e0: 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
33f0: 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
3400: 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61 62  ssert( p->sharab
3410: 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65 72  le || 0==*ppIter
3420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
3430: 3e 69 6e 54 72 61 6e 73 3e 30 20 29 3b 0a 0a 20  >inTrans>0 );.. 
3440: 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72 20   while( *ppIter 
3450: 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
3460: 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a  Lock = *ppIter;.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 42 74      assert( (pBt
3480: 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
3490: 5f 45 58 43 4c 55 53 49 56 45 29 3d 3d 30 20 7c  _EXCLUSIVE)==0 |
34a0: 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d  | pBt->pWriter==
34b0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
34c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f  .    assert( pLo
34d0: 63 6b 2d 3e 70 42 74 72 65 65 2d 3e 69 6e 54 72  ck->pBtree->inTr
34e0: 61 6e 73 3e 3d 70 4c 6f 63 6b 2d 3e 65 4c 6f 63  ans>=pLock->eLoc
34f0: 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f  k );.    if( pLo
3500: 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b  ck->pBtree==p ){
3510: 0a 20 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d  .      *ppIter =
3520: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLock->pNext;. 
3530: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f       assert( pLo
3540: 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 7c 7c  ck->iTable!=1 ||
3550: 20 70 4c 6f 63 6b 3d 3d 26 70 2d 3e 6c 6f 63 6b   pLock==&p->lock
3560: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
3570: 6f 63 6b 2d 3e 69 54 61 62 6c 65 21 3d 31 20 29  ock->iTable!=1 )
3580: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3590: 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a 20  3_free(pLock);. 
35a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
35b0: 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d  {.      ppIter =
35c0: 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a   &pLock->pNext;.
35d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73      }.  }..  ass
35e0: 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
35f0: 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
3600: 47 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57  G)==0 || pBt->pW
3610: 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28 20 70  riter );.  if( p
3620: 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29  Bt->pWriter==p )
3630: 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74  {.    pBt->pWrit
3640: 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  er = 0;.    pBt-
3650: 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 28 42  >btsFlags &= ~(B
3660: 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42 54 53  TS_EXCLUSIVE|BTS
3670: 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 7d 65 6c  _PENDING);.  }el
3680: 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 61  se if( pBt->nTra
3690: 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a 20  nsaction==2 ){. 
36a0: 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74     /* This funct
36b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
36c0: 65 6e 20 42 74 72 65 65 20 70 20 69 73 20 63 6f  en Btree p is co
36d0: 6e 63 6c 75 64 69 6e 67 20 69 74 73 20 0a 20 20  ncluding its .  
36e0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
36f0: 2e 20 49 66 20 74 68 65 72 65 20 63 75 72 72 65  . If there curre
3700: 6e 74 6c 79 20 65 78 69 73 74 73 20 61 20 77 72  ntly exists a wr
3710: 69 74 65 72 2c 20 61 6e 64 20 70 20 69 73 20 6e  iter, and p is n
3720: 6f 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  ot.    ** that w
3730: 72 69 74 65 72 2c 20 74 68 65 6e 20 74 68 65 20  riter, then the 
3740: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
3750: 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
3760: 6f 6e 73 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a  ons other.    **
3770: 20 74 68 61 6e 20 74 68 65 20 77 72 69 74 65 72   than the writer
3780: 20 6d 75 73 74 20 62 65 20 61 62 6f 75 74 20 74   must be about t
3790: 6f 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2e 20  o drop to zero. 
37a0: 49 6e 20 74 68 69 73 20 63 61 73 65 0a 20 20 20  In this case.   
37b0: 20 2a 2a 20 73 65 74 20 74 68 65 20 42 54 53 5f   ** set the BTS_
37c0: 50 45 4e 44 49 4e 47 20 66 6c 61 67 20 74 6f 20  PENDING flag to 
37d0: 30 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0..    **.    **
37e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 74   If there is not
37f0: 20 63 75 72 72 65 6e 74 6c 79 20 61 20 77 72 69   currently a wri
3800: 74 65 72 2c 20 74 68 65 6e 20 42 54 53 5f 50 45  ter, then BTS_PE
3810: 4e 44 49 4e 47 20 6d 75 73 74 0a 20 20 20 20 2a  NDING must.    *
3820: 2a 20 62 65 20 7a 65 72 6f 20 61 6c 72 65 61 64  * be zero alread
3830: 79 2e 20 53 6f 20 74 68 69 73 20 6e 65 78 74 20  y. So this next 
3840: 6c 69 6e 65 20 69 73 20 68 61 72 6d 6c 65 73 73  line is harmless
3850: 20 69 6e 20 74 68 61 74 20 63 61 73 65 2e 0a 20   in that case.. 
3860: 20 20 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 62     */.    pBt->b
3870: 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
3880: 50 45 4e 44 49 4e 47 3b 0a 20 20 7d 0a 7d 0a 0a  PENDING;.  }.}..
3890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
38a0: 69 6f 6e 20 63 68 61 6e 67 65 73 20 61 6c 6c 20  ion changes all 
38b0: 77 72 69 74 65 2d 6c 6f 63 6b 73 20 68 65 6c 64  write-locks held
38c0: 20 62 79 20 42 74 72 65 65 20 70 20 69 6e 74 6f   by Btree p into
38d0: 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 0a 2a 2f 0a   read-locks..*/.
38e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 6f 77 6e  static void down
38f0: 67 72 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61  gradeAllSharedCa
3900: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 42 74  cheTableLocks(Bt
3910: 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61  ree *p){.  BtSha
3920: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
3930: 74 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57  t;.  if( pBt->pW
3940: 72 69 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20  riter==p ){.    
3950: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 20  BtLock *pLock;. 
3960: 20 20 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20     pBt->pWriter 
3970: 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 62 74  = 0;.    pBt->bt
3980: 73 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 53 5f  sFlags &= ~(BTS_
3990: 45 58 43 4c 55 53 49 56 45 7c 42 54 53 5f 50 45  EXCLUSIVE|BTS_PE
39a0: 4e 44 49 4e 47 29 3b 0a 20 20 20 20 66 6f 72 28  NDING);.    for(
39b0: 70 4c 6f 63 6b 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pLock=pBt->pLock
39c0: 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d 70  ; pLock; pLock=p
39d0: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Lock->pNext){.  
39e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 6f 63      assert( pLoc
39f0: 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c  k->eLock==READ_L
3a00: 4f 43 4b 20 7c 7c 20 70 4c 6f 63 6b 2d 3e 70 42  OCK || pLock->pB
3a10: 74 72 65 65 3d 3d 70 20 29 3b 0a 20 20 20 20 20  tree==p );.     
3a20: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20   pLock->eLock = 
3a30: 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d  READ_LOCK;.    }
3a40: 0a 20 20 7d 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  .  }.}..#endif /
3a50: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  * SQLITE_OMIT_SH
3a60: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73  ARED_CACHE */..s
3a70: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
3a80: 73 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  sePage(MemPage *
3a90: 70 50 61 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77  pPage);  /* Forw
3aa0: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
3ab0: 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20 54 68 69 73 20  ../*.***** This 
3ac0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3ad0: 69 6e 73 69 64 65 20 6f 66 20 61 73 73 65 72 74  inside of assert
3ae0: 28 29 20 6f 6e 6c 79 20 2a 2a 2a 2a 0a 2a 2a 0a  () only ****.**.
3af0: 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  ** Verify that t
3b00: 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64 73 20  he cursor holds 
3b10: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 69 74 73  the mutex on its
3b20: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
3b40: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 75 72 73  .static int curs
3b50: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 42 74 43  orHoldsMutex(BtC
3b60: 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 72 65 74  ursor *p){.  ret
3b70: 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  urn sqlite3_mute
3b80: 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d  x_held(p->pBt->m
3b90: 75 74 65 78 29 3b 0a 7d 0a 73 74 61 74 69 63 20  utex);.}.static 
3ba0: 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  int cursorOwnsBt
3bb0: 53 68 61 72 65 64 28 42 74 43 75 72 73 6f 72 20  Shared(BtCursor 
3bc0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  *p){.  assert( c
3bd0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
3be0: 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  p) );.  return (
3bf0: 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70  p->pBtree->db==p
3c00: 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a 23 65  ->pBt->db);.}.#e
3c10: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  ndif../*.** Inva
3c20: 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65 72 66  lidate the overf
3c30: 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74 68 65  low cache of the
3c40: 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61   cursor passed a
3c50: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
3c60: 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68 65 20  ment..** on the 
3c70: 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74 72  shared btree str
3c80: 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 23  ucture pBt..*/.#
3c90: 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64 61 74  define invalidat
3ca0: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3cb0: 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75 72 46  Cur) (pCur->curF
3cc0: 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f 56 61  lags &= ~BTCF_Va
3cd0: 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a 2a 20  lidOvfl)../*.** 
3ce0: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
3cf0: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
3d00: 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20  t cache for all 
3d10: 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  cursors opened.*
3d20: 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20  * on the shared 
3d30: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
3d40: 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pBt..*/.static v
3d50: 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  oid invalidateAl
3d60: 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42  lOverflowCache(B
3d70: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
3d80: 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20   BtCursor *p;.  
3d90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
3da0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
3db0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28  mutex) );.  for(
3dc0: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
3dd0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
3de0: 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76      invalidateOv
3df0: 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a  erflowCache(p);.
3e00: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
3e10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
3e20: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  LOB./*.** This f
3e30: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
3e40: 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  d before modifyi
3e50: 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ng the contents 
3e60: 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20 74 6f  of a table.** to
3e70: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20   invalidate any 
3e80: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
3e90: 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e 20 6f   that are open o
3ea0: 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f 72 20  n the.** row or 
3eb0: 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77 73 20  one of the rows 
3ec0: 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 0a  being modified..
3ed0: 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
3ee0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
3ef0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
3f00: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
3f10: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65   of the.** table
3f20: 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
3f30: 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73  deleted. In this
3f40: 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65   case invalidate
3f50: 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a 2a 2a   all incrblob.**
3f60: 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
3f70: 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69 6e 20   any row within 
3f80: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
3f90: 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52 6f 6f  oot-page pgnoRoo
3fa0: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
3fb0: 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e 74 20  se, if argument 
3fc0: 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69 73 20  isClearTable is 
3fd0: 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68 65 20  false, then the 
3fe0: 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f 77 69  row with.** rowi
3ff0: 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e 67 20  d iRow is being 
4000: 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65 6c 65  replaced or dele
4010: 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ted. In this cas
4020: 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a 2a 20  e invalidate.** 
4030: 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63 72 62  only those incrb
4040: 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
4050: 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69 66 69   on that specifi
4060: 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  c row..*/.static
4070: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
4080: 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72 73 28  IncrblobCursors(
4090: 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
40a0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
40b0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
40c0: 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 36  to check */.  i6
40d0: 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20 20 20  4 iRow,         
40e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 77        /* The row
40f0: 69 64 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  id that might be
4100: 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20 20 69   changing */.  i
4110: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
4120: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
4130: 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 62  f all rows are b
4140: 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
4150: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
4160: 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 2d 3e  ;.  if( pBtree->
4170: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 3d 3d  hasIncrblobCur==
4180: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4190: 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
41a0: 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
41b0: 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72 65 65  ree) );.  pBtree
41c0: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
41d0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 42   = 0;.  for(p=pB
41e0: 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
41f0: 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
4200: 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e  t){.    if( (p->
4210: 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
4220: 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29 7b 0a  Incrblob)!=0 ){.
4230: 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e 68 61        pBtree->ha
4240: 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d 20 31  sIncrblobCur = 1
4250: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 43 6c  ;.      if( isCl
4260: 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d 3e 69  earTable || p->i
4270: 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 20 29  nfo.nKey==iRow )
4280: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  {.        p->eSt
4290: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
42a0: 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ALID;.      }.  
42b0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c 73 65    }.  }.}..#else
42c0: 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e 63 74  .  /* Stub funct
42d0: 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42 4c 4f  ion when INCRBLO
42e0: 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a 2f 0a  B is omitted */.
42f0: 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69    #define invali
4300: 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73  dateIncrblobCurs
4310: 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  ors(x,y,z).#endi
4320: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
4330: 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
4340: 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67 6e 6f  .** Set bit pgno
4350: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64   of the BtShared
4360: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4370: 76 65 63 2e 20 54 68 69 73 20 69 73 20 63 61 6c  vec. This is cal
4380: 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61 20 70  led .** when a p
4390: 61 67 65 20 74 68 61 74 20 70 72 65 76 69 6f 75  age that previou
43a0: 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 64 61  sly contained da
43b0: 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66 72 65  ta becomes a fre
43c0: 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a 2a 20  e-list leaf .** 
43d0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
43e0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
43f0: 74 65 6e 74 20 62 69 74 76 65 63 20 65 78 69 73  tent bitvec exis
4400: 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  ts to work aroun
4410: 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a 2a 20  d an obscure.** 
4420: 62 75 67 20 63 61 75 73 65 64 20 62 79 20 74 68  bug caused by th
4430: 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20 6f 66  e interaction of
4440: 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f 20 6f   two useful IO o
4450: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73 75 72  ptimizations sur
4460: 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72 65 65  rounding.** free
4470: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4480: 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65  :.**.**   1) Whe
4490: 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20 64 65  n all data is de
44a0: 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70 61 67  leted from a pag
44b0: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 62  e and the page b
44c0: 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 61  ecomes.**      a
44d0: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
44e0: 70 61 67 65 2c 20 74 68 65 20 70 61 67 65 20 69  page, the page i
44f0: 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 6f  s not written to
4500: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
4510: 20 20 20 20 20 20 28 61 73 20 66 72 65 65 2d 6c        (as free-l
4520: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 20 63  ist leaf pages c
4530: 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e 69 6e  ontain no meanin
4540: 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f 6d 65  gful data). Some
4550: 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20 73 75  times.**      su
4560: 63 68 20 61 20 70 61 67 65 20 69 73 20 6e 6f 74  ch a page is not
4570: 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c 65 64   even journalled
4580: 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74   (as it will not
4590: 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a   be modified,.**
45a0: 20 20 20 20 20 20 77 68 79 20 62 6f 74 68 65 72        why bother
45b0: 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69 74 3f   journalling it?
45c0: 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68  )..**.**   2) Wh
45d0: 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  en a free-list l
45e0: 65 61 66 20 70 61 67 65 20 69 73 20 72 65 75 73  eaf page is reus
45f0: 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  ed, its content 
4600: 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a 20 20  is not read.**  
4610: 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64 61 74      from the dat
4620: 61 62 61 73 65 20 6f 72 20 77 72 69 74 74 65 6e  abase or written
4630: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
4640: 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75 6c 64  file (why should
4650: 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65 2c 20   it.**      be, 
4660: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 74 20  if it is not at 
4670: 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c 3f 29  all meaningful?)
4680: 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65 6d 73  ..**.** By thems
4690: 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f 70 74  elves, these opt
46a0: 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72 6b 20  imizations work 
46b0: 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69 64 65  fine and provide
46c0: 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65 72 66   a handy.** perf
46d0: 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20 74 6f  ormance boost to
46e0: 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f 72 20   bulk delete or 
46f0: 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69 6f 6e  insert operation
4700: 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 0a 2a  s. However, if.*
4710: 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  * a page is move
4720: 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69  d to the free-li
4730: 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65 75 73  st and then reus
4740: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ed within the sa
4750: 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  me.** transactio
4760: 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63 6f 6d  n, a problem com
4770: 65 73 20 75 70 2e 20 49 66 20 74 68 65 20 70 61  es up. If the pa
4780: 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72 6e 61  ge is not journa
4790: 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69 74 20  lled when.** it 
47a0: 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  is moved to the 
47b0: 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 69 74  free-list and it
47c0: 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a 6f 75   is also not jou
47d0: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 0a  rnalled when it.
47e0: 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65 64 20  ** is extracted 
47f0: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
4800: 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c 20 74  st and reused, t
4810: 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hen the original
4820: 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62 65 20   data.** may be 
4830: 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65 76 65  lost. In the eve
4840: 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  nt of a rollback
4850: 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  , it may not be 
4860: 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 72  possible.** to r
4870: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
4880: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
4890: 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  nal configuratio
48a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 6f 6c  n..**.** The sol
48b0: 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42 74 53  ution is the BtS
48c0: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
48d0: 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  t bitvec. Whenev
48e0: 65 72 20 61 20 70 61 67 65 20 69 73 20 0a 2a 2a  er a page is .**
48f0: 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f 6d 65   moved to become
4900: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
4910: 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f 72 72  f page, the corr
4920: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
4930: 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65 20 62  .** set in the b
4940: 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20  itvec. Whenever 
4950: 61 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 65  a leaf page is e
4960: 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
4970: 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a 2a 20  e free-list,.** 
4980: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32 20 61  optimization 2 a
4990: 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65 64 20  bove is omitted 
49a0: 69 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  if the correspon
49b0: 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c 72 65  ding bit is alre
49c0: 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20 42 74  ady.** set in Bt
49d0: 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65  Shared.pHasConte
49e0: 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73  nt. The contents
49f0: 20 6f 66 20 74 68 65 20 62 69 74 76 65 63 20 61   of the bitvec a
4a00: 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20 61 74  re cleared.** at
4a10: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
4a20: 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  y transaction..*
4a30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
4a40: 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
4a50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
4a60: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74  gno pgno){.  int
4a70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
4a80: 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 48 61  .  if( !pBt->pHa
4a90: 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20  sContent ){.    
4aa0: 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d 70 42  assert( pgno<=pB
4ab0: 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20 20 20  t->nPage );.    
4ac0: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4ad0: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
4ae0: 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50 61 67  Create(pBt->nPag
4af0: 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70 42 74  e);.    if( !pBt
4b00: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4b10: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
4b20: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
4b30: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
4b40: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67 6e 6f 3c  LITE_OK && pgno<
4b50: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  =sqlite3BitvecSi
4b60: 7a 65 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  ze(pBt->pHasCont
4b70: 65 6e 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ent) ){.    rc =
4b80: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
4b90: 74 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65  t(pBt->pHasConte
4ba0: 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  nt, pgno);.  }. 
4bb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4bc0: 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68 65 20 42  *.** Query the B
4bd0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4be0: 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a 2a 0a 2a  ent vector..**.*
4bf0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
4c00: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
4c10: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4c20: 70 61 67 65 20 69 73 20 72 65 6d 6f 76 65 64 20  page is removed 
4c30: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66 72 65 65  from the.** free
4c40: 2d 6c 69 73 74 20 66 6f 72 20 72 65 75 73 65 2e  -list for reuse.
4c50: 20 49 74 20 72 65 74 75 72 6e 73 20 66 61 6c 73   It returns fals
4c60: 65 20 69 66 20 69 74 20 69 73 20 73 61 66 65 20  e if it is safe 
4c70: 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65 0a  to retrieve the.
4c80: 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ** page from the
4c90: 20 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74   pager layer wit
4ca0: 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e  h the 'no-conten
4cb0: 74 27 20 66 6c 61 67 20 73 65 74 2e 20 54 72 75  t' flag set. Tru
4cc0: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
4cd0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
4ce0: 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74  GetHasContent(Bt
4cf0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
4d00: 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69 74 76 65  o pgno){.  Bitve
4d10: 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70 48 61 73  c *p = pBt->pHas
4d20: 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65 74 75 72  Content;.  retur
4d30: 6e 20 28 70 20 26 26 20 28 70 67 6e 6f 3e 73 71  n (p && (pgno>sq
4d40: 6c 69 74 65 33 42 69 74 76 65 63 53 69 7a 65 28  lite3BitvecSize(
4d50: 70 29 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  p) || sqlite3Bit
4d60: 76 65 63 54 65 73 74 28 70 2c 20 70 67 6e 6f 29  vecTest(p, pgno)
4d70: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  ));.}../*.** Cle
4d80: 61 72 20 28 64 65 73 74 72 6f 79 29 20 74 68 65  ar (destroy) the
4d90: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4da0: 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 54 68  ntent bitvec. Th
4db0: 69 73 20 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20  is should be.** 
4dc0: 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63  invoked at the c
4dd0: 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 65 61 63  onclusion of eac
4de0: 68 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  h write-transact
4df0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ion..*/.static v
4e00: 6f 69 64 20 62 74 72 65 65 43 6c 65 61 72 48 61  oid btreeClearHa
4e10: 73 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65  sContent(BtShare
4e20: 64 20 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74  d *pBt){.  sqlit
4e30: 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
4e40: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4e50: 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  );.  pBt->pHasCo
4e60: 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ntent = 0;.}../*
4e70: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20  .** Release all 
4e80: 6f 66 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20  of the apPage[] 
4e90: 70 61 67 65 73 20 66 6f 72 20 61 20 63 75 72 73  pages for a curs
4ea0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
4eb0: 69 64 20 62 74 72 65 65 52 65 6c 65 61 73 65 41  id btreeReleaseA
4ec0: 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 42 74  llCursorPages(Bt
4ed0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
4ee0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
4ef0: 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67  0; i<=pCur->iPag
4f00: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  e; i++){.    rel
4f10: 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61  easePage(pCur->a
4f20: 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 70  pPage[i]);.    p
4f30: 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d  Cur->apPage[i] =
4f40: 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e   0;.  }.  pCur->
4f50: 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d 0a 0a 2f  iPage = -1;.}../
4f60: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
4f70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
4f80: 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74  ly argument must
4f90: 20 70 6f 69 6e 74 20 74 6f 20 61 20 76 61 6c 69   point to a vali
4fa0: 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68 65 6e 20  d entry.** when 
4fb0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
4fc0: 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 20 68 61   called (i.e. ha
4fd0: 76 65 20 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  ve eState==CURSO
4fe0: 52 5f 56 41 4c 49 44 29 2e 20 54 68 69 73 0a 2a  R_VALID). This.*
4ff0: 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61 76 65 73  * function saves
5000: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
5010: 73 6f 72 20 6b 65 79 20 69 6e 20 76 61 72 69 61  sor key in varia
5020: 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b 65 79 20  bles pCur->nKey 
5030: 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e 70 4b 65  and.** pCur->pKe
5040: 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  y. SQLITE_OK is 
5050: 72 65 74 75 72 6e 65 64 20 69 66 20 73 75 63 63  returned if succ
5060: 65 73 73 66 75 6c 20 6f 72 20 61 6e 20 53 51 4c  essful or an SQL
5070: 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a 20 63 6f  ite error .** co
5080: 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a  de otherwise..**
5090: 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
50a0: 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 6e 20  r is open on an 
50b0: 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
50c0: 65 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  en the integer k
50d0: 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f 77 69 64  ey.** (the rowid
50e0: 29 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  ) is stored in p
50f0: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 20 70 43  Cur->nKey and pC
5100: 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c 65 66 74  ur->pKey is left
5110: 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55 4c 4c 2e   set to.** NULL.
5120: 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
5130: 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e 6f 6e 2d  s open on a non-
5140: 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
5150: 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73  en pCur->pKey is
5160: 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e   .** set to poin
5170: 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 65 64 20  t to a malloced 
5180: 62 75 66 66 65 72 20 70 43 75 72 2d 3e 6e 4b 65  buffer pCur->nKe
5190: 79 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20  y bytes in size 
51a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a 2a 20 74  containing .** t
51b0: 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61 74 69  he key..*/.stati
51c0: 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72  c int saveCursor
51d0: 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
51e0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
51f0: 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
5200: 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
5210: 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ate );.  assert(
5220: 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29   0==pCur->pKey )
5230: 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
5240: 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
5250: 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  r) );..  rc = sq
5260: 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
5270: 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e 6e  e(pCur, &pCur->n
5280: 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
5290: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
52a0: 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28 29 20 63    /* KeySize() c
52b0: 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 0a 20  annot fail */.. 
52c0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
52d0: 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20  n intKey table, 
52e0: 74 68 65 6e 20 74 68 65 20 61 62 6f 76 65 20 63  then the above c
52f0: 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b 65 79 53  all to BtreeKeyS
5300: 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65  ize().  ** store
5310: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65  s the integer ke
5320: 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e  y in pCur->nKey.
5330: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
5340: 69 73 20 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a  is value is.  **
5350: 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71   all that is req
5360: 75 69 72 65 64 2e 20 4f 74 68 65 72 77 69 73 65  uired. Otherwise
5370: 2c 20 69 66 20 70 43 75 72 20 69 73 20 6e 6f 74  , if pCur is not
5380: 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b   open on an intK
5390: 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74  ey.  ** table, t
53a0: 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65  hen malloc space
53b0: 20 66 6f 72 20 61 6e 64 20 73 74 6f 72 65 20 74   for and store t
53c0: 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79  he pCur->nKey by
53d0: 74 65 73 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a  tes of key .  **
53e0: 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20 69 66 28   data.  */.  if(
53f0: 20 30 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74   0==pCur->curInt
5400: 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  Key ){.    void 
5410: 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  *pKey = sqlite3M
5420: 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b 65  alloc( pCur->nKe
5430: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  y );.    if( pKe
5440: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
5450: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
5460: 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 70 43  pCur, 0, (int)pC
5470: 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65 79 29 3b  ur->nKey, pKey);
5480: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
5490: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
54a0: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
54b0: 20 70 4b 65 79 3b 0a 20 20 20 20 20 20 7d 65 6c   pKey;.      }el
54c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
54d0: 74 65 33 5f 66 72 65 65 28 70 4b 65 79 29 3b 0a  te3_free(pKey);.
54e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
54f0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
5500: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
5510: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
5520: 21 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  !pCur->curIntKey
5530: 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20   || !pCur->pKey 
5540: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
5550: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68  }../*.** Save th
5560: 65 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  e current cursor
5570: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
5580: 20 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72   variables BtCur
5590: 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64  sor.nKey .** and
55a0: 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20   BtCursor.pKey. 
55b0: 54 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61  The cursor's sta
55c0: 74 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52  te is set to CUR
55d0: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e  SOR_REQUIRESEEK.
55e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
55f0: 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68  r must ensure th
5600: 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  at the cursor is
5610: 20 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61   valid (has eSta
5620: 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
5630: 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61  ).** prior to ca
5640: 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  lling this routi
5650: 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ne.  .*/.static 
5660: 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f  int saveCursorPo
5670: 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20  sition(BtCursor 
5680: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5690: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  ;..  assert( CUR
56a0: 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
56b0: 3e 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f  >eState || CURSO
56c0: 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72  R_SKIPNEXT==pCur
56d0: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
56e0: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
56f0: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
5700: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
5710: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66  x(pCur) );..  if
5720: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
5730: 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
5740: 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
5750: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
5760: 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ID;.  }else{.   
5770: 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
5780: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  = 0;.  }..  rc =
5790: 20 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70   saveCursorKey(p
57a0: 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
57b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
57c0: 20 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c   btreeReleaseAll
57d0: 43 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72  CursorPages(pCur
57e0: 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  );.    pCur->eSt
57f0: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
5800: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
5810: 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
5820: 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e  &= ~(BTCF_ValidN
5830: 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
5840: 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b  fl|BTCF_AtLast);
5850: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5860: 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65  ./* Forward refe
5870: 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20  rence */.static 
5880: 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  int SQLITE_NOINL
5890: 49 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f  INE saveCursorsO
58a0: 6e 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c  nList(BtCursor*,
58b0: 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b  Pgno,BtCursor*);
58c0: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
58d0: 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c   positions of al
58e0: 6c 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70  l cursors (excep
58f0: 74 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20  t pExcept) that 
5900: 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74  are open on.** t
5910: 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f  he table with ro
5920: 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20  ot-page iRoot.  
5930: 22 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73  "Saving the curs
5940: 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61  or position" mea
5950: 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c  ns that.** the l
5960: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62  ocation in the b
5970: 74 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72  tree is remember
5980: 65 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ed in such a way
5990: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a   that it can be.
59a0: 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f  ** moved back to
59b0: 20 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61   the same spot a
59c0: 66 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68  fter the btree h
59d0: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
59e0: 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69  .  This.** routi
59f0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  ne is called jus
5a00: 74 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20  t before cursor 
5a10: 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20  pExcept is used 
5a20: 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a  to modify the.**
5a30: 20 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d   table, for exam
5a40: 70 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65  ple in BtreeDele
5a50: 74 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73  te() or BtreeIns
5a60: 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ert()..**.** If 
5a70: 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
5a80: 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e   more cursors on
5a90: 20 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c   the same btree,
5aa0: 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a   then all such .
5ab0: 2a 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c  ** cursors shoul
5ac0: 64 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43  d have their BTC
5ad0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5ae0: 73 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43  set.  The btreeC
5af0: 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69  ursor().** routi
5b00: 6e 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74  ne enforces that
5b10: 20 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75   rule.  This rou
5b20: 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20  tine only needs 
5b30: 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a  to be called in.
5b40: 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20  ** the uncommon 
5b50: 63 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63  case when pExpec
5b60: 74 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d  t has the BTCF_M
5b70: 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74  ultiple flag set
5b80: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65  ..**.** If pExpe
5b90: 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20  ct!=NULL and if 
5ba0: 6e 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73  no other cursors
5bb0: 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68   are found on th
5bc0: 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65  e same root-page
5bd0: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54  ,.** then the BT
5be0: 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
5bf0: 20 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63   on pExpect is c
5c00: 6c 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64  leared, to avoid
5c10: 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e   another.** poin
5c20: 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68  tless call to th
5c30: 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
5c40: 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
5c50: 20 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75   note:  This rou
5c60: 74 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63  tine merely chec
5c70: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79  ks to see if any
5c80: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64   cursors.** need
5c90: 20 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49   to be saved.  I
5ca0: 74 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73  t calls out to s
5cb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5cc0: 28 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75  () in the (unusu
5cd0: 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61  al).** event tha
5ce0: 74 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  t cursors are in
5cf0: 20 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73   need to being s
5d00: 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aved..*/.static 
5d10: 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f  int saveAllCurso
5d20: 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
5d30: 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74  , Pgno iRoot, Bt
5d40: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29  Cursor *pExcept)
5d50: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
5d60: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5d70: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
5d80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
5d90: 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d  ssert( pExcept==
5da0: 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42  0 || pExcept->pB
5db0: 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28  t==pBt );.  for(
5dc0: 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
5dd0: 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
5de0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
5df0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
5e00: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
5e10: 69 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a  iRoot) ) break;.
5e20: 20 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65    }.  if( p ) re
5e30: 74 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73  turn saveCursors
5e40: 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c  OnList(p, iRoot,
5e50: 20 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28   pExcept);.  if(
5e60: 20 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65   pExcept ) pExce
5e70: 70 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  pt->curFlags &= 
5e80: 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a  ~BTCF_Multiple;.
5e90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5ea0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68  OK;.}../* This h
5eb0: 65 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f  elper routine to
5ec0: 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20   saveAllCursors 
5ed0: 64 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20  does the actual 
5ee0: 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a  work of saving.*
5ef0: 2a 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66  * the cursors if
5f00: 20 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73   and when a curs
5f10: 6f 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  or is found that
5f20: 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72   actually requir
5f30: 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68  es saving..** Th
5f40: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73  e common case is
5f50: 20 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73   that no cursors
5f60: 20 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65   need to be save
5f70: 64 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  d, so this routi
5f80: 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20  ne is.** broken 
5f90: 6f 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c  out from its cal
5fa0: 6c 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e  ler to avoid unn
5fb0: 65 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70  ecessary stack p
5fc0: 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e  ointer movement.
5fd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
5fe0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73  QLITE_NOINLINE s
5ff0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
6000: 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c  (.  BtCursor *p,
6010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6020: 66 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61  first cursor tha
6030: 74 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a  t needs saving *
6040: 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20  /.  Pgno iRoot, 
6050: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
6060: 20 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74   save cursor wit
6070: 68 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61  h this iRoot. Sa
6080: 76 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a  ve all if zero *
6090: 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45  /.  BtCursor *pE
60a0: 78 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e  xcept    /* Do n
60b0: 6f 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72  ot save this cur
60c0: 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a  sor */.){.  do{.
60d0: 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65      if( p!=pExce
60e0: 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20  pt && (0==iRoot 
60f0: 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  || p->pgnoRoot==
6100: 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20  iRoot) ){.      
6110: 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
6120: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
6130: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6140: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
6150: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
6160: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
6170: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
6180: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
6190: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
61a0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
61b0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
61c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
61d0: 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20  p->iPage>0 );.  
61e0: 20 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61        btreeRelea
61f0: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
6200: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
6210: 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e   }.    p = p->pN
6220: 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  ext;.  }while( p
6230: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
6240: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6250: 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65   Clear the curre
6260: 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69  nt cursor positi
6270: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
6280: 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
6290: 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
62a0: 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
62b0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
62c0: 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74  pCur) );.  sqlit
62d0: 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b  e3_free(pCur->pK
62e0: 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65  ey);.  pCur->pKe
62f0: 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65  y = 0;.  pCur->e
6300: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
6310: 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  NVALID;.}../*.**
6320: 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
6330: 20 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c   of BtreeMoveto,
6340: 20 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65   pKey is a packe
6350: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a  d index record.*
6360: 2a 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e  * such as is gen
6370: 65 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50  erated by the OP
6380: 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
6390: 64 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a  de.  Unpack the.
63a0: 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68  ** record and th
63b0: 65 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76  en call BtreeMov
63c0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f  etoUnpacked() to
63d0: 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f   do the work..*/
63e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
63f0: 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72  eMoveto(.  BtCur
6400: 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f  sor *pCur,     /
6410: 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e  * Cursor open on
6420: 20 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65   the btree to be
6430: 20 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63   searched */.  c
6440: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
6450: 20 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79     /* Packed key
6460: 20 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73   if the btree is
6470: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   an index */.  i
6480: 36 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  64 nKey,        
6490: 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65     /* Integer ke
64a0: 79 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53  y for tables.  S
64b0: 69 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20  ize of pKey for 
64c0: 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74  indices */.  int
64d0: 20 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20   bias,          
64e0: 20 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20   /* Bias search 
64f0: 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
6500: 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
6510: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6520: 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
6530: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
6540: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
6550: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
6560: 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70  us code */.  Unp
6570: 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64  ackedRecord *pId
6580: 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63  xKey;   /* Unpac
6590: 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f  ked index key */
65a0: 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32  .  char aSpace[2
65b0: 30 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  00];          /*
65c0: 20 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20   Temp space for 
65d0: 70 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f  pIdxKey - to avo
65e0: 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20  id a malloc */. 
65f0: 20 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30   char *pFree = 0
6600: 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b  ;..  if( pKey ){
6610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65  .    assert( nKe
6620: 79 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65  y==(i64)(int)nKe
6630: 79 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  y );.    pIdxKey
6640: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c   = sqlite3VdbeAl
6650: 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
6660: 64 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  d(.        pCur-
6670: 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63  >pKeyInfo, aSpac
6680: 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65  e, sizeof(aSpace
6690: 29 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b  ), &pFree.    );
66a0: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
66b0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
66c0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73  ITE_NOMEM;.    s
66d0: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
66e0: 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65  Unpack(pCur->pKe
66f0: 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79  yInfo, (int)nKey
6700: 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29  , pKey, pIdxKey)
6710: 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65  ;.    if( pIdxKe
6720: 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a  y->nField==0 ){.
6730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
6740: 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e  ree(pCur->pKeyIn
6750: 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a  fo->db, pFree);.
6760: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
6770: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
6780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
6790: 0a 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30  .    pIdxKey = 0
67a0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
67b0: 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
67c0: 6e 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49  npacked(pCur, pI
67d0: 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61  dxKey, nKey, bia
67e0: 73 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20  s, pRes);.  if( 
67f0: 70 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  pFree ){.    sql
6800: 69 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d  ite3DbFree(pCur-
6810: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70  >pKeyInfo->db, p
6820: 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
6830: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6840: 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72   Restore the cur
6850: 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74  sor to the posit
6860: 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f  ion it was in (o
6870: 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73  r as close to as
6880: 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68   possible).** wh
6890: 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  en saveCursorPos
68a0: 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c  ition() was call
68b0: 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ed. Note that th
68c0: 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20  is call deletes 
68d0: 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f  the .** saved po
68e0: 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72  sition info stor
68f0: 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72  ed by saveCursor
6900: 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74  Position(), so t
6910: 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61  here can be.** a
6920: 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63  t most one effec
6930: 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73  tive restoreCurs
6940: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c  orPosition() cal
6950: 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a  l after each .**
6960: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
6970: 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ion()..*/.static
6980: 20 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72   int btreeRestor
6990: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
69a0: 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
69b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
69c0: 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73   skipNext;.  ass
69d0: 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
69e0: 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
69f0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
6a00: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
6a10: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
6a20: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
6a30: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
6a40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
6a50: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20  ur->skipNext;.  
6a60: 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  }.  pCur->eState
6a70: 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
6a80: 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d  D;.  rc = btreeM
6a90: 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72  oveto(pCur, pCur
6aa0: 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b  ->pKey, pCur->nK
6ab0: 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74  ey, 0, &skipNext
6ac0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
6ad0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
6ae0: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6af0: 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72  >pKey);.    pCur
6b00: 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20  ->pKey = 0;.    
6b10: 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
6b20: 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
6b30: 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
6b40: 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
6b50: 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ID );.    pCur->
6b60: 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70  skipNext |= skip
6b70: 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43  Next;.    if( pC
6b80: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20  ur->skipNext && 
6b90: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
6ba0: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
6bb0: 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
6bc0: 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45   = CURSOR_SKIPNE
6bd0: 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  XT;.    }.  }.  
6be0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
6bf0: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
6c00: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
6c10: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
6c20: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
6c30: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62  K ? \.         b
6c40: 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f  treeRestoreCurso
6c50: 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c  rPosition(p) : \
6c60: 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  .         SQLITE
6c70: 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65  _OK)../*.** Dete
6c80: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
6c90: 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61   not a cursor ha
6ca0: 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  s moved from the
6cb0: 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a   position where.
6cc0: 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70  ** it was last p
6cd0: 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65  laced, or has be
6ce0: 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66  en invalidated f
6cf0: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61  or any other rea
6d00: 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20  son..** Cursors 
6d10: 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68  can move when th
6d20: 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70  e row they are p
6d30: 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65  ointing at is de
6d40: 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f  leted out.** fro
6d50: 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f  m under them, fo
6d60: 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73  r example.  Curs
6d70: 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f  or might also mo
6d80: 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a  ve if a btree.**
6d90: 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a   is rebalanced..
6da0: 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68  **.** Calling th
6db0: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20  is routine with 
6dc0: 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f  a NULL cursor po
6dd0: 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61  inter returns fa
6de0: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  lse..**.** Use t
6df0: 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69  he separate sqli
6e00: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
6e10: 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20  store() routine 
6e20: 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72  to restore a cur
6e30: 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77  sor.** back to w
6e40: 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f  here it ought to
6e50: 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74   be if this rout
6e60: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65  ine returns true
6e70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6e80: 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
6e90: 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ved(BtCursor *pC
6ea0: 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
6eb0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
6ec0: 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  OR_VALID;.}../*.
6ed0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6ee0: 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f  restores a curso
6ef0: 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  r back to its or
6f00: 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20  iginal position 
6f10: 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20  after it.** has 
6f20: 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f  been moved by so
6f30: 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76  me outside activ
6f40: 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62  ity (such as a b
6f50: 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f  tree rebalance o
6f60: 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e  r.** a row havin
6f70: 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  g been deleted o
6f80: 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
6f90: 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a  e cursor).  .**.
6fa0: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74  ** On success, t
6fb0: 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f  he *pDifferentRo
6fc0: 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66  w parameter is f
6fd0: 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73  alse if the curs
6fe0: 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
6ff0: 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c  inting at exactl
7000: 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20  y the same row. 
7010: 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69   *pDifferntRow i
7020: 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75  s the row the cu
7030: 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e  rsor.** was poin
7040: 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e  ting to has been
7050: 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e   deleted, forcin
7060: 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  g the cursor to 
7070: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a  point to some.**
7080: 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a   nearby row..**.
7090: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
70a0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
70b0: 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73  alled for a curs
70c0: 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74  or that just ret
70d0: 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72  urned.** TRUE fr
70e0: 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  om sqlite3BtreeC
70f0: 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e  ursorHasMoved().
7100: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7110: 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
7120: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
7130: 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e  , int *pDifferen
7140: 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b  tRow){.  int rc;
7150: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
7160: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7170: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
7180: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
7190: 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
71a0: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
71b0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
71c0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
71d0: 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72  w = 1;.    retur
71e0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
71f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
7200: 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20  RSOR_VALID ){.  
7210: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7220: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
7230: 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
7240: 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a  >skipNext==0 );.
7250: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
7260: 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ow = 0;.  }.  re
7270: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7280: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
7290: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
72a0: 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69  INTS./*.** Provi
72b0: 64 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20  de hints to the 
72c0: 63 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72  cursor.  The par
72d0: 74 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76  ticular hint giv
72e0: 65 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65  en (and the type
72f0: 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f  .** and number o
7300: 66 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61  f the varargs pa
7310: 72 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74  rameters) is det
7320: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65  ermined by the e
7330: 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61  HintType.** para
7340: 6d 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20  meter.  See the 
7350: 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74  definitions of t
7360: 68 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20  he BTREE_HINT_* 
7370: 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69  macros for detai
7380: 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ls..*/.void sqli
7390: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69  te3BtreeCursorHi
73a0: 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  nt(BtCursor *pCu
73b0: 72 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65  r, int eHintType
73c0: 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65  , ...){.  /* Use
73d0: 64 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d  d only by system
73e0: 20 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65   that substitute
73f0: 20 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61   their own stora
7400: 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23  ge engine */.}.#
7410: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  endif../*.** Pro
7420: 76 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20  vide flag hints 
7430: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  to the cursor..*
7440: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
7450: 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61  reeCursorHintFla
7460: 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  gs(BtCursor *pCu
7470: 72 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a  r, unsigned x){.
7480: 20 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52    assert( x==BTR
7490: 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d  EE_SEEK_EQ || x=
74a0: 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20  =BTREE_BULKLOAD 
74b0: 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75  || x==0 );.  pCu
74c0: 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a  r->hints = x;.}.
74d0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
74e0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
74f0: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70  ./*.** Given a p
7500: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
7510: 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65  regular database
7520: 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68   page, return th
7530: 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72  e page.** number
7540: 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72   for the pointer
7550: 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63  -map page that c
7560: 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72  ontains the entr
7570: 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70  y for the.** inp
7580: 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a  ut page number..
7590: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28  **.** Return 0 (
75a0: 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65  not a valid page
75b0: 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69  ) for pgno==1 si
75c0: 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20  nce there is.** 
75d0: 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61  no pointer map a
75e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
75f0: 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65  age 1.  The inte
7600: 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69  grity_check logi
7610: 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68  c.** requires th
7620: 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28  at ptrmapPageno(
7630: 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74  *,1)!=1..*/.stat
7640: 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61  ic Pgno ptrmapPa
7650: 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70  geno(BtShared *p
7660: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
7670: 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d    int nPagesPerM
7680: 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69  apPage;.  Pgno i
7690: 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61  PtrMap, ret;.  a
76a0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
76b0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
76c0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
76d0: 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30  gno<2 ) return 0
76e0: 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70  ;.  nPagesPerMap
76f0: 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61  Page = (pBt->usa
7700: 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20  bleSize/5)+1;.  
7710: 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d  iPtrMap = (pgno-
7720: 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50  2)/nPagesPerMapP
7730: 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50  age;.  ret = (iP
7740: 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d  trMap*nPagesPerM
7750: 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20  apPage) + 2; .  
7760: 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47  if( ret==PENDING
7770: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
7780: 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20  ){.    ret++;.  
7790: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
77a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
77b0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
77c0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
77d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
77e0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69   updates the poi
77f0: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
7800: 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  or page number '
7810: 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20  key'.** so that 
7820: 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20  it maps to type 
7830: 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65  'eType' and pare
7840: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27  nt page number '
7850: 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pgno'..**.** If 
7860: 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c  *pRC is initiall
7870: 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d  y non-zero (non-
7880: 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20  SQLITE_OK) then 
7890: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
78a0: 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  ** a no-op.  If 
78b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
78c0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
78d0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77   error code is w
78e0: 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a  ritten.** into *
78f0: 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pRC..*/.static v
7900: 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74  oid ptrmapPut(Bt
7910: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
7920: 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c  o key, u8 eType,
7930: 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e   Pgno parent, in
7940: 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67  t *pRC){.  DbPag
7950: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
7960: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7970: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
7980: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
7990: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
79a0: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
79b0: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
79c0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
79d0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
79e0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
79f0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
7a00: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
7a10: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
7a20: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7a30: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e  code from subfun
7a40: 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28  ctions */..  if(
7a50: 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a   *pRC ) return;.
7a60: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7a70: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
7a80: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
7a90: 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75  * The master-jou
7aa0: 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72  rnal page number
7ab0: 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75   must never be u
7ac0: 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72  sed as a pointer
7ad0: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61   map page */.  a
7ae0: 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50  ssert( 0==PTRMAP
7af0: 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e  _ISPAGE(pBt, PEN
7b00: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
7b10: 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72  Bt)) );..  asser
7b20: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
7b30: 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d  um );.  if( key=
7b40: 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d  =0 ){.    *pRC =
7b50: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7b60: 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  BKPT;.    return
7b70: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
7b80: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
7b90: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
7ba0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
7bb0: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
7bc0: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
7bd0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
7be0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7bf0: 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
7c00: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66  return;.  }.  of
7c10: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
7c20: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
7c30: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
7c40: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52  set<0 ){.    *pR
7c50: 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  C = SQLITE_CORRU
7c60: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  PT_BKPT;.    got
7c70: 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20  o ptrmap_exit;. 
7c80: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
7c90: 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d  set <= (int)pBt-
7ca0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b  >usableSize-5 );
7cb0: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
7cc0: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
7cd0: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
7ce0: 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70  ..  if( eType!=p
7cf0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c  Ptrmap[offset] |
7d00: 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72  | get4byte(&pPtr
7d10: 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d  map[offset+1])!=
7d20: 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52  parent ){.    TR
7d30: 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44  ACE(("PTRMAP_UPD
7d40: 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29  ATE: %d->(%d,%d)
7d50: 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c  \n", key, eType,
7d60: 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a   parent));.    *
7d70: 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65  pRC= rc = sqlite
7d80: 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
7d90: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
7da0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7db0: 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66       pPtrmap[off
7dc0: 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20  set] = eType;.  
7dd0: 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
7de0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c  trmap[offset+1],
7df0: 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a   parent);.    }.
7e00: 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74    }..ptrmap_exit
7e10: 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  :.  sqlite3Pager
7e20: 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
7e30: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e  }../*.** Read an
7e40: 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20   entry from the 
7e50: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
7e60: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7e70: 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f  retrieves the po
7e80: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
7e90: 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20  for page 'key', 
7ea0: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74  writing.** the t
7eb0: 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70  ype and parent p
7ec0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70  age number to *p
7ed0: 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f  EType and *pPgno
7ee0: 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
7ef0: 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  * An error code 
7f00: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
7f10: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
7f20: 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53  ong, otherwise S
7f30: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
7f40: 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65  tic int ptrmapGe
7f50: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
7f60: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70   Pgno key, u8 *p
7f70: 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67  EType, Pgno *pPg
7f80: 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70  no){.  DbPage *p
7f90: 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65  DbPage;   /* The
7fa0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7fb0: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d  e */.  int iPtrm
7fc0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  ap;       /* Poi
7fd0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e  nter map page in
7fe0: 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  dex */.  u8 *pPt
7ff0: 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50  rmap;       /* P
8000: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
8010: 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  data */.  int of
8020: 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
8030: 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20  Offset of entry 
8040: 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a  in pointer map *
8050: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
8060: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8070: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8080: 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72  utex) );..  iPtr
8090: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
80a0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
80b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
80c0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
80d0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
80e0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
80f0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  rc!=0 ){.    ret
8100: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
8110: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
8120: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
8130: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f  a(pDbPage);..  o
8140: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
8150: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
8160: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
8170: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71  fset<0 ){.    sq
8180: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
8190: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65  pDbPage);.    re
81a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
81b0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
81c0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c  assert( offset <
81d0: 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62  = (int)pBt->usab
81e0: 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73  leSize-5 );.  as
81f0: 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20  sert( pEType!=0 
8200: 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70  );.  *pEType = p
8210: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a  Ptrmap[offset];.
8220: 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70    if( pPgno ) *p
8230: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
8240: 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b  &pPtrmap[offset+
8250: 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50  1]);..  sqlite3P
8260: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
8270: 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70  e);.  if( *pETyp
8280: 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35  e<1 || *pEType>5
8290: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
82a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
82b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
82c0: 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69  K;.}..#else /* i
82d0: 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45  f defined SQLITE
82e0: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
82f0: 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74   */.  #define pt
8300: 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c  rmapPut(w,x,y,z,
8310: 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74  rc).  #define pt
8320: 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29  rmapGet(w,x,y,z)
8330: 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65   SQLITE_OK.  #de
8340: 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76  fine ptrmapPutOv
8350: 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a  flPtr(x, y, rc).
8360: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69  #endif../*.** Gi
8370: 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65  ven a btree page
8380: 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65   and a cell inde
8390: 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66  x (0 means the f
83a0: 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20  irst cell on.** 
83b0: 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e  the page, 1 mean
83c0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c  s the second cel
83d0: 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29  l, and so forth)
83e0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
83f0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c  r.** to the cell
8400: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   content..**.** 
8410: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8420: 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20  ) does the same 
8430: 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20  except it skips 
8440: 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c  past the initial
8450: 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64  .** 4-byte child
8460: 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f   pointer found o
8470: 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73  n interior pages
8480: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  , if there is on
8490: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
84a0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79  utine works only
84b0: 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20   for pages that 
84c0: 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f  do not contain o
84d0: 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a  verflow cells..*
84e0: 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65  /.#define findCe
84f0: 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29  ll(P,I) \.  ((P)
8500: 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e  ->aData + ((P)->
8510: 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62  maskPage & get2b
8520: 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d  yteAligned(&(P)-
8530: 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d  >aCellIdx[2*(I)]
8540: 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64  ))).#define find
8550: 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29  CellPastPtr(P,I)
8560: 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61   \.  ((P)->aData
8570: 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Ofst + ((P)->mas
8580: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
8590: 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43  Aligned(&(P)->aC
85a0: 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29  ellIdx[2*(I)])))
85b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  .../*.** This is
85c0: 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f   common tail pro
85d0: 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65  cessing for btre
85e0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
85f0: 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  and.** btreePars
8600: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20  eCellPtrIndex() 
8610: 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65  for the case whe
8620: 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20  n the cell does 
8630: 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79  not fit entirely
8640: 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  .** on a single 
8650: 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61  B-tree page.  Ma
8660: 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a  ke necessary adj
8670: 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20  ustments to the 
8680: 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75  CellInfo.** stru
8690: 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  cture..*/.static
86a0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
86b0: 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65   void btreeParse
86c0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
86d0: 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d  rOverflow(.  Mem
86e0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
86f0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8700: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8710: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8730: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8740: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8750: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8760: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8770: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8780: 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20  e */.){.  /* If 
8790: 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c  the payload will
87a0: 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74   not fit complet
87b0: 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ely on the local
87c0: 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20   page, we have. 
87d0: 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f   ** to decide ho
87e0: 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20  w much to store 
87f0: 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20  locally and how 
8800: 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e  much to spill on
8810: 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77  to.  ** overflow
8820: 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72   pages.  The str
8830: 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69  ategy is to mini
8840: 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  mize the amount 
8850: 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73  of unused.  ** s
8860: 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77  pace on overflow
8870: 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65   pages while kee
8880: 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20  ping the amount 
8890: 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65  of local storage
88a0: 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e  .  ** in between
88b0: 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61   minLocal and ma
88c0: 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a  xLocal..  **.  *
88d0: 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e  * Warning:  chan
88e0: 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65  ging the way ove
88f0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73  rflow payload is
8900: 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20   distributed in 
8910: 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c  any.  ** way wil
8920: 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69  l result in an i
8930: 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65  ncompatible file
8940: 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20   format..  */.  
8950: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f  int minLocal;  /
8960: 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74  * Minimum amount
8970: 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64   of payload held
8980: 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e   locally */.  in
8990: 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20  t maxLocal;  /* 
89a0: 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f  Maximum amount o
89b0: 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c  f payload held l
89c0: 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20  ocally */.  int 
89d0: 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76  surplus;   /* Ov
89e0: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61  erflow payload a
89f0: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63  vailable for loc
8a00: 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20  al storage */.. 
8a10: 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67   minLocal = pPag
8a20: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d  e->minLocal;.  m
8a30: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
8a40: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72  >maxLocal;.  sur
8a50: 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  plus = minLocal 
8a60: 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  + (pInfo->nPaylo
8a70: 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28  ad - minLocal)%(
8a80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
8a90: 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73  leSize-4);.  tes
8aa0: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8ab0: 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65  maxLocal );.  te
8ac0: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
8ad0: 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  =maxLocal+1 );. 
8ae0: 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20   if( surplus <= 
8af0: 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  maxLocal ){.    
8b00: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
8b10: 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20  (u16)surplus;.  
8b20: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
8b30: 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29  ->nLocal = (u16)
8b40: 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  minLocal;.  }.  
8b50: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28  pInfo->nSize = (
8b60: 75 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61  u16)(&pInfo->pPa
8b70: 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f  yload[pInfo->nLo
8b80: 63 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20  cal] - pCell) + 
8b90: 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  4;.}../*.** The 
8ba0: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
8bb0: 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74  es are implement
8bc0: 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65  ations of the Me
8bd0: 6d 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c  mPage.xParseCell
8be0: 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a  ().** method..**
8bf0: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
8c00: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
8c10: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
8c20: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
8c30: 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61  e..**.** btreePa
8c40: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20  rseCellPtr()    
8c50: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62      =>   table b
8c60: 74 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  tree leaf nodes.
8c70: 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  ** btreeParseCel
8c80: 6c 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e  lNoPayload()  =>
8c90: 20 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69     table btree i
8ca0: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
8cb0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8cc0: 74 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20  trIndex()   =>  
8cd0: 20 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64   index btree nod
8ce0: 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69  es.**.** There i
8cf0: 73 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72  s also a wrapper
8d00: 20 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50   function btreeP
8d10: 61 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20  arseCell() that 
8d20: 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  works for.** all
8d30: 20 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61   MemPage types a
8d40: 6e 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  nd that referenc
8d50: 65 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69  es the cell by i
8d60: 6e 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e  ndex rather than
8d70: 0a 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a  .** by pointer..
8d80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
8d90: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
8da0: 4e 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d  NoPayload(.  Mem
8db0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
8dc0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
8dd0: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c  taining the cell
8de0: 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c   */.  u8 *pCell,
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e00: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
8e10: 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20  cell text. */.  
8e20: 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20  CellInfo *pInfo 
8e30: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20          /* Fill 
8e40: 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
8e50: 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  e */.){.  assert
8e60: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
8e70: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8e80: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
8e90: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
8ea0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
8eb0: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
8ec0: 53 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64  Size==4 );.#ifnd
8ed0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
8ee0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
8ef0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
8f00: 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  f.  pInfo->nSize
8f10: 20 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74   = 4 + getVarint
8f20: 28 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34  (&pCell[4], (u64
8f30: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
8f40: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
8f50: 61 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d  ad = 0;.  pInfo-
8f60: 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70  >nLocal = 0;.  p
8f70: 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d  Info->pPayload =
8f80: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
8f90: 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65  static void btre
8fa0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20  eParseCellPtr(. 
8fb0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8fd0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8fe0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8ff0: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
9000: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
9010: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
9020: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9030: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9040: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9050: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38  cture */.){.  u8
9060: 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
9070: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61        /* For sca
9080: 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43  nning through pC
9090: 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61  ell */.  u32 nPa
90a0: 79 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20  yload;          
90b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
90c0: 74 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c  tes of cell payl
90d0: 6f 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65  oad */.  u64 iKe
90e0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
90f0: 20 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65   /* Extracted Ke
9100: 79 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73  y value */..  as
9110: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9120: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
9130: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
9140: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9150: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
9160: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61  ->leaf==1 );.  a
9170: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
9180: 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73  tKeyLeaf );.  as
9190: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69  sert( pPage->chi
91a0: 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a  ldPtrSize==0 );.
91b0: 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b    pIter = pCell;
91c0: 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  ..  /* The next 
91d0: 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73  block of code is
91e0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a   equivalent to:.
91f0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49    **.  **     pI
9200: 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ter += getVarint
9210: 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f  32(pIter, nPaylo
9220: 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ad);.  **.  ** T
9230: 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e  he code is inlin
9240: 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75  ed to avoid a fu
9250: 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a  nction call..  *
9260: 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a  /.  nPayload = *
9270: 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61  pIter;.  if( nPa
9280: 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20  yload>=0x80 ){. 
9290: 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70     u8 *pEnd = &p
92a0: 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61  Iter[8];.    nPa
92b0: 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20  yload &= 0x7f;. 
92c0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61     do{.      nPa
92d0: 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61  yload = (nPayloa
92e0: 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65  d<<7) | (*++pIte
92f0: 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d  r & 0x7f);.    }
9300: 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e  while( (*pIter)>
9310: 3d 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70  =0x80 && pIter<p
9320: 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74  End );.  }.  pIt
9330: 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er++;..  /* The 
9340: 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  next block of co
9350: 64 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  de is equivalent
9360: 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20   to:.  **.  **  
9370: 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56     pIter += getV
9380: 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36  arint(pIter, (u6
9390: 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29  4*)&pInfo->nKey)
93a0: 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ;.  **.  ** The 
93b0: 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20  code is inlined 
93c0: 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74  to avoid a funct
93d0: 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20  ion call..  */. 
93e0: 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a   iKey = *pIter;.
93f0: 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30    if( iKey>=0x80
9400: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64   ){.    u8 *pEnd
9410: 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20   = &pIter[7];.  
9420: 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a    iKey &= 0x7f;.
9430: 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20      while(1){.  
9440: 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79      iKey = (iKey
9450: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9460: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20   & 0x7f);.      
9470: 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38  if( (*pIter)<0x8
9480: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9490: 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64   if( pIter>=pEnd
94a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79   ){.        iKey
94b0: 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a   = (iKey<<8) | *
94c0: 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20  ++pIter;.       
94d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
94e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65      }.  }.  pIte
94f0: 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e  r++;..  pInfo->n
9500: 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b  Key = *(i64*)&iK
9510: 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ey;.  pInfo->nPa
9520: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9530: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9540: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9550: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9560: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9570: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9580: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9590: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
95a0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
95b0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
95c0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
95d0: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
95e0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
95f0: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
9600: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
9610: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9620: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
9630: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9640: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9650: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9660: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9670: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9680: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9690: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
96a0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
96b0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
96c0: 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  oad;.  }else{.  
96d0: 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
96e0: 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65  AdjustSizeForOve
96f0: 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65  rflow(pPage, pCe
9700: 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ll, pInfo);.  }.
9710: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  }.static void bt
9720: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49  reeParseCellPtrI
9730: 6e 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20  ndex(.  MemPage 
9740: 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
9750: 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
9760: 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20  ng the cell */. 
9770: 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
9780: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
9790: 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  ter to the cell 
97a0: 74 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  text. */.  CellI
97b0: 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20  nfo *pInfo      
97c0: 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68     /* Fill in th
97d0: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
97e0: 29 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20  ){.  u8 *pIter; 
97f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9800: 46 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  For scanning thr
9810: 6f 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  ough pCell */.  
9820: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
9830: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9840: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
9850: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
9860: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
9870: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
9880: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
9890: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
98a0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
98b0: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
98c0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
98d0: 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29  >intKeyLeaf==0 )
98e0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
98f0: 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  l + pPage->child
9900: 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
9910: 6f 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20  oad = *pIter;.  
9920: 69 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78  if( nPayload>=0x
9930: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9940: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
9950: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20      nPayload &= 
9960: 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  0x7f;.    do{.  
9970: 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28      nPayload = (
9980: 6e 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28  nPayload<<7) | (
9990: 2a 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29  *++pIter & 0x7f)
99a0: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28  ;.    }while( *(
99b0: 70 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20  pIter)>=0x80 && 
99c0: 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20  pIter<pEnd );.  
99d0: 7d 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70  }.  pIter++;.  p
99e0: 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61  Info->nKey = nPa
99f0: 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e  yload;.  pInfo->
9a00: 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c  nPayload = nPayl
9a10: 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50  oad;.  pInfo->pP
9a20: 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a  ayload = pIter;.
9a30: 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79    testcase( nPay
9a40: 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78  load==pPage->max
9a50: 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63  Local );.  testc
9a60: 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70  ase( nPayload==p
9a70: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
9a80: 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f   );.  if( nPaylo
9a90: 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ad<=pPage->maxLo
9aa0: 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  cal ){.    /* Th
9ab0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
9ac0: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
9ad0: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
9ae0: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
9af0: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
9b00: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
9b10: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
9b20: 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d     */.    pInfo-
9b30: 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61  >nSize = nPayloa
9b40: 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20  d + (u16)(pIter 
9b50: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
9b60: 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34  ( pInfo->nSize<4
9b70: 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20   ) pInfo->nSize 
9b80: 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  = 4;.    pInfo->
9b90: 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50  nLocal = (u16)nP
9ba0: 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b  ayload;.  }else{
9bb0: 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
9bc0: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
9bd0: 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20  Overflow(pPage, 
9be0: 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20  pCell, pInfo);. 
9bf0: 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64   }.}.static void
9c00: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
9c10: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
9c20: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
9c30: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
9c40: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
9c50: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
9c60: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
9c70: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
9c80: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
9c90: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
9ca0: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
9cb0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
9cc0: 2f 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50  /.){.  pPage->xP
9cd0: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
9ce0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
9cf0: 69 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a  iCell), pInfo);.
9d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
9d10: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
9d20: 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  are implementati
9d30: 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61  ons of the MemPa
9d40: 67 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20  ge.xCellSize.** 
9d50: 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  method..**.** Co
9d60: 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20  mpute the total 
9d70: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
9d80: 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64  that a Cell need
9d90: 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a  s in the cell.**
9da0: 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68   data area of th
9db0: 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54  e btree-page.  T
9dc0: 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72  he return number
9dd0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65   includes the ce
9de0: 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65  ll.** data heade
9df0: 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20  r and the local 
9e00: 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74  payload, but not
9e10: 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
9e20: 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61  ge or.** the spa
9e30: 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63  ce used by the c
9e40: 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ell pointer..**.
9e50: 2a 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f  ** cellSizePtrNo
9e60: 50 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20  Payload()    => 
9e70: 20 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c    table internal
9e80: 20 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69   nodes.** cellSi
9e90: 7a 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20  zePtr()         
9ea0: 20 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64      =>   all ind
9eb0: 65 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65  ex nodes & table
9ec0: 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73   leaf nodes.*/.s
9ed0: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
9ee0: 7a 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  zePtr(MemPage *p
9ef0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29  Page, u8 *pCell)
9f00: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20  {.  u8 *pIter = 
9f10: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9f20: 68 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20  hildPtrSize; /* 
9f30: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
9f40: 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20   bytes of pCell 
9f50: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20  */.  u8 *pEnd;  
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9f80: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
9f90: 76 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20  varint */.  u32 
9fa0: 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
9fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fc0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c       /* Size val
9fd0: 75 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ue to return */.
9fe0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
9ff0: 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61  EBUG.  /* The va
a000: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
a010: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  this function sh
a020: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74  ould always be t
a030: 68 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20  he same as.  ** 
a040: 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53  the (CellInfo.nS
a050: 69 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64  ize) value found
a060: 20 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c   by doing a full
a070: 20 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20   parse of the.  
a080: 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49  ** cell. If SQLI
a090: 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69  TE_DEBUG is defi
a0a0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
a0b0: 20 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f   at the bottom o
a0c0: 66 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63  f.  ** this func
a0d0: 74 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68  tion verifies th
a0e0: 61 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e  at this invarian
a0f0: 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65  t is not violate
a100: 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  d. */.  CellInfo
a110: 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50   debuginfo;.  pP
a120: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
a130: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64  pPage, pCell, &d
a140: 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69  ebuginfo);.#endi
a150: 66 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49  f..  nSize = *pI
a160: 74 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65  ter;.  if( nSize
a170: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45  >=0x80 ){.    pE
a180: 6e 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a  nd = &pIter[8];.
a190: 20 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37      nSize &= 0x7
a1a0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
a1b0: 20 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c   nSize = (nSize<
a1c0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
a1d0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68  & 0x7f);.    }wh
a1e0: 69 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30  ile( *(pIter)>=0
a1f0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a200: 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  d );.  }.  pIter
a210: 2b 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ++;.  if( pPage-
a220: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f  >intKey ){.    /
a230: 2a 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e  * pIter now poin
a240: 74 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74  ts at the 64-bit
a250: 20 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c   integer key val
a260: 75 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c  ue, a variable l
a270: 65 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e  ength .    ** in
a280: 74 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f  teger. The follo
a290: 77 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73  wing block moves
a2a0: 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
a2b0: 61 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74  at the first byt
a2c0: 65 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68  e.    ** past th
a2d0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79  e end of the key
a2e0: 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70   value. */.    p
a2f0: 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b  End = &pIter[9];
a300: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49  .    while( (*pI
a310: 74 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70  ter++)&0x80 && p
a320: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
a330: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69  .  testcase( nSi
a340: 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze==pPage->maxLo
a350: 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73  cal );.  testcas
a360: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a370: 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20  >maxLocal+1 );. 
a380: 20 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67   if( nSize<=pPag
a390: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20  e->maxLocal ){. 
a3a0: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32     nSize += (u32
a3b0: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a3c0: 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c  ;.    if( nSize<
a3d0: 34 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20  4 ) nSize = 4;. 
a3e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
a3f0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
a400: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
a410: 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c  nSize = minLocal
a420: 20 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c   + (nSize - minL
a430: 6f 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e  ocal) % (pPage->
a440: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
a450: 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
a460: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a470: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
a480: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a490: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a4a0: 61 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20  al+1 );.    if( 
a4b0: 6e 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78  nSize>pPage->max
a4c0: 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e  Local ){.      n
a4d0: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  Size = minLocal;
a4e0: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65  .    }.    nSize
a4f0: 20 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49   += 4 + (u16)(pI
a500: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
a510: 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a  }.  assert( nSiz
a520: 65 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  e==debuginfo.nSi
a530: 7a 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ze || CORRUPT_DB
a540: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31   );.  return (u1
a550: 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69  6)nSize;.}.stati
a560: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
a570: 72 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61  rNoPayload(MemPa
a580: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
a590: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74  Cell){.  u8 *pIt
a5a0: 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20  er = pCell + 4; 
a5b0: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
a5c0: 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65  ver bytes of pCe
a5d0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64  ll */.  u8 *pEnd
a5e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
a5f0: 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61  * End mark for a
a600: 20 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64   varint */..#ifd
a610: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
a620: 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72    /* The value r
a630: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
a640: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
a650: 61 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61  always be the sa
a660: 6d 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28  me as.  ** the (
a670: 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20  CellInfo.nSize) 
a680: 76 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64  value found by d
a690: 6f 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73  oing a full pars
a6a0: 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65  e of the.  ** ce
a6b0: 6c 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45  ll. If SQLITE_DE
a6c0: 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20  BUG is defined, 
a6d0: 61 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74  an assert() at t
a6e0: 68 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a  he bottom of.  *
a6f0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
a700: 76 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68  verifies that th
a710: 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  is invariant is 
a720: 6e 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f  not violated. */
a730: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75  .  CellInfo debu
a740: 67 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e  ginfo;.  pPage->
a750: 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
a760: 2c 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69  , pCell, &debugi
a770: 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nfo);.#else.  UN
a780: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
a790: 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Page);.#endif.. 
a7a0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
a7b0: 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20  childPtrSize==4 
a7c0: 29 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65  );.  pEnd = pIte
a7d0: 72 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20  r + 9;.  while( 
a7e0: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a7f0: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a800: 0a 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67  .  assert( debug
a810: 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36  info.nSize==(u16
a820: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a830: 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
a840: 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29  ;.  return (u16)
a850: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a860: 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
a870: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
a880: 20 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65   variation on ce
a890: 6c 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75  llSizePtr() is u
a8a0: 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73  sed inside of as
a8b0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
a8c0: 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74  s.** only. */.st
a8d0: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a8e0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
a8f0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
a900: 72 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43  return pPage->xC
a910: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66  ellSize(pPage, f
a920: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
a930: 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  Cell));.}.#endif
a940: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
a950: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
a960: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  ./*.** If the ce
a970: 6c 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f  ll pCell, part o
a980: 66 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e  f page pPage con
a990: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a  tains a pointer.
a9a0: 2a 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  ** to an overflo
a9b0: 77 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61  w page, insert a
a9c0: 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65  n entry into the
a9d0: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20   pointer-map.** 
a9e0: 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
a9f0: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
aa00: 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f   void ptrmapPutO
aa10: 76 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a  vflPtr(MemPage *
aa20: 70 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c  pPage, u8 *pCell
aa30: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43  , int *pRC){.  C
aa40: 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
aa50: 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
aa60: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65  n;.  assert( pCe
aa70: 6c 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65  ll!=0 );.  pPage
aa80: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
aa90: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
aaa0: 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c  );.  if( info.nL
aab0: 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f  ocal<info.nPaylo
aac0: 61 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  ad ){.    Pgno o
aad0: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
aae0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65  pCell[info.nSize
aaf0: 2d 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70  -4]);.    ptrmap
ab00: 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20  Put(pPage->pBt, 
ab10: 6f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  ovfl, PTRMAP_OVE
ab20: 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
ab30: 67 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d  gno, pRC);.  }.}
ab40: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
ab50: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
ab60: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
ab70: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
ab80: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
ab90: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
aba0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
abb0: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
abc0: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
abd0: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
abe0: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
abf0: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
ac00: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
ac10: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
ac20: 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45  nt area..**.** E
ac30: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
ac40: 35 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65  582-60138 SQLite
ac50: 20 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74   may from time t
ac60: 6f 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a  o time reorganiz
ac70: 65 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61  e a.** b-tree pa
ac80: 67 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ge so that there
ac90: 20 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63   are no freebloc
aca0: 6b 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62  ks or fragment b
acb0: 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75  ytes, all.** unu
acc0: 73 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f  sed bytes are co
acd0: 6e 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75  ntained in the u
ace0: 6e 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65  nallocated space
acf0: 20 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c   region, and all
ad00: 0a 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61  .** cells are pa
ad10: 63 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20  cked tightly at 
ad20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
ad30: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
ad40: 6e 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67  nt defragmentPag
ad50: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
ad60: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
ad70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ad90: 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20  */.  int pc;    
ada0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adb0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68  /* Address of th
adc0: 65 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  e i-th cell */. 
add0: 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
adf0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67  ffset to the pag
ae00: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
ae10: 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
ae20: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
ae30: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20   of a cell */.  
ae40: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
ae50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ae60: 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62  mber of usable b
ae70: 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a  ytes on a page *
ae80: 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  /.  int cellOffs
ae90: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  et;            /
aea0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20  * Offset to the 
aeb0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
aec0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b  ay */.  int cbrk
aed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aee0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aef0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
af00: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   area */.  int n
af10: 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
af20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
af30: 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20  of cells on the 
af40: 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
af50: 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  ed char *data;  
af60: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
af70: 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67   data */.  unsig
af80: 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20  ned char *temp; 
af90: 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72        /* Temp ar
afa0: 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74  ea for cell cont
afb0: 65 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ent */.  unsigne
afc0: 64 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20  d char *src;    
afd0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66      /* Source of
afe0: 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e   content */.  in
aff0: 74 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20  t iCellFirst;   
b000: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b010: 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c  t allowable cell
b020: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
b030: 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20  iCellLast;      
b040: 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70         /* Last p
b050: 6f 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64  ossible cell ind
b060: 65 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74  ex */...  assert
b070: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
b080: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
b090: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
b0a0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
b0b0: 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
b0c0: 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ( pPage->pBt->us
b0d0: 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49  ableSize <= SQLI
b0e0: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
b0f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
b100: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
b110: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
b120: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
b130: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
b140: 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d  tex) );.  temp =
b150: 20 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61   0;.  src = data
b160: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
b170: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
b180: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
b190: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
b1a0: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
b1b0: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
b1c0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
b1d0: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
b1e0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
b1f0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
b200: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
b210: 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20  eSize;.  cbrk = 
b220: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43  usableSize;.  iC
b230: 65 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f  ellFirst = cellO
b240: 66 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b  ffset + 2*nCell;
b250: 0a 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75  .  iCellLast = u
b260: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
b270: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
b280: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
b290: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
b2a0: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
b2b0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
b2c0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
b2d0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
b2e0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
b2f0: 41 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63  Addr);.    testc
b300: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69  ase( pc==iCellFi
b310: 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  rst );.    testc
b320: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
b330: 73 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  st );.    /* The
b340: 73 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61  se conditions ha
b350: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
b360: 76 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65  verified in btre
b370: 65 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20  eInitPage().    
b380: 2a 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c  ** if PRAGMA cel
b390: 6c 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e  l_size_check=ON.
b3a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b3b0: 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c  pc<iCellFirst ||
b3c0: 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b   pc>iCellLast ){
b3d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
b3e0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
b3f0: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  T;.    }.    ass
b400: 65 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69  ert( pc>=iCellFi
b410: 72 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c  rst && pc<=iCell
b420: 4c 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65  Last );.    size
b430: 20 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53   = pPage->xCellS
b440: 69 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b  ize(pPage, &src[
b450: 70 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d  pc]);.    cbrk -
b460: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  = size;.    if( 
b470: 63 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20  cbrk<iCellFirst 
b480: 7c 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c  || pc+size>usabl
b490: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72  eSize ){.      r
b4a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
b4b0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
b4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72  .    assert( cbr
b4d0: 6b 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69  k+size<=usableSi
b4e0: 7a 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c  ze && cbrk>=iCel
b4f0: 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65  lFirst );.    te
b500: 73 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a  stcase( cbrk+siz
b510: 65 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  e==usableSize );
b520: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
b530: 63 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69  c+size==usableSi
b540: 7a 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79  ze );.    put2by
b550: 74 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b  te(pAddr, cbrk);
b560: 0a 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30  .    if( temp==0
b570: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b   ){.      int x;
b580: 0a 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d  .      if( cbrk=
b590: 3d 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =pc ) continue;.
b5a0: 20 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c        temp = sql
b5b0: 69 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61  ite3PagerTempSpa
b5c0: 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70  ce(pPage->pBt->p
b5d0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20  Pager);.      x 
b5e0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
b5f0: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
b600: 6d 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c  memcpy(&temp[x],
b610: 20 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b   &data[x], (cbrk
b620: 2b 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20  +size) - x);.   
b630: 20 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20     src = temp;. 
b640: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
b650: 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72  &data[cbrk], &sr
b660: 63 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  c[pc], size);.  
b670: 7d 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b  }.  assert( cbrk
b680: 3e 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  >=iCellFirst );.
b690: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
b6a0: 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a  [hdr+5], cbrk);.
b6b0: 20 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20    data[hdr+1] = 
b6c0: 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d  0;.  data[hdr+2]
b6d0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
b6e0: 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  +7] = 0;.  memse
b6f0: 74 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72  t(&data[iCellFir
b700: 73 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65  st], 0, cbrk-iCe
b710: 6c 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65  llFirst);.  asse
b720: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
b730: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
b740: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
b750: 20 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46   if( cbrk-iCellF
b760: 69 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72  irst!=pPage->nFr
b770: 65 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ee ){.    return
b780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
b790: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
b7a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b7b0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68  ./*.** Search th
b7c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70  e free-list on p
b7d0: 61 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63  age pPg for spac
b7e0: 65 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c  e to store a cel
b7f0: 6c 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e  l nByte bytes in
b800: 0a 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65  .** size. If one
b810: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
b820: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
b830: 74 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64  to the space and
b840: 20 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72   remove it.** fr
b850: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
b860: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  ..**.** If no su
b870: 69 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e  itable space can
b880: 20 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65   be found on the
b890: 20 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75   free-list, retu
b8a0: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  rn NULL..**.** T
b8b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79  his function may
b8c0: 20 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69   detect corrupti
b8d0: 6f 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20  on within pPg.  
b8e0: 49 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  If corruption is
b8f0: 0a 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65  .** detected the
b900: 6e 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f  n *pRc is set to
b910: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
b920: 61 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  and NULL is retu
b930: 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74  rned..**.** Slot
b940: 73 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69  s on the free li
b950: 73 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77  st that are betw
b960: 65 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65  een 1 and 3 byte
b970: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42  s larger than nB
b980: 79 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69  yte.** will be i
b990: 67 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67  gnored if adding
b9a0: 20 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65   the extra space
b9b0: 20 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74   to the fragment
b9c0: 61 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63  ation count.** c
b9d0: 61 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65  auses the fragme
b9e0: 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f  ntation count to
b9f0: 20 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73   exceed 60..*/.s
ba00: 74 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69  tatic u8 *pageFi
ba10: 6e 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a  ndSlot(MemPage *
ba20: 70 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  pPg, int nByte, 
ba30: 69 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e  int *pRc){.  con
ba40: 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
ba50: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
ba60: 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20  8 * const aData 
ba70: 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20  = pPg->aData;.  
ba80: 69 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20  int iAddr = hdr 
ba90: 2b 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20  + 1;.  int pc = 
baa0: 67 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  get2byte(&aData[
bab0: 69 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78  iAddr]);.  int x
bac0: 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  ;.  int usableSi
bad0: 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75  ze = pPg->pBt->u
bae0: 73 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73  sableSize;..  as
baf0: 73 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20  sert( pc>0 );.  
bb00: 64 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65  do{.    int size
bb10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
bb20: 53 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65  Size of the free
bb30: 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   slot */.    /* 
bb40: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
bb50: 36 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62  6866-39125 Freeb
bb60: 6c 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73  locks are always
bb70: 20 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72   connected in or
bb80: 64 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e  der of.    ** in
bb90: 63 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e  creasing offset.
bba0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75   */.    if( pc>u
bbb0: 73 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70  sableSize-4 || p
bbc0: 63 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20  c<iAddr+4 ){.   
bbd0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
bbe0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
bbf0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
bc00: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
bc10: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30  ENCE-OF: R-22710
bc20: 2d 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64  -53328 The third
bc30: 20 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65   and fourth byte
bc40: 73 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a  s of each.    **
bc50: 20 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20   freeblock form 
bc60: 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  a big-endian int
bc70: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
bc80: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72  e size of the fr
bc90: 65 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69  eeblock.    ** i
bca0: 6e 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69  n bytes, includi
bcb0: 6e 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65  ng the 4-byte he
bcc0: 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a  ader. */.    siz
bcd0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  e = get2byte(&aD
bce0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
bcf0: 69 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20  if( (x = size - 
bd00: 6e 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20  nByte)>=0 ){.   
bd10: 20 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d     testcase( x==
bd20: 34 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  4 );.      testc
bd30: 61 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20  ase( x==3 );.   
bd40: 20 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d     if( pc < pPg-
bd50: 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
bd60: 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65  g->nCell || size
bd70: 2b 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65  +pc > usableSize
bd80: 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63   ){.        *pRc
bd90: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
bda0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
bdb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
bdc0: 7d 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b  }else if( x<4 ){
bdd0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44  .        /* EVID
bde0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38  ENCE-OF: R-11498
bdf0: 2d 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c  -58022 In a well
be00: 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70  -formed b-tree p
be10: 61 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20  age, the total. 
be20: 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
be30: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61   of bytes in fra
be40: 67 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65  gments may not e
be50: 78 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20  xceed 60. */.   
be60: 20 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68       if( aData[h
be70: 64 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72  dr+7]>57 ) retur
be80: 6e 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  n 0;..        /*
be90: 20 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74   Remove the slot
bea0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c   from the free-l
beb0: 69 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20  ist. Update the 
bec0: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20  number of.      
bed0: 20 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20    ** fragmented 
bee0: 62 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65  bytes within the
bef0: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
bf00: 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
bf10: 69 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70  iAddr], &aData[p
bf20: 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  c], 2);.        
bf30: 61 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20  aData[hdr+7] += 
bf40: 28 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c  (u8)x;.      }el
bf50: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
bf60: 68 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20  he slot remains 
bf70: 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
bf80: 2e 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a  . Reduce its siz
bf90: 65 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20  e to account.   
bfa0: 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65        ** for the
bfb0: 20 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79   portion used by
bfc0: 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74   the new allocat
bfd0: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
bfe0: 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
bff0: 70 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20  pc+2], x);.     
c000: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
c010: 26 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a  &aData[pc + x];.
c020: 20 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20      }.    iAddr 
c030: 3d 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67  = pc;.    pc = g
c040: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  et2byte(&aData[p
c050: 63 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  c]);.  }while( p
c060: 63 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30  c );..  return 0
c070: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
c080: 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20  ate nByte bytes 
c090: 6f 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69  of space from wi
c0a0: 74 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20  thin the B-Tree 
c0b0: 70 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61  page passed.** a
c0c0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
c0d0: 6d 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f  ment. Write into
c0e0: 20 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78   *pIdx the index
c0f0: 20 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61   into pPage->aDa
c100: 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66  ta[].** of the f
c110: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c  irst byte of all
c120: 6f 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65  ocated space. Re
c130: 74 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49  turn either SQLI
c140: 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65  TE_OK or.** an e
c150: 72 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c  rror code (usual
c160: 6c 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ly SQLITE_CORRUP
c170: 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  T)..**.** The ca
c180: 6c 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20  ller guarantees 
c190: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75  that there is su
c1a0: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74  fficient space t
c1b0: 6f 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c  o make the.** al
c1c0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20  location.  This 
c1d0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65  routine might ne
c1e0: 65 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74  ed to defragment
c1f0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69   in order to bri
c200: 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70  ng.** all the sp
c210: 61 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f  ace together, ho
c220: 77 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75  wever.  This rou
c230: 74 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20  tine will avoid 
c240: 75 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72  using.** the fir
c250: 73 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73  st two bytes pas
c260: 74 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  t the cell point
c270: 65 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72  er area since pr
c280: 65 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a  esumably this.**
c290: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62   allocation is b
c2a0: 65 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64  eing made in ord
c2b0: 65 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e  er to insert a n
c2c0: 65 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77  ew cell, so we w
c2d0: 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20  ill.** also end 
c2e0: 75 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77  up needing a new
c2f0: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
c300: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c  /.static int all
c310: 6f 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61  ocateSpace(MemPa
c320: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e  ge *pPage, int n
c330: 42 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29  Byte, int *pIdx)
c340: 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64  {.  const int hd
c350: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
c360: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61  fset;    /* Loca
c370: 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65  l cache of pPage
c380: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20  ->hdrOffset */. 
c390: 20 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61   u8 * const data
c3a0: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
c3b0: 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63        /* Local c
c3c0: 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61  ache of pPage->a
c3d0: 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  Data */.  int to
c3e0: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
c3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c400: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
c410: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
c420: 61 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  a */.  int rc = 
c430: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
c440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
c450: 6e 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f  nteger return co
c460: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b  de */.  int gap;
c470: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
c480: 20 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74   byte of gap bet
c490: 77 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65  ween cell pointe
c4a0: 72 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74  rs and cell cont
c4b0: 65 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  ent */.  .  asse
c4c0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
c4d0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
c4e0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
c4f0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c500: 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
c510: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
c520: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
c530: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
c540: 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20  rt( nByte>=0 ); 
c550: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
c560: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20   size is 4 */.  
c570: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c580: 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20  Free>=nByte );. 
c590: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
c5a0: 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
c5b0: 20 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20    assert( nByte 
c5c0: 3c 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70  < (int)(pPage->p
c5d0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38  Bt->usableSize-8
c5e0: 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
c5f0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
c600: 74 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  t == hdr + 12 - 
c610: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b  4*pPage->leaf );
c620: 0a 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e  .  gap = pPage->
c630: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70  cellOffset + 2*p
c640: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61  Page->nCell;.  a
c650: 73 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33  ssert( gap<=6553
c660: 36 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e  6 );.  /* EVIDEN
c670: 43 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30  CE-OF: R-29356-0
c680: 32 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61  2391 If the data
c690: 62 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33  base uses a 6553
c6a0: 36 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65  6-byte page size
c6b0: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65  .  ** and the re
c6c0: 73 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20  served space is 
c6d0: 7a 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20  zero (the usual 
c6e0: 76 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76  value for reserv
c6f0: 65 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74  ed space).  ** t
c700: 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  hen the cell con
c710: 74 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61  tent offset of a
c720: 6e 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e  n empty page wan
c730: 74 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a  ts to be 65536..
c740: 20 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68    ** However, th
c750: 61 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f  at integer is to
c760: 6f 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74  o large to be st
c770: 6f 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65  ored in a 2-byte
c780: 20 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69   unsigned.  ** i
c790: 6e 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c  nteger, so a val
c7a0: 75 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20  ue of 0 is used 
c7b0: 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f  in its place. */
c7c0: 0a 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74  .  top = get2byt
c7d0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
c7e0: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d  .  assert( top<=
c7f0: 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d  (int)pPage->pBt-
c800: 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f  >usableSize ); /
c810: 2a 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74  * Prevent by get
c820: 41 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f  AndInitPage() */
c830: 0a 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29  .  if( gap>top )
c840: 7b 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30  {.    if( top==0
c850: 20 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   && pPage->pBt->
c860: 75 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33  usableSize==6553
c870: 36 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d  6 ){.      top =
c880: 20 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73   65536;.    }els
c890: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
c8a0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
c8b0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  KPT;.    }.  }..
c8c0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
c8d0: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65   enough space be
c8e0: 74 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f  tween gap and to
c8f0: 70 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63  p for one more c
c900: 65 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ell pointer.  **
c910: 20 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66   array entry off
c920: 73 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20  set, and if the 
c930: 66 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20  freelist is not 
c940: 65 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72  empty, then sear
c950: 63 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65  ch the.  ** free
c960: 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72  list looking for
c970: 20 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67   a free slot big
c980: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
c990: 66 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  fy the request..
c9a0: 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28    */.  testcase(
c9b0: 20 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20   gap+2==top );. 
c9c0: 20 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31   testcase( gap+1
c9d0: 3d 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63  ==top );.  testc
c9e0: 61 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b  ase( gap==top );
c9f0: 0a 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72  .  if( (data[hdr
ca00: 2b 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b  +2] || data[hdr+
ca10: 31 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f  1]) && gap+2<=to
ca20: 70 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70  p ){.    u8 *pSp
ca30: 61 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  ace = pageFindSl
ca40: 6f 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c  ot(pPage, nByte,
ca50: 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70   &rc);.    if( p
ca60: 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Space ){.      a
ca70: 73 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64  ssert( pSpace>=d
ca80: 61 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d  ata && (pSpace -
ca90: 20 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a   data)<65536 );.
caa0: 20 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69        *pIdx = (i
cab0: 6e 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74  nt)(pSpace - dat
cac0: 61 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  a);.      return
cad0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
cae0: 7d 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a  }else if( rc ){.
caf0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
cb00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
cb10: 20 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75   The request cou
cb20: 6c 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c  ld not be fulfil
cb30: 6c 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65  led using a free
cb40: 6c 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63  list slot.  Chec
cb50: 6b 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66  k.  ** to see if
cb60: 20 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e   defragmentation
cb70: 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   is necessary.. 
cb80: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
cb90: 67 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70  gap+2+nByte==top
cba0: 20 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b   );.  if( gap+2+
cbb0: 6e 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20  nByte>top ){.   
cbc0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
cbd0: 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55  nCell>0 || CORRU
cbe0: 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20  PT_DB );.    rc 
cbf0: 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  = defragmentPage
cc00: 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
cc10: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
cc20: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
cc30: 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61  yteNotZero(&data
cc40: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73  [hdr+5]);.    as
cc50: 73 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c  sert( gap+nByte<
cc60: 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20  =top );.  }...  
cc70: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
cc80: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
cc90: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
cca0: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
ccb0: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
ccc0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ccd0: 2e 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74  .  The btreeInit
cce0: 50 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20  Page() call has 
ccf0: 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c  already.  ** val
cd00: 69 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c  idated the freel
cd10: 69 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74  ist.  Given that
cd20: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
cd30: 20 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20   valid, there.  
cd40: 2a 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61  ** is no way tha
cd50: 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  t the allocation
cd60: 20 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20   can extend off 
cd70: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
cd80: 61 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73  age..  ** The as
cd90: 73 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72  sert() below ver
cda0: 69 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f  ifies the previo
cdb0: 75 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a  us sentence..  *
cdc0: 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65  /.  top -= nByte
cdd0: 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
cde0: 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b  ta[hdr+5], top);
cdf0: 0a 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e  .  assert( top+n
ce00: 42 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61  Byte <= (int)pPa
ce10: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
ce20: 69 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d  ize );.  *pIdx =
ce30: 20 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53   top;.  return S
ce40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
ce50: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74  ** Return a sect
ce60: 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65  ion of the pPage
ce70: 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66  ->aData to the f
ce80: 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20  reelist..** The 
ce90: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
cea0: 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b  e new free block
ceb0: 20 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61   is pPage->aData
cec0: 5b 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  [iStart].** and 
ced0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
cee0: 62 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62  block is iSize b
cef0: 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61  ytes..**.** Adja
cf00: 63 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20  cent freeblocks 
cf10: 61 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a  are coalesced..*
cf20: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65  *.** Note that e
cf30: 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66  ven though the f
cf40: 72 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61  reeblock list wa
cf50: 73 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72  s checked by btr
cf60: 65 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a  eeInitPage(),.**
cf70: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69   that routine wi
cf80: 6c 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76  ll not detect ov
cf90: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65  erlap between ce
cfa0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
cfb0: 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20  s.  Nor.** does 
cfc0: 69 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20  it detect cells 
cfd0: 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68  or freeblocks th
cfe0: 61 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f  at encrouch into
cff0: 20 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79   the reserved by
d000: 74 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  tes.** at the en
d010: 64 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  d of the page.  
d020: 53 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c  So do additional
d030: 20 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63   corruption chec
d040: 6b 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a  ks inside this.*
d050: 2a 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65  * routine and re
d060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d070: 55 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c  UPT if any probl
d080: 65 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a  ems are found..*
d090: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  /.static int fre
d0a0: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
d0b0: 70 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72  pPage, u16 iStar
d0c0: 74 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20  t, u16 iSize){. 
d0d0: 20 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20   u16 iPtr;      
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
d100: 73 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74  s of ptr to next
d110: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
d120: 75 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20  u16 iFreeBlk;   
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d150: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65   of the next fre
d160: 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68  eblock */.  u8 h
d170: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d190: 20 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72    /* Page header
d1a0: 20 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30   size.  0 or 100
d1b0: 20 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d   */.  u8 nFrag =
d1c0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
d1d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
d1e0: 65 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67  eduction in frag
d1f0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  mentation */.  u
d200: 31 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69  16 iOrigSize = i
d210: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
d220: 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
d230: 20 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20   value of iSize 
d240: 2a 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d  */.  u32 iLast =
d250: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
d260: 62 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61  bleSize-4; /* La
d270: 72 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66  rgest possible f
d280: 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20  reeblock offset 
d290: 2a 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20  */.  u32 iEnd = 
d2a0: 69 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20  iStart + iSize; 
d2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
d2c0: 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
d2d0: 65 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20  e iStart buffer 
d2e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
d2f0: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
d300: 2d 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61  ->aData;   /* Pa
d310: 67 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20  ge content */.. 
d320: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
d330: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
d340: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
d350: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
d360: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
d370: 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
d380: 5f 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70  _DB || iStart>=p
d390: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
d3a0: 36 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  6+pPage->childPt
d3b0: 72 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  rSize );.  asser
d3c0: 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
d3d0: 20 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e   iEnd <= pPage->
d3e0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
d3f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
d400: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
d410: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
d420: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
d430: 69 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a  iSize>=4 );   /*
d440: 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69   Minimum cell si
d450: 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73  ze is 4 */.  ass
d460: 65 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61  ert( iStart<=iLa
d470: 73 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72  st );..  /* Over
d480: 77 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e  write deleted in
d490: 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a  formation with z
d4a0: 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65  eros when the se
d4b0: 63 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a  cure_delete.  **
d4c0: 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
d4d0: 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  ed */.  if( pPag
d4e0: 65 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  e->pBt->btsFlags
d4f0: 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
d500: 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73  LETE ){.    mems
d510: 65 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d  et(&data[iStart]
d520: 2c 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d  , 0, iSize);.  }
d530: 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20  ..  /* The list 
d540: 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75  of freeblocks mu
d550: 73 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69  st be in ascendi
d560: 6e 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20  ng order.  Find 
d570: 74 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f  the .  ** spot o
d580: 6e 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65  n the list where
d590: 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62   iStart should b
d5a0: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  e inserted..  */
d5b0: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
d5c0: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74  hdrOffset;.  iPt
d5d0: 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69  r = hdr + 1;.  i
d5e0: 66 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d  f( data[iPtr+1]=
d5f0: 3d 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d  =0 && data[iPtr]
d600: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65  ==0 ){.    iFree
d610: 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f  Blk = 0;  /* Sho
d620: 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61  rtcut for the ca
d630: 73 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65  se when the free
d640: 6c 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f  list is empty */
d650: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
d660: 69 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d  ile( (iFreeBlk =
d670: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d680: 69 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72  iPtr]))>0 && iFr
d690: 65 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a  eeBlk<iStart ){.
d6a0: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
d6b0: 6c 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75  lk<iPtr+4 ) retu
d6c0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
d6d0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50  T_BKPT;.      iP
d6e0: 74 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20  tr = iFreeBlk;. 
d6f0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72     }.    if( iFr
d700: 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65  eeBlk>iLast ) re
d710: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
d720: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73  UPT_BKPT;.    as
d730: 73 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69  sert( iFreeBlk>i
d740: 50 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d  Ptr || iFreeBlk=
d750: 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  =0 );.  .    /* 
d760: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20  At this point:. 
d770: 20 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c     **    iFreeBl
d780: 6b 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62  k:   First freeb
d790: 6c 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72  lock after iStar
d7a0: 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f  t, or zero if no
d7b0: 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74  ne.    **    iPt
d7c0: 72 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64  r:       The add
d7d0: 72 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65  ress of a pointe
d7e0: 72 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20  r to iFreeBlk.  
d7f0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63    **.    ** Chec
d800: 6b 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65  k to see if iFre
d810: 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63  eBlk should be c
d820: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
d830: 65 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e  e end of iStart.
d840: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d850: 69 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64  iFreeBlk && iEnd
d860: 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a  +3>=iFreeBlk ){.
d870: 20 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46        nFrag = iF
d880: 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20  reeBlk - iEnd;. 
d890: 20 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46       if( iEnd>iF
d8a0: 72 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20  reeBlk ) return 
d8b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
d8c0: 4b 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  KPT;.      iEnd 
d8d0: 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74  = iFreeBlk + get
d8e0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
d8f0: 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20  eBlk+2]);.      
d900: 69 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65  if( iEnd > pPage
d910: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
d920: 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
d930: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
d940: 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45        iSize = iE
d950: 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20  nd - iStart;.   
d960: 20 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65     iFreeBlk = ge
d970: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72  t2byte(&data[iFr
d980: 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20  eeBlk]);.    }. 
d990: 20 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72   .    /* If iPtr
d9a0: 20 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65   is another free
d9b0: 62 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20  block (that is, 
d9c0: 69 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74  if iPtr is not t
d9d0: 68 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20  he freelist.    
d9e0: 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
d9f0: 65 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74  e page header) t
da00: 68 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65  hen check to see
da10: 20 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c   if iStart shoul
da20: 64 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c  d be.    ** coal
da30: 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65  esced onto the e
da40: 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20  nd of iPtr..    
da50: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e  */.    if( iPtr>
da60: 68 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69  hdr+1 ){.      i
da70: 6e 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74  nt iPtrEnd = iPt
da80: 72 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61  r + get2byte(&da
da90: 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20  ta[iPtr+2]);.   
daa0: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33     if( iPtrEnd+3
dab0: 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20  >=iStart ){.    
dac0: 20 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e      if( iPtrEnd>
dad0: 69 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20  iStart ) return 
dae0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
daf0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72  KPT;.        nFr
db00: 61 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69  ag += iStart - i
db10: 50 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20  PtrEnd;.        
db20: 69 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69  iSize = iEnd - i
db30: 50 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74  Ptr;.        iSt
db40: 61 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20  art = iPtr;.    
db50: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
db60: 28 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72  ( nFrag>data[hdr
db70: 2b 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c  +7] ) return SQL
db80: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
db90: 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37  ;.    data[hdr+7
dba0: 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a  ] -= nFrag;.  }.
dbb0: 20 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65    if( iStart==ge
dbc0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
dbd0: 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  +5]) ){.    /* T
dbe0: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
dbf0: 20 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e   is at the begin
dc00: 6e 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c  ning of the cell
dc10: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20   content area,. 
dc20: 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78     ** so just ex
dc30: 74 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f  tend the cell co
dc40: 6e 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65  ntent area rathe
dc50: 72 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e  r than create an
dc60: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65  other.    ** fre
dc70: 65 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20  elist entry */. 
dc80: 20 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72     if( iPtr!=hdr
dc90: 2b 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  +1 ) return SQLI
dca0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
dcb0: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
dcc0: 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65  ata[hdr+1], iFre
dcd0: 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62  eBlk);.    put2b
dce0: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
dcf0: 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65  , iEnd);.  }else
dd00: 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20  {.    /* Insert 
dd10: 74 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63  the new freebloc
dd20: 6b 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c  k into the freel
dd30: 69 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62  ist */.    put2b
dd40: 79 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c  yte(&data[iPtr],
dd50: 20 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75   iStart);.    pu
dd60: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74  t2byte(&data[iSt
dd70: 61 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b  art], iFreeBlk);
dd80: 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
dd90: 61 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69  ata[iStart+2], i
dda0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61  Size);.  }.  pPa
ddb0: 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72  ge->nFree += iOr
ddc0: 69 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e  igSize;.  return
ddd0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
dde0: 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20  *.** Decode the 
ddf0: 66 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20  flags byte (the 
de00: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
de10: 65 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20  e header) for a 
de20: 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  page.** and init
de30: 69 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66  ialize fields of
de40: 20 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72   the MemPage str
de50: 75 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67  ucture according
de60: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74  ly..**.** Only t
de70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
de80: 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75  binations are su
de90: 70 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69  pported.  Anythi
dea0: 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  ng different.** 
deb0: 69 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72  indicates a corr
dec0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
ded0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  es:.**.**       
dee0: 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a    PTF_ZERODATA.*
def0: 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45  *         PTF_ZE
df00: 52 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41  RODATA | PTF_LEA
df10: 46 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  F.**         PTF
df20: 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f  _LEAFDATA | PTF_
df30: 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20  INTKEY.**       
df40: 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c    PTF_LEAFDATA |
df50: 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54   PTF_INTKEY | PT
df60: 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63  F_LEAF.*/.static
df70: 20 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73   int decodeFlags
df80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
df90: 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a   int flagByte){.
dfa0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
dfb0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f       /* A copy o
dfc0: 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a  f pPage->pBt */.
dfd0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
dfe0: 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50  ->hdrOffset==(pP
dff0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
e000: 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73  00 : 0) );.  ass
e010: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e020: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
e030: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
e040: 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75  pPage->leaf = (u
e050: 38 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b  8)(flagByte>>3);
e060: 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45    assert( PTF_LE
e070: 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20  AF == 1<<3 );.  
e080: 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46  flagByte &= ~PTF
e090: 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e  _LEAF;.  pPage->
e0a0: 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34  childPtrSize = 4
e0b0: 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  -4*pPage->leaf;.
e0c0: 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69    pPage->xCellSi
e0d0: 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ze = cellSizePtr
e0e0: 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d  ;.  pBt = pPage-
e0f0: 3e 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67  >pBt;.  if( flag
e100: 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44  Byte==(PTF_LEAFD
e110: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
e120: 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) ){.    /* EVID
e130: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30  ENCE-OF: R-03640
e140: 2d 31 33 34 31 35 20 41 20 76 61 6c 75 65 20 6f  -13415 A value o
e150: 66 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70 61  f 5 means the pa
e160: 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f  ge is an interio
e170: 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62  r.    ** table b
e180: 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20  -tree page. */. 
e190: 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f     assert( (PTF_
e1a0: 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54  LEAFDATA|PTF_INT
e1b0: 4b 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f  KEY)==5 );.    /
e1c0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e1d0: 2d 32 30 35 30 31 2d 36 31 37 39 36 20 41 20 76  -20501-61796 A v
e1e0: 61 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e 73  alue of 13 means
e1f0: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c   the page is a l
e200: 65 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65  eaf.    ** table
e210: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e220: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e230: 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49  F_LEAFDATA|PTF_I
e240: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d  NTKEY|PTF_LEAF)=
e250: 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65  =13 );.    pPage
e260: 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20  ->intKey = 1;.  
e270: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
e280: 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  f ){.      pPage
e290: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31  ->intKeyLeaf = 1
e2a0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78  ;.      pPage->x
e2b0: 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65  ParseCell = btre
e2c0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a 20  eParseCellPtr;. 
e2d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e2e0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
e2f0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
e300: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d 20  ge->xCellSize = 
e310: 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79  cellSizePtrNoPay
e320: 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61 67  load;.      pPag
e330: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
e340: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
e350: 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  rNoPayload;.    
e360: 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  }.    pPage->max
e370: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
e380: 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  Leaf;.    pPage-
e390: 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >minLocal = pBt-
e3a0: 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c 73  >minLeaf;.  }els
e3b0: 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d  e if( flagByte==
e3c0: 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b 0a  PTF_ZERODATA ){.
e3d0: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e3e0: 4f 46 3a 20 52 2d 32 37 32 32 35 2d 35 33 39 33  OF: R-27225-5393
e3f0: 36 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20 6d  6 A value of 2 m
e400: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e410: 20 61 6e 20 69 6e 74 65 72 69 6f 72 0a 20 20 20   an interior.   
e420: 20 2a 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65   ** index b-tree
e430: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73   page. */.    as
e440: 73 65 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44  sert( (PTF_ZEROD
e450: 41 54 41 29 3d 3d 32 20 29 3b 0a 20 20 20 20 2f  ATA)==2 );.    /
e460: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
e470: 2d 31 36 35 37 31 2d 31 31 36 31 35 20 41 20 76  -16571-11615 A v
e480: 61 6c 75 65 20 6f 66 20 31 30 20 6d 65 61 6e 73  alue of 10 means
e490: 20 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c   the page is a l
e4a0: 65 61 66 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  eaf.    ** index
e4b0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e4c0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e4d0: 46 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c  F_ZERODATA|PTF_L
e4e0: 45 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20  EAF)==10 );.    
e4f0: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
e500: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  0;.    pPage->in
e510: 74 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20  tKeyLeaf = 0;.  
e520: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
e530: 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65  ell = btreeParse
e540: 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20  CellPtrIndex;.  
e550: 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61    pPage->maxLoca
e560: 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61  l = pBt->maxLoca
e570: 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69  l;.    pPage->mi
e580: 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69  nLocal = pBt->mi
e590: 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b  nLocal;.  }else{
e5a0: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e5b0: 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34  -OF: R-47608-564
e5c0: 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c  69 Any other val
e5d0: 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65  ue for the b-tre
e5e0: 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20  e page type is. 
e5f0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20     ** an error. 
e600: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
e610: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
e620: 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  T;.  }.  pPage->
e630: 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
e640: 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50  = pBt->max1byteP
e650: 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e  ayload;.  return
e660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e670: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
e680: 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e  the auxiliary in
e690: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20  formation for a 
e6a0: 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  disk block..**.*
e6b0: 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
e6c0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  OK on success.  
e6d0: 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74  If we see that t
e6e0: 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20  he page does.** 
e6f0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65  not contain a we
e700: 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61  ll-formed databa
e710: 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65  se page, then re
e720: 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  turn .** SQLITE_
e730: 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74  CORRUPT.  Note t
e740: 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20  hat a return of 
e750: 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e  SQLITE_OK does n
e760: 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20  ot.** guarantee 
e770: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
e780: 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49   well-formed.  I
e790: 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61  t only shows tha
e7a0: 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74  t.** we failed t
e7b0: 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72  o detect any cor
e7c0: 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
e7d0: 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74  ic int btreeInit
e7e0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
e7f0: 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28  age){..  assert(
e800: 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29   pPage->pBt!=0 )
e810: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
e820: 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b  e->pBt->db!=0 );
e830: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e840: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
e850: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
e860: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e870: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74  age->pgno==sqlit
e880: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
e890: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
e8a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
e8b0: 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50  Page == sqlite3P
e8c0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
e8d0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
e8e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e8f0: 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65  >aData == sqlite
e900: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
e910: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
e920: 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ..  if( !pPage->
e930: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31  isInit ){.    u1
e940: 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20  6 pc;           
e950: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61   /* Address of a
e960: 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69   freeblock withi
e970: 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  n pPage->aData[]
e980: 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20   */.    u8 hdr; 
e990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
e9a0: 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e  fset to beginnin
e9b0: 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72  g of page header
e9c0: 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61   */.    u8 *data
e9d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71  ;          /* Eq
e9e0: 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44  ual to pPage->aD
e9f0: 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61  ata */.    BtSha
ea00: 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20  red *pBt;       
ea10: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72   /* The main btr
ea20: 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
ea30: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
ea40: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
ea50: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
ea60: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
ea70: 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66  .    u16 cellOff
ea80: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
ea90: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
eaa0: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
eab0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
eac0: 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
ead0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
eae0: 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f  f unused bytes o
eaf0: 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  n the page */.  
eb00: 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
eb10: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
eb20: 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  te of the cell c
eb30: 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20  ontent area */. 
eb40: 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73     int iCellFirs
eb50: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61  t;    /* First a
eb60: 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72  llowable cell or
eb70: 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65   freeblock offse
eb80: 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65  t */.    int iCe
eb90: 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c  llLast;     /* L
eba0: 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c  ast possible cel
ebb0: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
ebc0: 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42  ffset */..    pB
ebd0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
ebe0: 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65  .    hdr = pPage
ebf0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20  ->hdrOffset;.   
ec00: 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
ec10: 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49  Data;.    /* EVI
ec20: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39  DENCE-OF: R-2859
ec30: 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d  4-02890 The one-
ec40: 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66  byte flag at off
ec50: 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67  set 0 indicating
ec60: 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72  .    ** the b-tr
ec70: 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f  ee page type. */
ec80: 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46  .    if( decodeF
ec90: 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61  lags(pPage, data
eca0: 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20  [hdr]) ) return 
ecb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
ecc0: 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28  KPT;.    assert(
ecd0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d   pBt->pageSize>=
ece0: 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65  512 && pBt->page
ecf0: 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20  Size<=65536 );. 
ed00: 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61     pPage->maskPa
ed10: 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e  ge = (u16)(pBt->
ed20: 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20  pageSize - 1);. 
ed30: 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66     pPage->nOverf
ed40: 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61  low = 0;.    usa
ed50: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
ed60: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70  sableSize;.    p
ed70: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
ed80: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20   = cellOffset = 
ed90: 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d  hdr + 8 + pPage-
eda0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20  >childPtrSize;. 
edb0: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45     pPage->aDataE
edc0: 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c  nd = &data[usabl
edd0: 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67  eSize];.    pPag
ede0: 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
edf0: 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b  ata[cellOffset];
ee00: 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74  .    pPage->aDat
ee10: 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50  aOfst = &data[pP
ee20: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
ee30: 65 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  e];.    /* EVIDE
ee40: 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d  NCE-OF: R-58015-
ee50: 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79  48175 The two-by
ee60: 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  te integer at of
ee70: 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65  fset 5 designate
ee80: 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61  s.    ** the sta
ee90: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63  rt of the cell c
eea0: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a  ontent area. A z
eeb0: 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ero value for th
eec0: 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20  is integer is.  
eed0: 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64    ** interpreted
eee0: 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20   as 65536. */.  
eef0: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
ef00: 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64  NotZero(&data[hd
ef10: 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56  r+5]);.    /* EV
ef20: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30  IDENCE-OF: R-370
ef30: 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f  02-32774 The two
ef40: 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74  -byte integer at
ef50: 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20   offset 3 gives 
ef60: 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  the.    ** numbe
ef70: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
ef80: 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70  e page. */.    p
ef90: 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65  Page->nCell = ge
efa0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
efb0: 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50  +3]);.    if( pP
efc0: 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45  age->nCell>MX_CE
efd0: 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  LL(pBt) ){.     
efe0: 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c   /* To many cell
eff0: 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70  s for a single p
f000: 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d  age.  The page m
f010: 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a  ust be corrupt *
f020: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
f030: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f040: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  PT;.    }.    te
f050: 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
f060: 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42  Cell==MX_CELL(pB
f070: 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  t) );.    /* EVI
f080: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38  DENCE-OF: R-2408
f090: 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67  9-57979 If a pag
f0a0: 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
f0b0: 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e  lls (which is on
f0c0: 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62  ly.    ** possib
f0d0: 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61  le for a root pa
f0e0: 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68  ge of a table th
f0f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72  at contains no r
f100: 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20  ows) then the.  
f110: 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74    ** offset to t
f120: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
f130: 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20  area will equal 
f140: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69  the page size mi
f150: 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62  nus the.    ** b
f160: 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64  ytes of reserved
f170: 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61   space. */.    a
f180: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
f190: 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73  ell>0 || top==us
f1a0: 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52  ableSize || CORR
f1b0: 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f  UPT_DB );..    /
f1c0: 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61  * A malformed da
f1d0: 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68  tabase page migh
f1e0: 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65  t cause us to re
f1f0: 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a  ad past the end.
f200: 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77      ** of page w
f210: 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65  hen parsing a ce
f220: 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ll.  .    **.   
f230: 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
f240: 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  g block of code 
f250: 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20  checks early to 
f260: 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78  see if a cell ex
f270: 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73  tends.    ** pas
f280: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70  t the end of a p
f290: 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64  age boundary and
f2a0: 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43   causes SQLITE_C
f2b0: 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20  ORRUPT to be .  
f2c0: 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66    ** returned if
f2d0: 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f   it does..    */
f2e0: 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20  .    iCellFirst 
f2f0: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  = cellOffset + 2
f300: 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20  *pPage->nCell;. 
f310: 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75     iCellLast = u
f320: 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
f330: 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e     if( pBt->db->
f340: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43  flags & SQLITE_C
f350: 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20  ellSizeCk ){.   
f360: 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20     int i;       
f370: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
f380: 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  to the cell poin
f390: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  ter array */.   
f3a0: 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20     int sz;      
f3b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
f3c0: 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20  a cell */..     
f3d0: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f3e0: 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b  f ) iCellLast--;
f3f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
f400: 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
f410: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63  i++){.        pc
f420: 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e   = get2byteAlign
f430: 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66  ed(&data[cellOff
f440: 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20  set+i*2]);.     
f450: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d     testcase( pc=
f460: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
f470: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f480: 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29   pc==iCellLast )
f490: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  ;.        if( pc
f4a0: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
f4b0: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
f4c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f4d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f4e0: 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  KPT;.        }. 
f4f0: 20 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67         sz = pPag
f500: 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
f510: 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a  ge, &data[pc]);.
f520: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
f530: 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53  ( pc+sz==usableS
f540: 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
f550: 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53  f( pc+sz>usableS
f560: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
f570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
f580: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
f590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
f5a0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
f5b0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
f5c0: 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20  t++;.    }  ..  
f5d0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
f5e0: 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63   total free spac
f5f0: 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  e on the page.  
f600: 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
f610: 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20  : R-23588-34450 
f620: 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74  The two-byte int
f630: 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31  eger at offset 1
f640: 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a   gives the.    *
f650: 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66  * start of the f
f660: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f  irst freeblock o
f670: 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69  n the page, or i
f680: 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  s zero if there 
f690: 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72  are no.    ** fr
f6a0: 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20  eeblocks. */.   
f6b0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26   pc = get2byte(&
f6c0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
f6d0: 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68    nFree = data[h
f6e0: 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a  dr+7] + top;  /*
f6f0: 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e   Init nFree to n
f700: 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65  on-freeblock fre
f710: 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77  e space */.    w
f720: 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20  hile( pc>0 ){.  
f730: 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69      u16 next, si
f740: 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63  ze;.      if( pc
f750: 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70  <iCellFirst || p
f760: 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20  c>iCellLast ){. 
f770: 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e         /* EVIDEN
f780: 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35  CE-OF: R-55530-5
f790: 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66  2930 In a well-f
f7a0: 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67  ormed b-tree pag
f7b0: 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20  e, there will.  
f7c0: 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20        ** always 
f7d0: 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  be at least one 
f7e0: 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20  cell before the 
f7f0: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e  first freeblock.
f800: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
f810: 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66      ** Or, the f
f820: 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20  reeblock is off 
f830: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
f840: 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  age.        */. 
f850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
f860: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f870: 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  T; .      }.    
f880: 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74    next = get2byt
f890: 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  e(&data[pc]);.  
f8a0: 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62      size = get2b
f8b0: 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29  yte(&data[pc+2])
f8c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78  ;.      if( (nex
f8d0: 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b  t>0 && next<=pc+
f8e0: 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69  size+3) || pc+si
f8f0: 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b  ze>usableSize ){
f900: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
f910: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
f920: 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
f930: 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74  er. And the last
f940: 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20   byte of.       
f950: 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f   ** the free-blo
f960: 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74  ck must lie on t
f970: 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  he database page
f980: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  .  */.        re
f990: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
f9a0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
f9b0: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d   }.      nFree =
f9c0: 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20   nFree + size;. 
f9d0: 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a       pc = next;.
f9e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74      }..    /* At
f9f0: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72   this point, nFr
fa00: 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ee contains the 
fa10: 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65  sum of the offse
fa20: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
fa30: 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c     ** of the cel
fa40: 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70  l-content area p
fa50: 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  lus the number o
fa60: 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74  f free bytes wit
fa70: 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  hin.    ** the c
fa80: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell-content area
fa90: 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65  . If this is gre
faa0: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73  ater than the us
fab0: 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a  able-size.    **
fac0: 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68   of the page, th
fad0: 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74  en the page must
fae0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54   be corrupted. T
faf0: 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20  his check also. 
fb00: 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20     ** serves to 
fb10: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
fb20: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
fb30: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
fb40: 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61  content.    ** a
fb50: 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  rea, according t
fb60: 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  o the page heade
fb70: 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74  r, lies within t
fb80: 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  he page..    */.
fb90: 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73      if( nFree>us
fba0: 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
fbb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbc0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
fbd0: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e     }.    pPage->
fbe0: 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46  nFree = (u16)(nF
fbf0: 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74  ree - iCellFirst
fc00: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
fc10: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Init = 1;.  }.  
fc20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fc30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
fc40: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
fc50: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
fc60: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
fc70: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
fc80: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
fc90: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
fca0: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
fcb0: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
fcc0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
fcd0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
fce0: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
fcf0: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
fd00: 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61  ;.  u8 hdr = pPa
fd10: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
fd20: 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61   u16 first;..  a
fd30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
fd40: 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50  gerPagenumber(pP
fd50: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
fd60: 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20  Page->pgno );.  
fd70: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
fd80: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61  agerGetExtra(pPa
fd90: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
fda0: 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a  (void*)pPage );.
fdb0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
fdc0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
fdd0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
fde0: 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72   data );.  asser
fdf0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
fe00: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
fe10: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
fe20: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
fe30: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
fe40: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
fe50: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
fe60: 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
fe70: 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  E ){.    memset(
fe80: 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70  &data[hdr], 0, p
fe90: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
fea0: 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74   hdr);.  }.  dat
feb0: 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66  a[hdr] = (char)f
fec0: 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20  lags;.  first = 
fed0: 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54  hdr + ((flags&PT
fee0: 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20  F_LEAF)==0 ? 12 
fef0: 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  : 8);.  memset(&
ff00: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20  data[hdr+1], 0, 
ff10: 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37  4);.  data[hdr+7
ff20: 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74  ] = 0;.  put2byt
ff30: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
ff40: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
ff50: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
ff60: 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
ff70: 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74  ableSize - first
ff80: 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  );.  decodeFlags
ff90: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
ffa0: 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66    pPage->cellOff
ffb0: 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70  set = first;.  p
ffc0: 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d  Page->aDataEnd =
ffd0: 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62   &data[pBt->usab
ffe0: 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65  leSize];.  pPage
fff0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
10000 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61  ta[first];.  pPa
10010 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20  ge->aDataOfst = 
10020 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69  &data[pPage->chi
10030 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50  ldPtrSize];.  pP
10040 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
10050 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   0;.  assert( pB
10060 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
10070 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
10080 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50  e<=65536 );.  pP
10090 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20  age->maskPage = 
100a0 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53  (u16)(pBt->pageS
100b0 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67  ize - 1);.  pPag
100c0 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  e->nCell = 0;.  
100d0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
100e0 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  1;.}.../*.** Con
100f0 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62  vert a DbPage ob
10100 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  tained from the 
10110 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d  pager into a Mem
10120 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  Page used by.** 
10130 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e  the btree layer.
10140 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61  .*/.static MemPa
10150 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f  ge *btreePageFro
10160 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a  mDbPage(DbPage *
10170 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67  pDbPage, Pgno pg
10180 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42  no, BtShared *pB
10190 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
101a0 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a  Page = (MemPage*
101b0 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
101c0 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a  Extra(pDbPage);.
101d0 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67    if( pgno!=pPag
101e0 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  e->pgno ){.    p
101f0 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71  Page->aData = sq
10200 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
10210 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
10220 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d  pPage->pDbPage =
10230 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50   pDbPage;.    pP
10240 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
10250 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20      pPage->pgno 
10260 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67  = pgno;.    pPag
10270 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70  e->hdrOffset = p
10280 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
10290 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
102a0 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71  pPage->aData==sq
102b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
102c0 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  a(pDbPage) );.  
102d0 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d  return pPage; .}
102e0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
102f0 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
10300 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
10310 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
10320 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
10330 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
10340 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73  needed.  See als
10350 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65  o: btreeGetUnuse
10360 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  dPage()..**.** I
10370 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f  f the PAGER_GET_
10380 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69  NOCONTENT flag i
10390 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20  s set, it means 
103a0 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63  that we do not c
103b0 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65  are.** about the
103c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
103d0 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d  page at this tim
103e0 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f  e.  So do not go
103f0 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20   to the disk.** 
10400 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e  to fetch the con
10410 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c  tent.  Just fill
10420 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   in the content 
10430 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e  with zeros for n
10440 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65  ow..** If in the
10450 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20   future we call 
10460 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
10470 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65  e() on this page
10480 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20  , that.** means 
10490 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20  we have started 
104a0 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20  to be concerned 
104b0 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e  about content an
104c0 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65  d the disk.** re
104d0 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20  ad should occur 
104e0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a  at that point..*
104f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
10500 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53  eeGetPage(.  BtS
10510 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
10520 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
10530 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
10540 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
10550 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
10560 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d  o fetch */.  Mem
10570 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10580 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
10590 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72  page in this par
105a0 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ameter */.  int 
105b0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
105c0 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f   /* PAGER_GET_NO
105d0 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52  CONTENT or PAGER
105e0 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f  _GET_READONLY */
105f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
10600 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10610 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ..  assert( flag
10620 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50  s==0 || flags==P
10630 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
10640 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47  NT || flags==PAG
10650 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20  ER_GET_READONLY 
10660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
10670 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
10680 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
106a0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
106b0 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65  r, pgno, (DbPage
106c0 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61  **)&pDbPage, fla
106d0 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  gs);.  if( rc ) 
106e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70  return rc;.  *pp
106f0 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
10700 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
10710 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
10720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10730 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
10740 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f  rieve a page fro
10750 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  m the pager cach
10760 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  e. If the reques
10770 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a  ted page is not.
10780 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  ** already in th
10790 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65  e pager cache re
107a0 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69  turn NULL. Initi
107b0 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
107c0 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
107d0 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
107e0 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
107f0 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65  /.static MemPage
10800 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75   *btreePageLooku
10810 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
10820 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44   Pgno pgno){.  D
10830 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
10840 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10850 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10860 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44  ->mutex) );.  pD
10870 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50  bPage = sqlite3P
10880 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e  agerLookup(pBt->
10890 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
108a0 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a   if( pDbPage ){.
108b0 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
108c0 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
108d0 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
108e0 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
108f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
10900 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
10910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10920 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74  e in pages. If t
10930 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
10940 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65   of.** error, re
10950 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20  turn ((unsigned 
10960 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74  int)-1)..*/.stat
10970 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67  ic Pgno btreePag
10980 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20  ecount(BtShared 
10990 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pBt){.  return 
109a0 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33  pBt->nPage;.}.u3
109b0 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  2 sqlite3BtreeLa
109c0 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29  stPage(Btree *p)
109d0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
109e0 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
109f0 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72  ex(p) );.  asser
10a00 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61  t( ((p->pBt->nPa
10a10 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d  ge)&0x8000000)==
10a20 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74  0 );.  return bt
10a30 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e  reePagecount(p->
10a40 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  pBt);.}../*.** G
10a50 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
10a60 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69  he pager and ini
10a70 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a  tialize it..**.*
10a80 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65  * If pCur!=0 the
10a90 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65  n the page is be
10aa0 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70  ing fetched as p
10ab0 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43  art of a moveToC
10ac0 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20  hild().** call. 
10ad0 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73   Do additional s
10ae0 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
10af0 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  n the page in th
10b00 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20  is case..** And 
10b10 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69  if the fetch fai
10b20 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ls, this routine
10b30 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20   must decrement 
10b40 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a  pCur->iPage..**.
10b50 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66  ** The page is f
10b60 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77  etched as read-w
10b70 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72  rite unless pCur
10b80 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64   is not NULL and
10b90 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e   is.** a read-on
10ba0 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  ly cursor..**.**
10bb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
10bc0 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  urs, then *ppPag
10bd0 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20  e is undefined. 
10be0 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e  It.** may remain
10bf0 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69   unchanged, or i
10c00 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  t may be set to 
10c10 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65  an invalid value
10c20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10c30 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
10c40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
10c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c60 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
10c70 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
10c80 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
10c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
10ca0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
10cb0 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65  e to get */.  Me
10cc0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10ce0 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
10cf0 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a  pointer here */.
10d00 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
10d10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10d20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72    /* Cursor to r
10d30 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c  eceive the page,
10d40 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
10d50 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20  t bReadOnly     
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10d70 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64   True for a read
10d80 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b  -only page */.){
10d90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
10da0 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
10db0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10dc0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10dd0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
10de0 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70  rt( pCur==0 || p
10df0 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70  pPage==&pCur->ap
10e00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
10e10 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ] );.  assert( p
10e20 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f  Cur==0 || bReadO
10e30 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61  nly==pCur->curPa
10e40 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73  gerFlags );.  as
10e50 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c  sert( pCur==0 ||
10e60 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
10e70 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74  ;..  if( pgno>bt
10e80 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
10e90 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  ) ){.    rc = SQ
10ea0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
10eb0 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41  T;.    goto getA
10ec0 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72  ndInitPage_error
10ed0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
10ee0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
10ef0 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
10f00 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
10f10 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a  ge, bReadOnly);.
10f20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10f30 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
10f40 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
10f50 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50   *ppPage = (MemP
10f60 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
10f70 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
10f80 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61  e);.  if( (*ppPa
10f90 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
10fa0 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46  {.    btreePageF
10fb0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
10fc0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
10fd0 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69     rc = btreeIni
10fe0 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  tPage(*ppPage);.
10ff0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11010 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
11020 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ge);.      goto 
11030 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11040 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rror;.    }.  }.
11050 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61    assert( (*ppPa
11060 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20  ge)->pgno==pgno 
11070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70  );.  assert( (*p
11080 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73  pPage)->aData==s
11090 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
110a0 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  ta(pDbPage) );..
110b0 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e    /* If obtainin
110c0 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66  g a child page f
110d0 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20  or a cursor, we 
110e0 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74  must verify that
110f0 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a   the page is.  *
11100 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  * compatible wit
11110 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e  h the root page.
11120 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26   */.  if( pCur &
11130 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43  & ((*ppPage)->nC
11140 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67  ell<1 || (*ppPag
11150 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72  e)->intKey!=pCur
11160 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a  ->curIntKey) ){.
11170 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11180 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11190 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
111a0 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f  pPage);.    goto
111b0 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
111c0 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74  error;.  }.  ret
111d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
111e0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
111f0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72  rror:.  if( pCur
11200 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d   ) pCur->iPage--
11210 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67  ;.  testcase( pg
11220 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  no==0 );.  asser
11230 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63  t( pgno!=0 || rc
11240 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
11250 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
11260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
11270 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68  e a MemPage.  Th
11280 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  is should be cal
11290 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
112a0 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20  h prior.** call 
112b0 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e  to btreeGetPage.
112c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
112d0 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75  releasePageNotNu
112e0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
112f0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
11300 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
11310 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
11320 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
11330 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d  pPage->pDbPage!=
11340 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
11350 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
11360 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
11370 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50  ge) == (void*)pP
11380 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
11390 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
113a0 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
113b0 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61  age)==pPage->aDa
113c0 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
113d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
113e0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
113f0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
11400 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e  e3PagerUnrefNotN
11410 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ull(pPage->pDbPa
11420 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ge);.}.static vo
11430 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
11440 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
11450 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72 65    if( pPage ) re
11460 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c  leasePageNotNull
11470 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pPage);.}../*.*
11480 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20  * Get an unused 
11490 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  page..**.** This
114a0 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65   works just like
114b0 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20   btreeGetPage() 
114c0 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
114d0 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66  n:.**.**   *  If
114e0 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72   the page is alr
114f0 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20  eady in use for 
11500 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
11510 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  se, immediately.
11520 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20  **      release 
11530 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  it and return an
11540 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20   SQLITE_CURRUPT 
11550 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d  error..**   *  M
11560 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49  ake sure the isI
11570 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61  nit flag is clea
11580 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  r.*/.static int 
11590 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61  btreeGetUnusedPa
115a0 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
115b0 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  pBt,       /* Th
115c0 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e  e btree */.  Pgn
115d0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
115e0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
115f0 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68  he page to fetch
11600 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
11610 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65  ppPage,    /* Re
11620 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e  turn the page in
11630 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20   this parameter 
11640 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
11650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
11660 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
11670 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45   or PAGER_GET_RE
11680 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69  ADONLY */.){.  i
11690 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74  nt rc = btreeGet
116a0 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
116b0 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  ppPage, flags);.
116c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
116d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73  _OK ){.    if( s
116e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
116f0 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
11700 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b  )->pDbPage)>1 ){
11710 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
11720 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
11730 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
11740 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11750 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70  ;.    }.    (*pp
11770 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20  Page)->isInit = 
11780 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
11790 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  *ppPage = 0;.  }
117a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
117b0 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61  ../*.** During a
117c0 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20   rollback, when 
117d0 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64  the pager reload
117e0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  s information in
117f0 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20  to the cache.** 
11800 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68  so that the cach
11810 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
11820 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74   its original st
11830 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ate at the start
11840 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73   of.** the trans
11850 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68  action, for each
11860 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74   page restored t
11870 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11880 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  alled..**.** Thi
11890 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20  s routine needs 
118a0 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74  to reset the ext
118b0 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20  ra data section 
118c0 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
118d0 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72  e.** page to agr
118e0 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74  ee with the rest
118f0 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ored data..*/.st
11900 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65  atic void pageRe
11910 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61  init(DbPage *pDa
11920 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ta){.  MemPage *
11930 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d  pPage;.  pPage =
11940 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
11950 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
11960 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72  (pData);.  asser
11970 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  t( sqlite3PagerP
11980 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
11990 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50  a)>0 );.  if( pP
119a0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20  age->isInit ){. 
119b0 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
119c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
119d0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
119e0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   );.    pPage->i
119f0 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69  sInit = 0;.    i
11a00 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
11a10 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74  ageRefcount(pDat
11a20 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a  a)>1 ){.      /*
11a30 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74   pPage might not
11a40 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
11a50 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61  ;  it might be a
11a60 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  n overflow page.
11a70 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d        ** or ptrm
11a80 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65  ap page or a fre
11a90 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73  e page.  In thos
11aa0 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c  e cases, the fol
11ab0 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
11ac0 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69  call to btreeIni
11ad0 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b  tPage() will lik
11ae0 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ely return SQLIT
11af0 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20  E_CORRUPT..     
11b00 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20   ** But no harm 
11b10 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e  is done by this.
11b20 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79    And it is very
11b30 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a   important that.
11b40 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e        ** btreeIn
11b50 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c  itPage() be call
11b60 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65  ed on every btre
11b70 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b  e page so we mak
11b80 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63  e.      ** the c
11b90 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61  all for every pa
11ba0 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e  ge that comes in
11bb0 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e   for re-initing.
11bc0 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49   */.      btreeI
11bd0 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
11be0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
11bf0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  ** Invoke the bu
11c00 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61  sy handler for a
11c10 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69   btree..*/.stati
11c20 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b  c int btreeInvok
11c30 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  eBusyHandler(voi
11c40 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68  d *pArg){.  BtSh
11c50 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53  ared *pBt = (BtS
11c60 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61  hared*)pArg;.  a
11c70 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29  ssert( pBt->db )
11c80 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
11c90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11ca0 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  Bt->db->mutex) )
11cb0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
11cc0 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
11cd0 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75  ler(&pBt->db->bu
11ce0 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f  syHandler);.}../
11cf0 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61  *.** Open a data
11d00 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a  base file..** .*
11d10 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  * zFilename is t
11d20 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  he name of the d
11d30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
11d40 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
11d50 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65  ULL.** then an e
11d60 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73  phemeral databas
11d70 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54  e is created.  T
11d80 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  he ephemeral dat
11d90 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62  abase might.** b
11da0 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e  e exclusively in
11db0 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d   memory, or it m
11dc0 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d  ight use a disk-
11dd0 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63  based memory cac
11de0 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61  he..** Either wa
11df0 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c  y, the ephemeral
11e00 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62   database will b
11e10 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
11e20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e  deleted .** when
11e30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
11e40 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
11e50 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
11e60 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
11e70 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f   then an in-memo
11e80 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63  ry database is c
11e90 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69  reated.** that i
11ea0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  s automatically 
11eb0 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69  destroyed when i
11ec0 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
11ed0 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70  ** The "flags" p
11ee0 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69  arameter is a bi
11ef0 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74  tmask that might
11f00 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69   contain bits li
11f10 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54  ke.** BTREE_OMIT
11f20 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20  _JOURNAL and/or 
11f30 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a  BTREE_MEMORY..**
11f40 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62  .** If the datab
11f50 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ase is already o
11f60 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d  pened in the sam
11f70 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
11f80 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20  ction.** and we 
11f90 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61  are in shared ca
11fa0 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74  che mode, then t
11fb0 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69  he open will fai
11fc0 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c  l with an.** SQL
11fd0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65  ITE_CONSTRAINT e
11fe0 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74  rror.  We cannot
11ff0 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f   allow two or mo
12000 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f  re BtShared.** o
12010 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61  bjects in the sa
12020 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
12030 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69  ection since doi
12040 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a  ng so will lead.
12050 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77  ** to problems w
12060 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ith locking..*/.
12070 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12080 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  Open(.  sqlite3_
12090 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
120a0 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f  /* VFS to use fo
120b0 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f  r this b-tree */
120c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
120d0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
120e0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
120f0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
12100 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
12110 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
12120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
12130 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
12140 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72   handle */.  Btr
12150 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20  ee **ppBtree,   
12160 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
12170 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a  to new Btree obj
12180 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65  ect written here
12190 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
121a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
121b0 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   Options */.  in
121c0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
121d0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70        /* Flags p
121e0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
121f0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
12200 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53  en() */.){.  BtS
12210 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
12220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12230 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
12240 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
12250 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
12260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12270 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72    /* Handle to r
12280 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  eturn */.  sqlit
12290 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f  e3_mutex *mutexO
122a0 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65  pen = 0;  /* Pre
122b0 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e  vents a race con
122c0 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23  dition. Ticket #
122d0 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63  3537 */.  int rc
122e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
122f0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
12300 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69  lt code from thi
12310 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
12320 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  u8 nReserve;    
12330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12340 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64  * Byte of unused
12350 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70   space on each p
12360 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
12370 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
12380 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62  [100];  /* Datab
12390 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65  ase header conte
123a0 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65  nt */..  /* True
123b0 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65   if opening an e
123c0 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72  phemeral, tempor
123d0 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ary database */.
123e0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65    const int isTe
123f0 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  mpDb = zFilename
12400 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65  ==0 || zFilename
12410 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65  [0]==0;..  /* Se
12420 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
12430 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
12440 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
12450 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
12460 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
12470 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
12480 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  se..  */.#ifdef 
12490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
124a0 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74  RYDB.  const int
124b0 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65   isMemdb = 0;.#e
124c0 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  lse.  const int 
124d0 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65  isMemdb = (zFile
124e0 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a  name && strcmp(z
124f0 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f  Filename, ":memo
12500 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20  ry:")==0).      
12510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12520 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26   || (isTempDb &&
12530 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65   sqlite3TempInMe
12540 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20  mory(db)).      
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20   || (vfsFlags & 
12570 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
12580 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a  RY)!=0;.#endif..
12590 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
125a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66  );.  assert( pVf
125b0 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
125c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
125d0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
125e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c  );.  assert( (fl
125f0 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73  ags&0xff)==flags
12600 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66   );   /* flags f
12610 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a  it in 8 bits */.
12620 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52  .  /* Only a BTR
12630 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
12640 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f  se can be BTREE_
12650 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61  UNORDERED */.  a
12660 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
12670 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29  BTREE_UNORDERED)
12680 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
12690 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30  BTREE_SINGLE)!=0
126a0 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45   );..  /* A BTRE
126b0 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
126c0 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65  e is always a te
126d0 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65  mporary and/or e
126e0 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73  phemeral */.  as
126f0 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
12700 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20  TREE_SINGLE)==0 
12710 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a  || isTempDb );..
12720 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
12730 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54  .    flags |= BT
12740 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a  REE_MEMORY;.  }.
12750 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
12760 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
12770 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73  IN_DB)!=0 && (is
12780 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44  Memdb || isTempD
12790 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61  b) ){.    vfsFla
127a0 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26  gs = (vfsFlags &
127b0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   ~SQLITE_OPEN_MA
127c0 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f  IN_DB) | SQLITE_
127d0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20  OPEN_TEMP_DB;.  
127e0 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d  }.  p = sqlite3M
127f0 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
12800 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20  (Btree));.  if( 
12810 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
12820 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12830 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20   }.  p->inTrans 
12840 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
12850 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66 6e  p->db = db;.#ifn
12860 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12870 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 70  SHARED_CACHE.  p
12880 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d 20  ->lock.pBtree = 
12890 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61  p;.  p->lock.iTa
128a0 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  ble = 1;.#endif.
128b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
128c0 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
128d0 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
128e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
128f0 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20 2a  DISKIO).  /*.  *
12900 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65 20  * If this Btree 
12910 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20 66  is a candidate f
12920 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65 2c  or shared cache,
12930 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e 0a   try to find an.
12940 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42 74    ** existing Bt
12950 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 68  Shared object th
12960 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65 20  at we can share 
12970 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28 20  with.  */.  if( 
12980 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20 28  isTempDb==0 && (
12990 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28 76  isMemdb==0 || (v
129a0 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  fsFlags&SQLITE_O
129b0 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b 0a  PEN_URI)!=0) ){.
129c0 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67 73      if( vfsFlags
129d0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   & SQLITE_OPEN_S
129e0 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20 20  HAREDCACHE ){.  
129f0 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d      int nFilenam
12a00 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
12a10 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b 31  n30(zFilename)+1
12a20 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75 6c  ;.      int nFul
12a30 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66 73  lPathname = pVfs
12a40 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
12a50 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75 6c        char *zFul
12a60 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
12a70 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e 46  te3Malloc(MAX(nF
12a80 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69 6c  ullPathname,nFil
12a90 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20 4d  ename));.      M
12aa0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
12ab0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
12ac0 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20 20  Shared; )..     
12ad0 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20 31   p->sharable = 1
12ae0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46 75  ;.      if( !zFu
12af0 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20  llPathname ){.  
12b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12b10 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ee(p);.        r
12b20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12b30 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
12b40 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b    if( isMemdb ){
12b50 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
12b60 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a  zFullPathname, z
12b70 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e  Filename, nFilen
12b80 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
12b90 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
12ba0 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
12bb0 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
12bc0 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50            nFullP
12bf0 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61  athname, zFullPa
12c00 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  thname);.       
12c10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
12c20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12c30 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
12c40 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12c50 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
12c60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
12c70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12c80 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54    }.#if SQLITE_T
12c90 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20 20  HREADSAFE.      
12ca0 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69  mutexOpen = sqli
12cb0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12cc0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12cd0 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73  C_OPEN);.      s
12ce0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
12cf0 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  er(mutexOpen);. 
12d00 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64       mutexShared
12d10 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
12d20 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
12d30 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29  X_STATIC_MASTER)
12d40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12d50 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
12d60 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66  xShared);.#endif
12d70 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47  .      for(pBt=G
12d80 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
12d90 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
12da0 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42  heList); pBt; pB
12db0 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20  t=pBt->pNext){. 
12dc0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
12dd0 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Bt->nRef>0 );.  
12de0 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72        if( 0==str
12df0 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  cmp(zFullPathnam
12e00 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  e, sqlite3PagerF
12e10 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61  ilename(pBt->pPa
12e20 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20  ger, 0)).       
12e30 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c            && sql
12e40 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42 74  ite3PagerVfs(pBt
12e50 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20  ->pPager)==pVfs 
12e60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
12e70 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20   iDb;.          
12e80 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d  for(iDb=db->nDb-
12e90 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d  1; iDb>=0; iDb--
12ea0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 42  ){.            B
12eb0 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20  tree *pExisting 
12ec0 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70  = db->aDb[iDb].p
12ed0 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  Bt;.            
12ee0 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26 26  if( pExisting &&
12ef0 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d   pExisting->pBt=
12f00 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20  =pBt ){.        
12f10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12f20 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
12f30 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20  hared);.        
12f40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12f50 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f  tex_leave(mutexO
12f60 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pen);.          
12f70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
12f80 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
12f90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
12fa0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
12fc0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
12fd0 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20  TRAINT;.        
12fe0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
12ff0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
13000 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20  Bt = pBt;.      
13010 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b      pBt->nRef++;
13020 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
13030 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13040 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
13050 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
13060 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
13070 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13080 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
13090 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
130a0 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73  TE_DEBUG.    els
130b0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64  e{.      /* In d
130c0 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61  ebug mode, we ma
130d0 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e  rk all persisten
130e0 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20 73  t databases as s
130f0 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  harable.      **
13100 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20   even when they 
13110 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65  are not.  This e
13120 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63  xercises the loc
13130 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20  king code and.  
13140 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72      ** gives mor
13150 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f  e opportunity fo
13160 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74 65  r asserts(sqlite
13170 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a  3_mutex_held()).
13180 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65        ** stateme
13190 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b  nts to find lock
131a0 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20  ing problems..  
131b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e      */.      p->
131c0 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20  sharable = 1;.  
131d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23    }.#endif.  }.#
131e0 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d  endif.  if( pBt=
131f0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  =0 ){.    /*.   
13200 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** The followin
13210 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73  g asserts make s
13220 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74 75  ure that structu
13230 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  res used by the 
13240 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a  btree are.    **
13250 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e   the right size.
13260 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75 61    This is to gua
13270 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20  rd against size 
13280 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65 73  changes that res
13290 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ult.    ** when 
132a0 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64  compiling on a d
132b0 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74 65  ifferent archite
132c0 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  cture..    */.  
132d0 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
132e0 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20  (i64)==8 );.    
132f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75  assert( sizeof(u
13300 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73  64)==8 );.    as
13310 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
13320 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
13330 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
13340 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
13350 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
13360 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
13370 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
13380 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
13390 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
133a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
133b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
133c0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
133d0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
133e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
133f0 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
13400 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
13410 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
13420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13430 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
13440 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c  flags, vfsFlags,
13450 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
13460 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13470 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
13480 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
13490 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
134a0 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a  r, db->szMmap);.
134b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
134c0 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
134d0 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
134e0 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
134f0 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
13500 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
13510 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13520 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
13530 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
13540 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61      pBt->openFla
13550 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a  gs = (u8)flags;.
13560 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62      pBt->db = db
13570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
13580 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
13590 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74  (pBt->pPager, bt
135a0 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
135b0 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20  dler, pBt);.    
135c0 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
135d0 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  .    pBt->pCurso
135e0 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e  r = 0;.    pBt->
135f0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20  pPage1 = 0;.    
13600 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
13610 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e  Isreadonly(pBt->
13620 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62  pPager) ) pBt->b
13630 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52  tsFlags |= BTS_R
13640 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66  EAD_ONLY;.#ifdef
13650 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44   SQLITE_SECURE_D
13660 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62  ELETE.    pBt->b
13670 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53  tsFlags |= BTS_S
13680 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65  ECURE_DELETE;.#e
13690 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44  ndif.    /* EVID
136a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33  ENCE-OF: R-51873
136b0 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65 20  -39618 The page 
136c0 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62  size for a datab
136d0 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20  ase file is.    
136e0 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
136f0 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65   the 2-byte inte
13700 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61  ger located at a
13710 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62  n offset of 16 b
13720 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ytes from.    **
13730 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
13740 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
13750 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d  ile. */.    pBt-
13760 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62  >pageSize = (zDb
13770 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c  Header[16]<<8) |
13780 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c   (zDbHeader[17]<
13790 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42  <16);.    if( pB
137a0 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20  t->pageSize<512 
137b0 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  || pBt->pageSize
137c0 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
137d0 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c  _SIZE.         |
137e0 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  | ((pBt->pageSiz
137f0 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69  e-1)&pBt->pageSi
13800 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ze)!=0 ){.      
13810 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
13820 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
13830 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13840 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
13850 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
13860 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
13870 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
13880 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
13890 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
138a0 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
138b0 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
138c0 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
138d0 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
138e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
138f0 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
13900 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
13910 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
13920 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
13930 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
13940 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
13950 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
13960 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
13970 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
13980 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
13990 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
139a0 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
139b0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
139c0 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
139d0 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
139e0 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
139f0 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
13a00 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
13a10 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
13a20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
13a30 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
13a40 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
13a50 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
13a60 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
13a70 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
13a80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13a90 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
13aa0 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32  F: R-37497-42412
13ab0 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
13ac0 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e   reserved region
13ad0 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74   is.      ** det
13ae0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f  ermined by the o
13af0 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64  ne-byte unsigned
13b00 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61   integer found a
13b10 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32  t an offset of 2
13b20 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20  0.      ** into 
13b30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13b40 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
13b50 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
13b60 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
13b70 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
13b80 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45   |= BTS_PAGESIZE
13b90 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20  _FIXED;.#ifndef 
13ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13bb0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74  VACUUM.      pBt
13bc0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28  ->autoVacuum = (
13bd0 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61  get4byte(&zDbHea
13be0 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31  der[36 + 4*4])?1
13bf0 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  :0);.      pBt->
13c00 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65  incrVacuum = (ge
13c10 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
13c20 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30  r[36 + 7*4])?1:0
13c30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
13c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13c50 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
13c60 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
13c70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
13c80 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28  eserve);.    if(
13c90 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65   rc ) goto btree
13ca0 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70  _open_out;.    p
13cb0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
13cc0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
13cd0 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
13ce0 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
13cf0 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
13d00 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
13d10 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
13d20 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65  e */.   .#if !de
13d30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
13d40 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20  T_SHARED_CACHE) 
13d50 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
13d60 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
13d70 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
13d80 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ew BtShared obje
13d90 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64  ct to the linked
13da0 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20 42   list sharable B
13db0 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f  tShareds..    */
13dc0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72  .    if( p->shar
13dd0 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d 55  able ){.      MU
13de0 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74  TEX_LOGIC( sqlit
13df0 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
13e00 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20 70  hared; ).      p
13e10 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Bt->nRef = 1;.  
13e20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28      MUTEX_LOGIC(
13e30 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20 73   mutexShared = s
13e40 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
13e50 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
13e60 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a 20  ATIC_MASTER);). 
13e70 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
13e80 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
13e90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13ea0 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a  g.bCoreMutex ){.
13eb0 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75 74          pBt->mut
13ec0 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
13ed0 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
13ee0 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
13ef0 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74 65     if( pBt->mute
13f00 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
13f10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
13f20 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
13f30 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13f40 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
13f50 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13f60 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13f70 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
13f80 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
13f90 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
13fa0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13fb0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
13fc0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
13fd0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13fe0 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
13ff0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14000 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14010 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14020 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14030 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14040 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14050 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14060 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14070 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
14080 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
14090 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
140a0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
140b0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
140c0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
140d0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
140e0 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
140f0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14100 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14110 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14120 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14130 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14140 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14150 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14160 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14170 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
14180 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
14190 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
141a0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
141b0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
141c0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
141d0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
141e0 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
141f0 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14200 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
14210 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14220 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
14230 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
14240 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
14250 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
14260 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
14270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
14280 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
14290 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
142a0 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
142b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
142c0 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
142d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
142e0 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
142f0 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
14300 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14310 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
14320 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
14330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14340 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
14350 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
14360 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
14370 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
14380 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
14390 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
143a0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
143b0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
143c0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
143d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
143e0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
143f0 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
14400 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14410 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
14420 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
14430 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14440 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
14450 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
14460 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
14470 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
14480 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
14490 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
144a0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
144b0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
144c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
144d0 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
144e0 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
144f0 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
14500 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
14510 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
14520 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
14530 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
14540 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
14550 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
14560 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
14570 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
14580 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
14590 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
145a0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
145b0 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
145c0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
145d0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
145e0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
145f0 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
14600 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
14610 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14620 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
14630 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14640 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
14650 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
14660 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
14670 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
14680 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
14690 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
146a0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
146b0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
146c0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
146d0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
146e0 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
146f0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
14700 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
14710 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
14720 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
14730 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
14740 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14760 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14770 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
14780 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
14790 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
147a0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
147b0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
147c0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
147d0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
147e0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
147f0 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
14800 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
14810 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14820 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14830 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
14840 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14850 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
14860 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
14870 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
14880 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
14890 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
148a0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
148b0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
148c0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
148d0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
148e0 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
148f0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
14900 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
14910 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14920 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14930 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
14940 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
14950 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
14960 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
14970 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
14980 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
14990 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
149a0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
149b0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
149c0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
149d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
149e0 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
149f0 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
14a00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
14a10 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
14a20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
14a30 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
14a40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14a50 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
14a60 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
14a70 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
14a80 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
14a90 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
14aa0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
14ab0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
14ac0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
14ad0 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
14ae0 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
14af0 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
14b00 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
14b10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
14b20 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
14b30 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14b40 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
14b50 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
14b60 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
14b70 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
14b80 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
14b90 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
14ba0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
14bb0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
14bc0 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
14bd0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
14be0 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
14bf0 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
14c00 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
14c10 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
14c20 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
14c30 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
14c40 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
14c50 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
14c60 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
14c70 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
14c80 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
14c90 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
14ca0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
14cb0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
14cc0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
14cd0 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
14ce0 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
14cf0 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
14d00 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
14d10 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
14d20 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
14d30 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
14d40 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
14d50 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
14d60 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
14d70 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
14d80 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
14d90 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
14da0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
14db0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
14dc0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
14dd0 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
14de0 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
14df0 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
14e00 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
14e10 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14e20 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
14e30 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
14e40 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
14e50 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
14e60 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
14e70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
14e80 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
14e90 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
14ea0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
14eb0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
14ec0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
14ed0 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
14ee0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
14ef0 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
14f00 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
14f10 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
14f20 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
14f30 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
14f40 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14f50 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
14f60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
14f70 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
14f80 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
14f90 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
14fa0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
14fb0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
14fc0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14fd0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14fe0 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
14ff0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
15000 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
15010 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15020 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
15030 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
15040 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
15050 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
15060 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
15070 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
15080 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
15090 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
150a0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
150b0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
150c0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
150d0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
150e0 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
150f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15100 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15110 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15120 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15130 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
15140 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
15150 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
15160 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
15170 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
15180 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
15190 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
151a0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
151b0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
151c0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
151d0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
151e0 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
151f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
15200 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
15210 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
15220 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
15230 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15240 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
15250 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
15260 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
15270 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
15280 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
15290 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
152a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
152b0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
152c0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
152d0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
152e0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
152f0 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
15300 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
15310 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
15320 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
15330 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
15340 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
15350 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
15360 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15370 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
15380 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
15390 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
153a0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
153b0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
153c0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
153d0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
153e0 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
153f0 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
15400 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
15410 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
15420 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
15430 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
15440 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
15450 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
15460 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
15470 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
15480 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
15490 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
154a0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
154b0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
154c0 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
154d0 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
154e0 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
154f0 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
15500 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
15510 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15520 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
15530 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
15540 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
15550 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
15560 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
15570 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
15580 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
15590 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
155a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
155b0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
155c0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
155d0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
155e0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
155f0 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
15600 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
15610 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
15620 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
15630 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15640 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15650 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
15660 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
15670 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
15680 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
15690 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
156a0 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
156b0 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
156c0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
156d0 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
156e0 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
156f0 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
15700 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
15710 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
15720 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
15730 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
15740 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
15750 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
15760 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
15770 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
15780 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
15790 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
157a0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
157b0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
157c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
157d0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
157e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
157f0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
15800 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
15810 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
15820 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15830 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
15840 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15850 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15860 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15870 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15880 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
15890 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
158a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
158b0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
158c0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
158d0 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
158e0 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
158f0 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
15900 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
15910 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
15920 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
15930 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
15940 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
15950 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
15960 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
15970 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
15980 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
15990 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
159a0 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
159b0 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
159c0 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
159d0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
159e0 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
159f0 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
15a00 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
15a10 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
15a20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
15a30 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
15a40 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
15a50 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
15a60 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
15a70 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15a80 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
15a90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15aa0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15ab0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15ac0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15ad0 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
15ae0 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
15af0 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
15b00 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15b10 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15b20 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
15b30 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
15b40 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15b50 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15b60 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
15b70 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15b80 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15b90 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15ba0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15bb0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15bc0 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15bd0 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15be0 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15bf0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15c00 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15c10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15c20 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15c30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15c40 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15c50 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
15c60 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
15c70 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15c80 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15c90 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15ca0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15cb0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15cc0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15cd0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15ce0 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15cf0 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15d00 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15d10 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15d20 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15d30 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15d40 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15d50 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15d60 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15d70 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15d80 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15d90 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15da0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15db0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15dc0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15dd0 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15de0 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15df0 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15e00 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15e10 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15e20 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15e30 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15e40 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15e50 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15e60 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15e70 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15e80 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15e90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ea0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15eb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15ec0 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15ed0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15ee0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15ef0 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15f00 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15f10 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15f20 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15f30 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15f40 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15f50 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15f60 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15f70 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15f80 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15f90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15fa0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15fb0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
15fc0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
15fd0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
15fe0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16000 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16010 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
16020 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
16030 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
16040 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
16050 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
16060 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
16070 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
16080 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
16090 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
160a0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
160b0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
160c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
160d0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
160e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
160f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16100 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
16110 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
16120 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
16130 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
16140 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
16150 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
16160 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
16170 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16180 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
16190 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
161a0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
161b0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
161c0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
161d0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
161e0 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
161f0 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
16200 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16210 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
16220 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
16230 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
16240 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
16250 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
16260 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
16270 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
16280 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
16290 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
162a0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
162b0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
162c0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
162d0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
162e0 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
162f0 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
16300 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
16310 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
16320 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
16330 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
16340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16350 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
16360 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
16370 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
16380 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
16390 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
163a0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
163b0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
163c0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
163d0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
163e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
163f0 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
16400 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16410 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
16420 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
16430 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
16440 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
16450 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
16460 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
16470 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
16480 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
16490 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
164a0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
164b0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
164c0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
164d0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
164e0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
164f0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
16500 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
16510 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
16520 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
16530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
16540 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16550 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16560 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
16570 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
16580 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
16590 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
165a0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
165b0 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
165c0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
165d0 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
165e0 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
165f0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16600 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
16610 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
16620 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
16630 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16640 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
16650 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
16660 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
16670 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
16680 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
16690 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
166a0 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
166b0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
166c0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
166d0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
166e0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
166f0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
16700 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
16710 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
16720 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
16730 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
16740 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
16750 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16760 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16770 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
16780 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
16790 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
167a0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
167b0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
167c0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
167d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
167e0 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
167f0 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
16800 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
16810 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
16820 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
16830 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
16840 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
16850 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
16860 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16870 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
16880 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
16890 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
168a0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
168b0 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
168c0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
168d0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
168e0 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
168f0 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
16900 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16910 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
16920 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
16930 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
16940 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
16950 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
16960 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16970 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
16980 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
16990 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
169a0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
169b0 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
169c0 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
169d0 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
169e0 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
169f0 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
16a00 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
16a10 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
16a20 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
16a30 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
16a40 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
16a50 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
16a60 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
16a70 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
16a80 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
16a90 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
16aa0 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
16ab0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
16ac0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
16ad0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
16ae0 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
16af0 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
16b00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16b10 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
16b20 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16b30 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
16b40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16b50 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
16b60 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
16b70 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
16b80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
16b90 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16ba0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16bb0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16bc0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
16bd0 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
16be0 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
16bf0 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
16c00 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
16c10 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
16c20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
16c30 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
16c40 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
16c50 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
16c60 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
16c70 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
16c80 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
16c90 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
16ca0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
16cb0 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
16cc0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
16cd0 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
16ce0 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
16cf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
16d00 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
16d10 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16d20 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16d30 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
16d40 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16d50 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
16d60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16d70 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
16d80 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
16d90 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
16da0 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16db0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16dc0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16dd0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
16de0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
16df0 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16e00 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
16e10 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
16e20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
16e30 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
16e40 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
16e50 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
16e60 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
16e70 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
16e80 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
16e90 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16ea0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
16eb0 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
16ec0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
16ed0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
16ee0 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16ef0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16f00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
16f10 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
16f20 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16f30 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16f40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16f50 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16f60 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
16f70 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
16f80 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
16f90 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
16fa0 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
16fb0 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
16fc0 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
16fd0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
16fe0 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
16ff0 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
17000 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
17010 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17020 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
17030 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17040 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
17050 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
17060 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
17070 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
17080 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
17090 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
170a0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
170b0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
170c0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
170d0 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
170e0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
170f0 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
17100 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
17110 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
17120 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
17130 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17140 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17150 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
17160 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
17170 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
17180 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
17190 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
171a0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
171b0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
171c0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
171d0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
171e0 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
171f0 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
17200 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
17210 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
17220 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
17230 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
17240 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
17250 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
17260 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
17270 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
17280 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
17290 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
172a0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
172b0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
172c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
172d0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
172e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
172f0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
17300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17310 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
17320 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
17330 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17340 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
17350 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
17360 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
17370 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
17380 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
17390 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
173a0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
173b0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
173c0 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
173d0 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
173e0 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
173f0 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
17400 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17410 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
17420 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
17430 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
17440 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
17450 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
17460 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
17470 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
17480 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
17490 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
174a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
174b0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
174c0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
174d0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
174e0 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
174f0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
17500 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
17510 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
17520 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
17530 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
17540 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
17550 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
17560 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
17570 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
17580 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17590 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
175a0 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
175b0 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
175c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
175d0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
175e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
175f0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
17600 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
17610 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
17620 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
17630 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
17640 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
17650 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
17660 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
17670 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
17680 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
17690 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
176a0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
176b0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
176c0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
176d0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
176e0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
176f0 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
17700 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
17710 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
17720 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
17730 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
17740 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
17750 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
17760 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
17770 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
17780 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
17790 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
177a0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
177b0 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
177c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
177d0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
177e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
177f0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17800 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
17810 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
17820 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
17830 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17840 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17850 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
17860 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
17870 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
17880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
17890 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
178a0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
178b0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
178c0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
178d0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
178e0 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
178f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
17900 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
17910 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
17920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17930 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
17940 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
17950 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
17960 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17970 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
17980 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
17990 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
179a0 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
179b0 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
179c0 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
179d0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
179e0 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
179f0 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
17a00 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
17a10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
17a20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17a30 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
17a40 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
17a50 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
17a60 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
17a70 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
17a80 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
17a90 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
17aa0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
17ab0 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
17ac0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
17ad0 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
17ae0 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
17af0 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
17b00 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
17b10 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17b20 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
17b30 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17b40 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
17b50 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
17b60 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
17b70 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
17b80 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
17b90 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
17ba0 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
17bb0 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
17bc0 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
17bd0 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
17be0 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
17bf0 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
17c00 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
17c10 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17c20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
17c30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
17c40 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
17c50 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
17c60 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
17c70 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17c80 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17c90 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
17ca0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17cb0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17cc0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
17cd0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
17ce0 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
17cf0 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
17d00 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
17d10 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
17d20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17d30 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17d40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17d50 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
17d60 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
17d70 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
17d80 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
17d90 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
17da0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
17db0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
17dc0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
17dd0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
17de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17df0 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
17e00 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
17e10 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
17e20 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
17e30 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
17e40 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
17e50 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
17e60 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
17e70 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
17e80 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
17e90 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
17ea0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
17eb0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
17ec0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
17ed0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
17ee0 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
17ef0 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
17f00 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17f10 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
17f20 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
17f30 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
17f40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
17f50 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
17f60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17f70 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
17f80 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
17f90 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
17fa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17fb0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
17fc0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17fd0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
17fe0 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  sOpen==0 ){.    
17ff0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18000 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
18010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18020 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
18030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18040 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ADB;.    }.#endi
18050 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
18060 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
18070 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
18080 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
18090 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
180a0 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
180b0 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
180c0 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
180d0 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
180e0 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
180f0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
18100 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
18110 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
18120 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
18130 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
18140 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
18150 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
18160 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
18170 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
18180 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
18190 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
181a0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
181b0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
181c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
181d0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
181e0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
181f0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
18200 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
18210 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
18220 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
18230 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
18240 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
18250 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
18260 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
18270 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
18280 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
18290 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
182a0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
182b0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
182c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
182d0 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
182e0 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
182f0 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
18300 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
18310 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
18320 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
18330 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
18340 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
18350 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
18360 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
18370 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
18380 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
18390 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
183a0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
183b0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
183c0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
183d0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
183e0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
183f0 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
18400 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
18410 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
18420 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
18430 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
18440 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18450 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
18460 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
18470 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
18480 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
18490 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
184a0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
184b0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
184c0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
184d0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
184e0 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
184f0 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
18500 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
18510 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
18520 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
18530 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
18540 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18550 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
18560 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
18570 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
18580 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
18590 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
185a0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
185b0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
185c0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
185d0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
185e0 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
185f0 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
18600 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
18610 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
18620 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
18630 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
18640 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
18650 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
18660 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
18670 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
18680 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
18690 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
186a0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
186b0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
186c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
186d0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
186e0 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
186f0 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
18700 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18710 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
18720 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18730 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
18740 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
18750 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
18760 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
18770 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
18780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
18790 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
187a0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
187b0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
187e0 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
187f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18800 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
18810 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
18820 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
18830 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
18840 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
18850 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18860 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18870 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
18880 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
18890 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
188a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
188b0 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
188c0 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
188d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
188e0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
188f0 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
18900 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
18910 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
18920 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
18930 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
18940 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
18950 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
18960 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
18970 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
18980 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18990 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
189a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
189b0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
189c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
189d0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
189e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
189f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
18a00 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
18a10 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
18a20 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
18a30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
18a40 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
18a50 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
18a60 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
18a70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
18a80 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
18a90 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
18aa0 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
18ab0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
18ac0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
18ad0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
18ae0 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
18af0 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
18b00 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
18b10 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
18b20 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
18b30 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
18b40 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
18b50 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
18b60 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
18b70 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
18b80 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
18b90 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
18ba0 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
18bb0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
18bc0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
18bd0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
18be0 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
18bf0 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
18c00 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
18c10 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
18c20 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
18c30 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
18c40 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
18c50 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
18c60 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
18c70 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
18c80 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
18c90 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
18ca0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
18cb0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
18cc0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
18cd0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
18ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
18cf0 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
18d00 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
18d10 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
18d20 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
18d30 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
18d40 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
18d50 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18d60 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
18d70 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
18d80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18d90 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
18da0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
18db0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
18dc0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
18dd0 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
18de0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
18df0 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
18e00 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
18e10 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
18e20 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
18e30 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
18e40 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
18e50 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
18e60 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
18e70 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
18e80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
18e90 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18ea0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
18eb0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
18ec0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
18ed0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18ee0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
18ef0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18f00 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
18f10 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
18f20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
18f30 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
18f40 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
18f50 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
18f60 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
18f70 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
18f80 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
18f90 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
18fa0 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
18fb0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
18fc0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
18fd0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
18fe0 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
18ff0 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
19000 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
19010 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
19020 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
19030 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
19040 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
19050 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19060 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
19070 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
19080 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
19090 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
190a0 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
190b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
190c0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
190d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
190e0 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
190f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
19100 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
19110 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
19120 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
19130 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
19140 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
19150 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
19160 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
19170 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
19180 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
19190 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
191a0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
191b0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
191c0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
191d0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
191e0 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
191f0 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
19200 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
19210 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
19220 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
19230 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19240 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
19250 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
19260 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19270 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
19280 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
19290 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
192a0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
192b0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
192c0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
192d0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
192e0 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
192f0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
19310 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
19320 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
19330 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
19340 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
19360 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
19370 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
19380 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
19390 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
193a0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
193b0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
193c0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
193d0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
193e0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
193f0 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
19400 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
19410 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
19420 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
19430 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
19440 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
19450 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
19460 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
19470 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
19480 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  l(pPage1);.  }.}
19490 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
194a0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
194b0 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
194c0 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
194d0 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
194e0 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
194f0 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
19500 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19510 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
19520 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
19530 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
19540 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19550 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
19560 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
19570 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
19580 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
19590 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
195a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
195b0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
195c0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
195d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
195e0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
195f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
19600 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
19610 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
19620 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19630 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
19640 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19650 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
19660 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
19670 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
19680 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
19690 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
196a0 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
196b0 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
196c0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
196d0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
196e0 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
196f0 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
19700 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
19710 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
19720 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
19730 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
19740 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
19750 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
19760 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
19770 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
19780 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
19790 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
197a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
197b0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
197c0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
197d0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
197e0 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
197f0 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
19800 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
19810 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
19820 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
19830 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
19840 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
19850 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
19860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19870 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
19880 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
19890 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
198a0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
198b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
198c0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
198d0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
198e0 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
198f0 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
19900 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
19910 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
19920 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
19930 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
19940 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
19950 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
19960 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
19970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
19990 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
199a0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
199b0 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
199c0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
199d0 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
199e0 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
199f0 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
19a00 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
19a10 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
19a20 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
19a30 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19a40 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
19a50 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
19a60 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
19a70 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
19a80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19a90 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
19aa0 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
19ab0 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
19ac0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19ad0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19ae0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19af0 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
19b00 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
19b10 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
19b20 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
19b30 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
19b40 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
19b50 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
19b60 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
19b70 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
19b80 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19b90 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
19ba0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
19bb0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19bc0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
19bd0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
19be0 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
19bf0 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
19c00 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
19c10 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
19c20 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
19c30 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
19c40 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
19c50 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
19c60 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
19c70 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
19c80 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
19c90 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
19ca0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
19cb0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
19cc0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
19cd0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
19ce0 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
19cf0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
19d00 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
19d10 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
19d20 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
19d30 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
19d40 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19d50 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
19d60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
19d70 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
19d80 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
19d90 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
19da0 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
19db0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
19dc0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
19dd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
19de0 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
19df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
19e00 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
19e10 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
19e20 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19e30 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
19e40 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
19e50 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
19e60 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
19e70 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
19e80 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
19e90 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
19ea0 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
19eb0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
19ec0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
19ed0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
19ee0 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
19ef0 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
19f00 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
19f10 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
19f20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
19f30 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
19f40 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
19f50 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
19f60 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
19f70 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
19f80 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
19f90 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
19fa0 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
19fb0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
19fc0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
19fd0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
19fe0 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
19ff0 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
1a000 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
1a010 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
1a020 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
1a030 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
1a040 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
1a050 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
1a060 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
1a070 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
1a080 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
1a090 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
1a0a0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
1a0b0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
1a0c0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
1a0d0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1a0e0 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1a0f0 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1a100 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1a110 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1a120 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1a130 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1a140 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1a150 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1a160 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1a170 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1a180 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a190 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1a1a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1a1b0 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
1a1c0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a1d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a1e0 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
1a1f0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a200 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a210 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1a220 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
1a230 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
1a240 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
1a250 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
1a260 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
1a270 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
1a280 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1a290 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1a2a0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1a2b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1a2c0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a2d0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
1a2e0 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
1a2f0 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
1a300 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a310 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1a320 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a330 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a340 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
1a350 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1a360 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
1a370 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
1a380 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
1a390 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
1a3a0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a3b0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1a3c0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1a3d0 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
1a3e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a3f0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1a400 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a410 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
1a420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1a430 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20  ED_CACHE.  {.   
1a440 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
1a450 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20   = 0;.    /* If 
1a460 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
1a470 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
1a480 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
1a490 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
1a4a0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73      ** on this s
1a4b0 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
1a4c0 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
1a4d0 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
1a4e0 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72  tion is.    ** r
1a4f0 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1a500 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1a510 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1a520 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
1a530 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a540 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20  ANS_WRITE).     
1a550 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
1a560 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
1a570 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1a580 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
1a590 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20  Writer->db;.    
1a5a0 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
1a5b0 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f  >1 ){.      BtLo
1a5c0 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20  ck *pIter;.     
1a5d0 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1a5e0 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1a5f0 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1a600 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1a610 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
1a620 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c  ){.          pBl
1a630 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
1a640 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
1a650 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a660 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a670 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b  }.    if( pBlock
1a680 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a690 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1a6a0 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1a6b0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1a6c0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
1a6d0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67  EDCACHE;.      g
1a6e0 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1a6f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a700 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
1a710 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
1a720 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1a730 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
1a740 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
1a750 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
1a760 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
1a770 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
1a780 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
1a790 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
1a7a0 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
1a7b0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
1a7c0 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
1a7d0 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
1a7e0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
1a7f0 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
1a800 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
1a810 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
1a820 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
1a830 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1a840 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
1a850 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
1a860 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
1a870 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1a880 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1a890 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
1a8a0 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
1a8b0 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
1a8c0 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
1a8d0 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
1a8e0 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
1a8f0 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1a900 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1a910 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
1a920 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
1a930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
1a940 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
1a950 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
1a960 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
1a970 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
1a980 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
1a990 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1a9a0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
1a9b0 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
1a9c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
1a9d0 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
1a9e0 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
1a9f0 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
1aa00 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
1aa10 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1aa20 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
1aa30 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
1aa40 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
1aa50 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
1aa60 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
1aa70 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
1aa80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1aa90 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1aaa0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1aab0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1aac0 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
1aad0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1aae0 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
1aaf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1ab00 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ab10 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
1ab20 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
1ab30 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1ab40 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
1ab50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1ab70 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1ab80 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
1ab90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1aba0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1abb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1abc0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1abd0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
1abe0 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
1abf0 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
1ac00 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1ac10 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1ac20 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
1ac30 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
1ac40 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
1ac50 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ac60 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1ac70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ac80 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
1ac90 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1aca0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
1acb0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1acc0 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
1acd0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1ace0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1acf0 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
1ad00 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
1ad10 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1ad20 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
1ad30 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
1ad40 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
1ad50 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1ad60 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
1ad70 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
1ad80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1ad90 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
1ada0 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
1adb0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
1adc0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
1add0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
1ade0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1adf0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1ae00 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
1ae10 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
1ae20 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
1ae30 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1ae40 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1ae50 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1ae60 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1ae70 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
1ae80 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
1ae90 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
1aea0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
1aeb0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1aec0 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
1aed0 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
1aee0 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
1aef0 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
1af00 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
1af10 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
1af20 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
1af30 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
1af40 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
1af50 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
1af60 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
1af70 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
1af80 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
1af90 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
1afa0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
1afb0 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
1afc0 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
1afd0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1afe0 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
1aff0 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
1b000 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b010 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
1b020 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
1b030 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
1b040 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
1b050 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
1b060 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1b070 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1b080 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
1b090 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1b0a0 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
1b0b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b0c0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1b0d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1b0e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b0f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b100 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1b110 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1b120 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1b130 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b140 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
1b150 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
1b160 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1b170 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
1b180 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
1b190 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
1b1a0 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
1b1b0 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
1b1c0 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
1b1d0 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
1b1e0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1b1f0 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
1b200 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
1b210 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
1b220 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
1b230 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
1b240 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
1b250 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1b260 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1b270 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1b280 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
1b290 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
1b2a0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1b2b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b2c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b2d0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1b2e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b2f0 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
1b300 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
1b310 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1b320 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1b330 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
1b340 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
1b350 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
1b360 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1b370 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
1b380 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
1b390 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
1b3a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1b3b0 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
1b3c0 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
1b3d0 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
1b3e0 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b410 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
1b420 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b450 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
1b460 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
1b470 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b490 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1b4a0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1b4b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1b4c0 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
1b4d0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
1b4e0 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
1b4f0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
1b500 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b510 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1b520 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1b530 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
1b540 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1b550 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b560 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
1b570 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
1b580 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
1b590 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1b5a0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1b5b0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1b5c0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1b5d0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1b5e0 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
1b5f0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
1b600 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
1b610 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1b620 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
1b630 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1b640 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
1b650 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1b660 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1b670 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1b680 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1b690 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1b6a0 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1b6b0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1b6c0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1b6d0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1b6e0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
1b6f0 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1b700 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1b710 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1b720 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
1b730 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
1b740 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
1b750 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
1b760 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b770 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
1b780 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
1b790 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
1b7a0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
1b7b0 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
1b7c0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
1b7d0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
1b7e0 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
1b7f0 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
1b800 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
1b810 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
1b820 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
1b830 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
1b840 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1b850 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1b860 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
1b890 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1b8a0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
1b8b0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1b8c0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1b8d0 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
1b8e0 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1b8f0 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
1b900 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
1b910 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
1b920 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1b930 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
1b940 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1b950 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
1b960 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
1b970 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
1b990 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1b9a0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1b9b0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
1b9c0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
1b9d0 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
1b9e0 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
1b9f0 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
1ba00 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ba10 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1ba20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ba30 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1ba40 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1ba50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
1ba60 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1ba70 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
1ba80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
1ba90 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
1baa0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1bab0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
1bac0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
1bad0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1bae0 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
1baf0 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
1bb00 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1bb10 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1bb20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1bb30 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
1bb40 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
1bb50 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
1bb60 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
1bb70 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1bb80 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  nCell;.    int r
1bb90 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72  c;..    rc = btr
1bba0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1bbb0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1bbc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
1bbd0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1bbe0 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
1bbf0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1bc00 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
1bc10 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1bc20 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
1bc30 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1bc40 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
1bc50 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1bc60 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  fo;.        pPag
1bc70 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
1bc80 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1bc90 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1bca0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
1bcb0 2e 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20  .nPayload.      
1bcc0 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f     && pCell+info
1bcd0 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67 65 2d  .nSize-1<=pPage-
1bce0 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
1bcf0 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
1bd00 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
1bd10 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1bd20 69 7a 65 2d 34 29 0a 20 20 20 20 20 20 20 20 29  ize-4).        )
1bd30 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1bd40 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1bd50 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20  nSize-4, iTo);. 
1bd60 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bd70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bd80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1bd90 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
1bda0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
1bdb0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1bdc0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
1bdd0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1bde0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1bdf0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1be00 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
1be10 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
1be20 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
1be30 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
1be40 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1be50 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1be60 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
1be70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1be80 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1be90 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
1bea0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1beb0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1bec0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
1bed0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
1bee0 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
1bef0 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
1bf00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bf10 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1bf20 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1bf30 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
1bf40 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
1bf50 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
1bf60 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
1bf70 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
1bf80 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
1bf90 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
1bfa0 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
1bfb0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1bfc0 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
1bfd0 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
1bfe0 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
1bff0 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
1c000 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1c010 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
1c020 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
1c030 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1c040 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1c050 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1c060 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1c070 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1c080 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1c090 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c0a0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1c0b0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1c0c0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1c0d0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1c0e0 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1c0f0 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1c100 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1c110 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1c120 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1c130 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1c140 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1c150 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1c160 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1c170 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1c180 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1c190 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1c1a0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1c1b0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1c1c0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1c1d0 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1c1e0 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1c1f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1c200 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1c210 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1c220 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1c230 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1c240 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1c250 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1c260 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1c270 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1c280 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1c290 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1c2a0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1c2b0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1c2c0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1c2d0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1c2e0 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1c2f0 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1c300 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1c310 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1c320 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c330 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1c350 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1c360 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1c370 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1c380 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1c390 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1c3a0 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1c3b0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1c3c0 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1c3d0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1c3e0 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1c3f0 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1c400 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1c410 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1c420 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1c430 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1c440 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1c450 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1c460 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1c470 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1c480 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c490 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1c4a0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1c4b0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1c4c0 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1c4d0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1c4e0 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1c4f0 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1c500 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1c510 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1c520 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1c530 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1c540 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1c550 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1c560 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1c570 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1c580 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1c590 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1c5a0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1c5b0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1c5c0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1c5d0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1c5e0 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1c5f0 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1c600 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1c610 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1c620 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1c630 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1c640 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1c650 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1c660 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1c670 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1c680 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1c690 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1c6a0 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1c6b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c6c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c6d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1c6e0 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1c6f0 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1c700 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1c710 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1c720 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1c730 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1c740 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1c750 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1c760 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1c770 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c790 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c7a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1c7b0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1c7c0 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1c7d0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1c7e0 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1c7f0 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1c800 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1c810 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1c820 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1c830 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1c840 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1c850 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1c860 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1c870 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1c880 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1c890 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1c8a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1c8b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c8c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c8d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1c8e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c8f0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1c900 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1c910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c920 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1c930 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1c940 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c950 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1c960 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1c970 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1c980 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1c990 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1c9a0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1c9b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c9c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1c9d0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1c9e0 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1c9f0 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1ca00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ca10 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1ca20 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1ca30 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1ca40 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1ca50 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1ca60 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1ca70 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1ca80 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1ca90 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1caa0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1cab0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1cac0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1cad0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1cae0 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1caf0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1cb00 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1cb10 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1cb20 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1cb30 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1cb40 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1cb50 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1cb60 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1cb70 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1cb80 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1cb90 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1cba0 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1cbb0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1cbc0 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1cbd0 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1cbe0 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1cbf0 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1cc00 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1cc10 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1cc20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1cc30 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1cc40 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1cc50 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1cc60 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1cc70 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1cc80 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1cc90 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1cca0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1ccb0 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1ccc0 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1ccd0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1cce0 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1ccf0 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1cd00 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1cd10 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1cd20 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1cd30 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1cd40 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1cd50 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1cd60 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1cd70 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1cd80 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1cd90 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1cda0 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1cdb0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1cdc0 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1cdd0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1cde0 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1cdf0 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1ce00 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1ce10 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1ce20 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1ce30 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ce40 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1ce50 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1ce60 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1ce70 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ce80 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ce90 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1cea0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1ceb0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1cec0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1ced0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1cee0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1cef0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1cf00 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1cf10 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1cf20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1cf30 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1cf40 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1cf50 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1cf60 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1cf70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1cf80 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1cf90 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1cfa0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1cfb0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1cfc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cfd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1cfe0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1cff0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1d000 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1d010 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d020 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1d030 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1d040 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d050 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1d060 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1d070 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1d080 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1d090 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1d0a0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1d0b0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1d0c0 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1d0d0 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1d0e0 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1d0f0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1d100 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1d110 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1d120 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1d130 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1d140 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1d150 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1d160 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1d170 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1d180 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1d190 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1d1a0 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1d1b0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1d1c0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1d1d0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1d1e0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1d1f0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1d200 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1d210 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1d220 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d230 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d240 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d250 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1d260 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1d270 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1d280 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1d290 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1d2a0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1d2b0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1d2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d2d0 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1d2e0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1d2f0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1d300 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1d310 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1d320 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1d330 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1d340 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1d350 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1d360 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1d370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1d380 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1d390 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1d3a0 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1d3b0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1d3c0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1d3d0 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1d3e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d3f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d400 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d410 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1d420 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1d430 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1d440 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1d450 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1d460 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1d470 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1d480 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1d490 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1d4a0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1d4b0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1d4c0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1d4d0 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1d4e0 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1d4f0 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1d500 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1d510 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1d520 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1d530 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1d540 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1d550 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1d560 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d570 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1d580 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1d590 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1d5a0 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1d5b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1d5c0 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1d5d0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1d5e0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1d5f0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1d600 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1d610 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1d620 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1d630 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d640 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1d650 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1d660 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d670 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1d680 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1d690 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1d6a0 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1d6b0 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1d6c0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1d6d0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1d6e0 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1d6f0 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1d700 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1d710 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1d720 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1d730 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1d740 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1d750 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d760 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d770 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d780 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1d790 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1d7a0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1d7b0 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1d7c0 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1d7d0 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1d7e0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d7f0 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1d800 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1d810 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1d820 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1d830 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1d840 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1d850 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d860 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1d870 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1d880 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d890 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1d8a0 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1d8b0 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1d8c0 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1d8d0 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1d8e0 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1d8f0 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1d900 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1d910 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1d920 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1d930 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1d940 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1d950 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1d960 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1d970 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1d980 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1d990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d9a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1d9b0 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1d9c0 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1d9d0 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d9f0 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1da00 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1da10 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1da20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da30 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1da40 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1da50 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1da60 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1da70 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1da80 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1da90 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1daa0 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1dab0 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1dac0 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1dad0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1dae0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1daf0 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1db00 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1db10 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1db20 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1db30 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1db40 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1db50 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1db60 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1db70 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1db80 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1db90 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1dba0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1dbb0 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1dbc0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1dbd0 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1dbe0 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1dbf0 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1dc00 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1dc10 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1dc20 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1dc30 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1dc40 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1dc50 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1dc60 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1dc70 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1dc80 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1dc90 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1dca0 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1dcb0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1dcc0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1dcd0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1dce0 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1dcf0 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1dd00 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1dd10 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1dd20 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1dd30 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1dd40 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1dd50 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1dd60 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1dd70 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1dd80 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1dd90 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1dda0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1ddb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1ddc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1ddd0 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1dde0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1ddf0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1de00 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1de10 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1de20 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1de30 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1de40 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1de50 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1de60 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1de70 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1de80 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1de90 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1dea0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1deb0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1dec0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1ded0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1dee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1def0 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1df00 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1df10 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1df20 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1df30 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1df40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1df50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1df60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1df70 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1df80 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1df90 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1dfa0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1dfb0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1dfc0 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1dfd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1dfe0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1dff0 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1e000 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1e010 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1e020 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e030 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e040 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1e050 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1e060 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1e070 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1e080 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1e090 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1e0a0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1e0b0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e0c0 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1e0d0 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1e0e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1e0f0 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1e100 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1e110 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1e120 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1e130 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1e140 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1e150 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1e160 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1e170 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1e180 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1e190 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1e1a0 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1e1b0 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1e1c0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1e1d0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e1e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e1f0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1e200 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1e210 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1e220 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1e230 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
1e240 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e250 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1e260 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1e270 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1e280 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1e290 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1e2a0 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1e2b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1e2c0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1e2d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e2e0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1e2f0 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1e300 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1e310 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1e320 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e330 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e340 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1e350 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
1e360 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
1e370 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
1e380 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
1e390 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
1e3a0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
1e3b0 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
1e3c0 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
1e3d0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1e3e0 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
1e3f0 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1e400 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1e410 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e420 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1e430 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1e440 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1e450 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1e460 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1e470 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1e480 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1e490 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1e4a0 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1e4b0 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1e4c0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1e4d0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1e4e0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1e4f0 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1e500 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e510 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1e520 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1e530 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e540 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1e550 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1e560 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1e570 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1e580 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1e590 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e5a0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1e5b0 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1e5c0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1e5d0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1e5e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1e5f0 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1e600 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1e610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1e620 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1e630 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1e640 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1e650 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1e660 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1e670 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1e680 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1e690 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1e6a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e6b0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1e6c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e6d0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e6e0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1e6f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1e700 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e710 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1e720 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e730 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e740 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1e750 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1e760 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1e770 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1e780 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1e790 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e7a0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e7b0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1e7c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1e7d0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1e7e0 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1e7f0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1e800 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1e810 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1e820 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e830 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1e840 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1e850 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1e860 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1e870 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1e880 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1e890 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1e8a0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1e8b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1e8c0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1e8d0 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1e8e0 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1e8f0 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1e900 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1e910 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1e920 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1e930 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1e940 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1e950 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1e960 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1e970 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1e980 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1e990 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1e9a0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1e9b0 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1e9c0 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1e9d0 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1e9e0 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1e9f0 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1ea00 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1ea10 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1ea20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1ea30 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1ea40 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1ea50 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1ea60 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1ea70 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1ea80 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1ea90 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1eaa0 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1eab0 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1eac0 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1ead0 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1eae0 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1eaf0 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1eb00 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1eb10 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1eb20 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1eb30 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1eb40 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1eb50 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1eb60 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1eb70 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1eb80 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1eb90 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1eba0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1ebb0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1ebc0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1ebd0 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1ebe0 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1ebf0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1ec00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1ec10 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1ec20 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1ec30 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1ec40 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1ec50 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1ec60 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1ec70 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1ec80 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1ec90 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1eca0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1ecb0 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1ecc0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1ecd0 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1ece0 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1ecf0 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1ed00 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1ed10 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1ed20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1ed30 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1ed40 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1ed50 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1ed60 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1ed70 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1ed80 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1ed90 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1eda0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1edb0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1edc0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1edd0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1ede0 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1edf0 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1ee00 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ee10 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1ee20 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1ee30 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1ee40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ee50 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ee60 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1ee70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1ee80 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1ee90 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1eea0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1eeb0 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1eec0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1eed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1eee0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1eef0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ef00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ef10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ef20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1ef30 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1ef40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1ef50 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1ef60 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1ef70 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1ef80 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1ef90 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1efa0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1efb0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1efc0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1efd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1efe0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1eff0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f000 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1f010 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1f020 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1f030 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1f040 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1f050 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1f060 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1f070 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1f080 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1f090 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1f0a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1f0b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f0c0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1f0d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1f0e0 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1f0f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f100 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f110 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1f120 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1f130 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1f140 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1f150 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1f160 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1f170 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1f180 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1f190 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1f1a0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1f1b0 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1f1c0 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1f1d0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1f1e0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1f1f0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1f200 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1f210 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1f220 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1f230 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1f240 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1f250 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1f260 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1f270 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1f280 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1f290 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1f2a0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1f2b0 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1f2c0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1f2d0 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1f2e0 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1f2f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1f300 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1f310 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1f320 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1f330 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1f340 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1f350 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1f360 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1f370 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1f380 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1f390 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1f3a0 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1f3b0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f3c0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1f3d0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1f3e0 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1f3f0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1f400 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1f410 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f420 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1f430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f440 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1f450 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1f460 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1f470 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1f480 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1f490 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1f4a0 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1f4b0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1f4c0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1f4d0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1f4e0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1f4f0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1f500 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1f510 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1f520 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1f530 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1f540 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1f550 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1f560 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1f570 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1f580 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1f590 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1f5a0 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1f5b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1f5c0 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1f5d0 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1f5e0 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1f5f0 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1f600 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1f610 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1f620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1f630 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1f640 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1f650 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1f660 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1f670 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1f680 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1f690 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1f6a0 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1f6b0 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1f6c0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1f6d0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1f6e0 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1f6f0 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1f700 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1f710 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1f720 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1f730 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1f740 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1f750 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1f760 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1f770 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1f780 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1f790 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1f7a0 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1f7b0 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1f7c0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1f7d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1f7e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1f7f0 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1f800 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1f810 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1f820 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1f830 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1f840 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1f850 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1f860 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1f870 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1f880 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1f890 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1f8a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1f8b0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f8c0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f8d0 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1f8e0 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1f8f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f900 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1f910 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1f920 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1f930 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1f940 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1f950 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1f960 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1f970 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1f980 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1f990 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1f9a0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1f9b0 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1f9c0 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1f9d0 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1f9e0 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1f9f0 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1fa00 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1fa10 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1fa20 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1fa30 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1fa40 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1fa50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fa60 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1fa70 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1fa80 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1fa90 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1faa0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1fab0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1fac0 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1fad0 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1fae0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1faf0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1fb00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fb10 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1fb20 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1fb30 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1fb40 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1fb50 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1fb60 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1fb70 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1fb80 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1fb90 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1fba0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1fbb0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1fbc0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1fbd0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1fbe0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1fbf0 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1fc00 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1fc10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1fc20 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1fc30 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1fc40 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1fc50 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1fc60 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1fc70 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1fc80 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1fc90 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1fca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1fcb0 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1fcc0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1fcd0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1fce0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fcf0 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73      p->iDataVers
1fd00 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65  ion--;  /* Compe
1fd10 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72  nsate for pPager
1fd20 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
1fd30 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e  ; */.    pBt->in
1fd40 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1fd50 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1fd60 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1fd70 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1fd80 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1fd90 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1fda0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1fdb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fdc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1fdd0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1fde0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1fdf0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1fe00 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1fe10 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1fe20 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1fe30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1fe40 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1fe50 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1fe60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fe70 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fe80 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1fe90 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1fea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1feb0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1fec0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1fed0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1fee0 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1fef0 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1ff00 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1ff10 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1ff20 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
1ff30 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
1ff40 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1ff50 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
1ff60 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
1ff70 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
1ff80 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
1ff90 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
1ffa0 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
1ffb0 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
1ffc0 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
1ffd0 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
1ffe0 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
1fff0 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
20000 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
20010 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
20020 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
20030 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
20040 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
20050 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
20060 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
20070 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
20080 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
20090 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
200a0 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
200b0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
200c0 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
200d0 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
200e0 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
200f0 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
20100 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
20110 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
20120 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
20130 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
20140 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
20150 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
20160 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
20170 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
20180 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
20190 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
201a0 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
201b0 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
201c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
201d0 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
201e0 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
201f0 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
20200 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
20210 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
20220 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
20230 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
20240 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
20250 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
20260 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
20270 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
20280 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
20290 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
202a0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
202b0 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
202c0 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
202d0 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
202e0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
202f0 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
20300 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
20310 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
20320 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
20330 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20340 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
20350 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
20360 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
20370 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
20380 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
20390 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
203a0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
203b0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
203c0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
203d0 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
203e0 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
203f0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
20400 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20410 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
20420 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
20430 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
20440 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
20450 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
20460 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
20470 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
20480 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
20490 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
204a0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
204b0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
204c0 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
204d0 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d  writeOnly && (p-
204e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
204f0 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29  _WriteFlag)==0 )
20500 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
20510 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20520 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
20530 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
20540 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
20550 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
20560 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
20570 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20580 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20590 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
205a0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
205b0 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c  lCursors(pBtree,
205c0 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   rc, 0);.       
205d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
205e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
205f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
20600 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
20610 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
20620 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  );.        p->eS
20630 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
20640 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ULT;.        p->
20650 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
20660 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
20670 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
20680 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
20690 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
206a0 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
206b0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61  .        p->apPa
206c0 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ge[i] = 0;.     
206d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
206e0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
206f0 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
20700 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20710 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
20720 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
20730 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
20740 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
20750 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
20760 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
20770 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
20780 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
20790 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
207a0 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
207b0 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
207c0 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
207d0 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
207e0 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
207f0 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
20800 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
20810 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
20820 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
20830 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
20840 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
20850 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
20860 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20870 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
20880 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
20890 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
208a0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
208b0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
208c0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
208d0 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
208e0 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
208f0 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
20900 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
20910 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
20920 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
20930 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
20940 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
20950 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
20960 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
20970 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
20980 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
20990 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
209a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
209b0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
209c0 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
209d0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
209e0 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
209f0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
20a00 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
20a10 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
20a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20a30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
20a40 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
20a50 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
20a60 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
20a70 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
20a80 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
20a90 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
20aa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
20ab0 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
20ac0 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
20ad0 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
20ae0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
20af0 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
20b00 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
20b10 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
20b20 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20b30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
20b40 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
20b50 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
20b60 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
20b70 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
20b80 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20b90 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
20ba0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
20bb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20bc0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
20bd0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
20be0 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
20bf0 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
20c00 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
20c10 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
20c20 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
20c30 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
20c40 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
20c50 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
20c60 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
20c70 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
20c80 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
20c90 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
20ca0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20cb0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
20cc0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
20cd0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
20ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
20cf0 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
20d00 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
20d10 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
20d20 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
20d30 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
20d40 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
20d50 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
20d60 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
20d70 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
20d80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
20d90 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
20da0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
20db0 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
20dc0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
20dd0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
20de0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
20df0 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
20e00 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
20e10 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
20e20 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
20e30 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20e40 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20e50 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
20e60 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
20e70 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
20e80 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
20e90 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
20ea0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
20eb0 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
20ec0 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
20ed0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
20ee0 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
20ef0 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
20f00 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
20f10 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
20f20 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
20f30 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
20f40 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
20f50 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
20f60 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
20f70 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
20f80 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
20f90 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
20fa0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
20fb0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
20fc0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
20fd0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
20fe0 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
20ff0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
21000 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
21010 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
21020 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
21030 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
21040 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
21050 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
21060 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
21070 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
21080 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
21090 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
210a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
210b0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
210c0 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
210d0 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
210e0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
210f0 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
21100 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
21110 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
21120 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
21130 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
21140 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
21150 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
21160 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
21170 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
21180 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
21190 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
211a0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
211b0 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
211c0 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
211d0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
211e0 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
211f0 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
21200 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
21210 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
21220 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
21230 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
21240 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
21250 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
21260 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
21270 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
21280 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
21290 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
212a0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
212b0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
212c0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
212d0 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
212e0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
212f0 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ONLY)==0 );.  as
21300 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
21310 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
21320 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
21330 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
21340 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
21350 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
21360 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
21370 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
21380 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
21390 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
213a0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
213b0 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
213c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
213d0 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
213e0 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
213f0 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
21400 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
21410 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
21420 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
21430 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
21440 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
21450 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
21460 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
21470 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
21480 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
21490 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
214a0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
214b0 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
214c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
214d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
214e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
214f0 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
21500 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
21510 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
21520 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
21530 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
21540 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
21550 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
21560 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
21570 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
21580 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
21590 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
215a0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
215b0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
215c0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
215d0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
215e0 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
215f0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
21600 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
21610 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
21620 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
21630 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
21640 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
21650 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
21660 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
21670 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
21680 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
21690 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
216a0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
216b0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
216c0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
216d0 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
216e0 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
216f0 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
21700 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
21710 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
21720 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
21730 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
21740 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
21750 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
21760 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21770 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
21780 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
21790 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
217a0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
217b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
217c0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
217d0 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
217e0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
217f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
21800 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
21810 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
21820 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
21830 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
21840 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21850 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
21860 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
21870 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
21880 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
21890 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
218a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
218b0 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
218c0 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  <0 && (pBt->btsF
218d0 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49  lags & BTS_INITI
218e0 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29  ALLY_EMPTY)!=0 )
218f0 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  {.        pBt->n
21900 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
21910 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  }.      rc = new
21920 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
21930 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
21940 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20  = get4byte(28 + 
21950 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21960 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ta);..      /* T
21970 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
21980 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
21990 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20  o the offset 28 
219a0 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20  of the header.  
219b0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
219c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
219d0 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20  ted, so we know 
219e0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61  that the value a
219f0 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a  t offset.      *
21a00 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e  * 28 is nonzero.
21a10 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
21a20 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
21a30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21a40 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21a50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21a60 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
21a70 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
21a80 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
21a90 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
21aa0 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
21ab0 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
21ac0 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
21ad0 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
21ae0 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
21af0 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
21b00 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
21b10 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
21b20 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
21b30 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
21b40 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
21b50 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
21b60 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
21b70 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
21b80 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
21b90 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
21ba0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
21bb0 74 68 65 20 42 54 52 45 45 5f 57 52 43 53 52 20  the BTREE_WRCSR 
21bc0 62 69 74 20 6f 66 20 77 72 46 6c 61 67 20 69 73  bit of wrFlag is
21bd0 20 63 6c 65 61 72 2c 20 74 68 65 6e 20 74 68 65   clear, then the
21be0 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79   cursor can only
21bf0 0a 2a 2a 20 62 65 20 75 73 65 64 20 66 6f 72 20  .** be used for 
21c00 72 65 61 64 69 6e 67 2e 20 20 49 66 20 74 68 65  reading.  If the
21c10 20 42 54 52 45 45 5f 57 52 43 53 52 20 62 69 74   BTREE_WRCSR bit
21c20 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
21c30 65 20 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20  e cursor.** can 
21c40 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
21c50 69 6e 67 20 6f 72 20 66 6f 72 20 77 72 69 74 69  ing or for writi
21c60 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
21c70 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
21c80 6e 67 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 6d  ng.** are also m
21c90 65 74 2e 20 20 54 68 65 73 65 20 61 72 65 20 74  et.  These are t
21ca0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
21cb0 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
21cc0 6e 20 6f 72 64 65 72 0a 2a 2a 20 66 6f 72 20 77  n order.** for w
21cd0 72 69 74 69 6e 67 20 74 6f 20 62 65 20 61 6c 6c  riting to be all
21ce0 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
21cf0 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
21d00 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
21d10 20 77 69 74 68 20 77 72 46 6c 61 67 20 63 6f 6e   with wrFlag con
21d20 74 61 69 6e 69 6e 67 20 42 54 52 45 45 5f 57 52  taining BTREE_WR
21d30 43 53 52 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74  CSR.**.** 2:  Ot
21d40 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
21d50 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68  nections that sh
21d60 61 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67  are the same pag
21d70 65 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20  er cache.**     
21d80 62 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f  but which are no
21d90 74 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e  t in the READ_UN
21da0 43 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20  COMMITTED state 
21db0 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20  may not have.** 
21dc0 20 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e      cursors open
21dd0 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20   with wrFlag==0 
21de0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
21df0 65 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a  e.  Otherwise.**
21e00 20 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73       the changes
21e10 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72   made by this wr
21e20 69 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64  ite cursor would
21e30 20 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a   be visible to.*
21e40 2a 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63  *     the read c
21e50 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74  ursors in the ot
21e60 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e  her database con
21e70 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33  nection..**.** 3
21e80 3a 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20  :  The database 
21e90 6d 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65  must be writable
21ea0 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e   (not on read-on
21eb0 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20  ly media).**.** 
21ec0 34 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62  4:  There must b
21ed0 65 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e  e an active tran
21ee0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  saction..**.** T
21ef0 68 65 20 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  he BTREE_FORDELE
21f00 54 45 20 62 69 74 20 6f 66 20 77 72 46 6c 61 67  TE bit of wrFlag
21f10 20 6d 61 79 20 6f 70 74 69 6f 6e 61 6c 6c 79 20   may optionally 
21f20 62 65 20 73 65 74 20 69 66 20 42 54 52 45 45 5f  be set if BTREE_
21f30 57 52 43 53 52 0a 2a 2a 20 69 73 20 73 65 74 2e  WRCSR.** is set.
21f40 20 20 49 66 20 46 4f 52 44 45 4c 45 54 45 20 69    If FORDELETE i
21f50 73 20 73 65 74 2c 20 74 68 61 74 20 69 73 20 61  s set, that is a
21f60 20 68 69 6e 74 20 74 6f 20 74 68 65 20 69 6d 70   hint to the imp
21f70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61 74  lementation that
21f80 0a 2a 2a 20 74 68 69 73 20 63 75 72 73 6f 72 20  .** this cursor 
21f90 77 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65  will only be use
21fa0 64 20 74 6f 20 73 65 65 6b 20 74 6f 20 61 6e 64  d to seek to and
21fb0 20 64 65 6c 65 74 65 20 65 6e 74 72 69 65 73 20   delete entries 
21fc0 6f 66 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 61  of an index.** a
21fd0 73 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67  s part of a larg
21fe0 65 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  er DELETE statem
21ff0 65 6e 74 2e 20 20 54 68 65 20 46 4f 52 44 45 4c  ent.  The FORDEL
22000 45 54 45 20 68 69 6e 74 20 69 73 20 6e 6f 74 20  ETE hint is not 
22010 75 73 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  used by.** this 
22020 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
22030 20 42 75 74 20 69 6e 20 61 20 68 79 70 6f 74 68   But in a hypoth
22040 65 74 69 63 61 6c 20 61 6c 74 65 72 6e 61 74 69  etical alternati
22050 76 65 20 73 74 6f 72 61 67 65 20 65 6e 67 69 6e  ve storage engin
22060 65 20 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20 69  e .** in which i
22070 6e 64 65 78 20 65 6e 74 72 69 65 73 20 61 72 65  ndex entries are
22080 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
22090 65 6c 65 74 65 64 20 77 68 65 6e 20 63 6f 72 72  eleted when corr
220a0 65 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 0a  esponding table.
220b0 2a 2a 20 72 6f 77 73 20 61 72 65 20 64 65 6c 65  ** rows are dele
220c0 74 65 64 2c 20 74 68 65 20 46 4f 52 44 45 4c 45  ted, the FORDELE
220d0 54 45 20 66 6c 61 67 20 69 73 20 61 20 68 69 6e  TE flag is a hin
220e0 74 20 74 68 61 74 20 61 6c 6c 20 53 45 45 4b 20  t that all SEEK 
220f0 61 6e 64 20 44 45 4c 45 54 45 0a 2a 2a 20 6f 70  and DELETE.** op
22100 65 72 61 74 69 6f 6e 73 20 6f 6e 20 74 68 69 73  erations on this
22110 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20 6e   cursor can be n
22120 6f 2d 6f 70 73 20 61 6e 64 20 61 6c 6c 20 52 45  o-ops and all RE
22130 41 44 20 6f 70 65 72 61 74 69 6f 6e 73 20 63 61  AD operations ca
22140 6e 20 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 6e  n .** return a n
22150 75 6c 6c 20 72 6f 77 20 28 32 2d 62 79 74 65 73  ull row (2-bytes
22160 3a 20 30 78 30 31 20 30 78 30 30 29 2e 0a 2a 2a  : 0x01 0x00)..**
22170 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
22180 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
22190 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
221a0 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
221b0 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
221c0 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
221d0 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
221e0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
221f0 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
22200 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
22210 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
22220 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
22230 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22240 72 5a 65 72 6f 28 29 20 68 61 73 20 62 65 65 6e  rZero() has been
22250 20 63 61 6c 6c 65 64 0a 2a 2a 20 6f 6e 20 70 43   called.** on pC
22260 75 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ur to initialize
22270 20 74 68 65 20 6d 65 6d 6f 72 79 20 73 70 61 63   the memory spac
22280 65 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  e prior to invok
22290 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
222a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
222b0 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
222c0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
222d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
222f0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
22300 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22320 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
22330 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
22340 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
22370 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
22380 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
22390 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
223a0 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
223b0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
223c0 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
223d0 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
223e0 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22400 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
22410 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
22420 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
22430 70 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20  p->pBt;         
22440 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64         /* Shared
22450 20 62 2d 74 72 65 65 20 68 61 6e 64 6c 65 20 2a   b-tree handle *
22460 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 58  /.  BtCursor *pX
22470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22480 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
22490 6f 70 69 6e 67 20 6f 76 65 72 20 6f 74 68 65 72  oping over other
224a0 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 2a 2f 0a   all cursors */.
224b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
224c0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
224d0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
224e0 28 20 77 72 46 6c 61 67 3d 3d 30 20 0a 20 20 20  ( wrFlag==0 .   
224f0 20 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 42      || wrFlag==B
22500 54 52 45 45 5f 57 52 43 53 52 20 0a 20 20 20 20  TREE_WRCSR .    
22510 20 20 20 7c 7c 20 77 72 46 6c 61 67 3d 3d 28 42     || wrFlag==(B
22520 54 52 45 45 5f 57 52 43 53 52 7c 42 54 52 45 45  TREE_WRCSR|BTREE
22530 5f 46 4f 52 44 45 4c 45 54 45 29 20 0a 20 20 29  _FORDELETE) .  )
22540 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
22550 6f 77 69 6e 67 20 61 73 73 65 72 74 20 73 74 61  owing assert sta
22560 74 65 6d 65 6e 74 73 20 76 65 72 69 66 79 20 74  tements verify t
22570 68 61 74 20 69 66 20 74 68 69 73 20 69 73 20 61  hat if this is a
22580 20 73 68 61 72 61 62 6c 65 20 0a 20 20 2a 2a 20   sharable .  ** 
22590 62 2d 74 72 65 65 20 64 61 74 61 62 61 73 65 2c  b-tree database,
225a0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
225b0 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 72  is holding the r
225c0 65 71 75 69 72 65 64 20 74 61 62 6c 65 20 6c 6f  equired table lo
225d0 63 6b 73 2c 20 0a 20 20 2a 2a 20 61 6e 64 20 74  cks, .  ** and t
225e0 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e  hat no other con
225f0 6e 65 63 74 69 6f 6e 20 68 61 73 20 61 6e 79 20  nection has any 
22600 6f 70 65 6e 20 63 75 72 73 6f 72 20 74 68 61 74  open cursor that
22610 20 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20   conflicts with 
22620 0a 20 20 2a 2a 20 74 68 69 73 20 6c 6f 63 6b 2e  .  ** this lock.
22630 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 68    */.  assert( h
22640 61 73 53 68 61 72 65 64 43 61 63 68 65 54 61 62  asSharedCacheTab
22650 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 6c 65  leLock(p, iTable
22660 2c 20 70 4b 65 79 49 6e 66 6f 21 3d 30 2c 20 28  , pKeyInfo!=0, (
22670 77 72 46 6c 61 67 3f 32 3a 31 29 29 20 29 3b 0a  wrFlag?2:1)) );.
22680 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22690 3d 3d 30 20 7c 7c 20 21 68 61 73 52 65 61 64 43  ==0 || !hasReadC
226a0 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62  onflicts(p, iTab
226b0 6c 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  le) );..  /* Ass
226c0 65 72 74 20 74 68 61 74 20 74 68 65 20 63 61 6c  ert that the cal
226d0 6c 65 72 20 68 61 73 20 6f 70 65 6e 65 64 20 74  ler has opened t
226e0 68 65 20 72 65 71 75 69 72 65 64 20 74 72 61 6e  he required tran
226f0 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 61 73  saction. */.  as
22700 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
22710 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20  >TRANS_NONE );. 
22720 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22730 3d 30 20 7c 7c 20 70 2d 3e 69 6e 54 72 61 6e 73  =0 || p->inTrans
22740 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
22750 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
22760 70 50 61 67 65 31 20 26 26 20 70 42 74 2d 3e 70  pPage1 && pBt->p
22770 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29 3b 0a  Page1->aData );.
22780 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22790 3d 3d 30 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73  ==0 || (pBt->bts
227a0 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44  Flags & BTS_READ
227b0 5f 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 0a 20 20  _ONLY)==0 );..  
227c0 69 66 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20  if( wrFlag ){.  
227d0 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70    allocateTempSp
227e0 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 69 66  ace(pBt);.    if
227f0 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  ( pBt->pTmpSpace
22800 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
22810 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
22820 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
22830 26 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  & btreePagecount
22840 28 70 42 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  (pBt)==0 ){.    
22850 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22860 30 20 29 3b 0a 20 20 20 20 69 54 61 62 6c 65 20  0 );.    iTable 
22870 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  = 0;.  }..  /* N
22880 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
22890 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
228a0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
228b0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
228c0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
228d0 20 61 6e 64 20 6c 69 6e 6b 20 74 68 65 20 63 75   and link the cu
228e0 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
228f0 53 68 61 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f  Shared list.  */
22900 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  .  pCur->pgnoRoo
22910 74 20 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  t = (Pgno)iTable
22920 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
22930 3d 20 2d 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  = -1;.  pCur->pK
22940 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
22950 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65  o;.  pCur->pBtre
22960 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70  e = p;.  pCur->p
22970 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72  Bt = pBt;.  pCur
22980 2d 3e 63 75 72 46 6c 61 67 73 20 3d 20 77 72 46  ->curFlags = wrF
22990 6c 61 67 20 3f 20 42 54 43 46 5f 57 72 69 74 65  lag ? BTCF_Write
229a0 46 6c 61 67 20 3a 20 30 3b 0a 20 20 70 43 75 72  Flag : 0;.  pCur
229b0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 20  ->curPagerFlags 
229c0 3d 20 77 72 46 6c 61 67 20 3f 20 30 20 3a 20 50  = wrFlag ? 0 : P
229d0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
229e0 59 3b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  Y;.  /* If there
229f0 20 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65   are two or more
22a00 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20   cursors on the 
22a10 73 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e  same btree, then
22a20 20 61 6c 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63   all such.  ** c
22a30 75 72 73 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61  ursors *must* ha
22a40 76 65 20 74 68 65 20 42 54 43 46 5f 4d 75 6c 74  ve the BTCF_Mult
22a50 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 2a  iple flag set. *
22a60 2f 0a 20 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e  /.  for(pX=pBt->
22a70 70 43 75 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d  pCursor; pX; pX=
22a80 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
22a90 69 66 28 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74  if( pX->pgnoRoot
22aa0 3d 3d 28 50 67 6e 6f 29 69 54 61 62 6c 65 20 29  ==(Pgno)iTable )
22ab0 7b 0a 20 20 20 20 20 20 70 58 2d 3e 63 75 72 46  {.      pX->curF
22ac0 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c  lags |= BTCF_Mul
22ad0 74 69 70 6c 65 3b 0a 20 20 20 20 20 20 70 43 75  tiple;.      pCu
22ae0 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
22af0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
22b00 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e    }.  }.  pCur->
22b10 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75  pNext = pBt->pCu
22b20 72 73 6f 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75  rsor;.  pBt->pCu
22b30 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70  rsor = pCur;.  p
22b40 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
22b50 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
22b60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22b70 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
22b80 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74  treeCursor(.  Bt
22b90 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ree *p,         
22ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
22bc0 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   btree */.  int 
22bd0 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  iTable,         
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20          /* Root 
22c00 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f  page of table to
22c10 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77   open */.  int w
22c20 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20  rFlag,          
22c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c40 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
22c50 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
22c60 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
22c70 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
22c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c90 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20     /* First arg 
22ca0 74 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f  to xCompare() */
22cb0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22cc0 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
22cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22ce0 2a 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73  * Write new curs
22cf0 6f 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  or here */.){.  
22d00 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 54  int rc;.  if( iT
22d10 61 62 6c 65 3c 31 20 29 7b 0a 20 20 20 20 72 63  able<1 ){.    rc
22d20 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
22d30 54 5f 42 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  T_BKPT;.  }else{
22d40 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22d50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20 72  eEnter(p);.    r
22d60 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28  c = btreeCursor(
22d70 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61  p, iTable, wrFla
22d80 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75  g, pKeyInfo, pCu
22d90 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  r);.    sqlite3B
22da0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
22db0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22dc0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22dd0 68 65 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43  he size of a BtC
22de0 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20  ursor object in 
22df0 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bytes..**.** Thi
22e00 73 20 69 6e 74 65 72 66 61 63 65 73 20 69 73 20  s interfaces is 
22e10 6e 65 65 64 65 64 20 73 6f 20 74 68 61 74 20 75  needed so that u
22e20 73 65 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20  sers of cursors 
22e30 63 61 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a  can preallocate.
22e40 2a 2a 20 73 75 66 66 69 63 69 65 6e 74 20 73 74  ** sufficient st
22e50 6f 72 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20  orage to hold a 
22e60 63 75 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43  cursor.  The BtC
22e70 75 72 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20  ursor object is 
22e80 6f 70 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65  opaque.** to use
22e90 72 73 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f  rs so they canno
22ea0 74 20 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28  t do the sizeof(
22eb0 29 20 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74  ) themselves - t
22ec0 68 65 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a  hey must call.**
22ed0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
22ee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
22ef0 65 65 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69  eeCursorSize(voi
22f00 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 52 4f 55  d){.  return ROU
22f10 4e 44 38 28 73 69 7a 65 6f 66 28 42 74 43 75 72  ND8(sizeof(BtCur
22f20 73 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sor));.}../*.** 
22f30 49 6e 69 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72  Initialize memor
22f40 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 63  y that will be c
22f50 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20  onverted into a 
22f60 42 74 43 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e  BtCursor object.
22f70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c  .**.** The simpl
22f80 65 20 61 70 70 72 6f 61 63 68 20 68 65 72 65 20  e approach here 
22f90 77 6f 75 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73  would be to mems
22fa0 65 74 28 29 20 74 68 65 20 65 6e 74 69 72 65 20  et() the entire 
22fb0 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72  object.** to zer
22fc0 6f 2e 20 20 42 75 74 20 69 74 20 74 75 72 6e 73  o.  But it turns
22fd0 20 6f 75 74 20 74 68 61 74 20 74 68 65 20 61 70   out that the ap
22fe0 50 61 67 65 5b 5d 20 61 6e 64 20 61 69 49 64 78  Page[] and aiIdx
22ff0 5b 5d 20 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20  [] arrays.** do 
23000 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 7a  not need to be z
23010 65 72 6f 65 64 20 61 6e 64 20 74 68 65 79 20 61  eroed and they a
23020 72 65 20 6c 61 72 67 65 2c 20 73 6f 20 77 65 20  re large, so we 
23030 63 61 6e 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a  can save a lot.*
23040 2a 20 6f 66 20 72 75 6e 2d 74 69 6d 65 20 62 79  * of run-time by
23050 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
23060 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
23070 74 68 6f 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a  those elements..
23080 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
23090 74 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 42  treeCursorZero(B
230a0 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d  tCursor *p){.  m
230b0 65 6d 73 65 74 28 70 2c 20 30 2c 20 6f 66 66 73  emset(p, 0, offs
230c0 65 74 6f 66 28 42 74 43 75 72 73 6f 72 2c 20 69  etof(BtCursor, i
230d0 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
230e0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
230f0 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
23100 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
23110 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
23120 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
23130 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
23140 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
23150 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
23160 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
23170 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
23180 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
23190 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
231a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
231b0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
231c0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20   = pCur->pBt;.  
231d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
231e0 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ter(pBtree);.   
231f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
23200 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
23210 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
23220 3e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  >pCursor!=0 );. 
23230 20 20 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72     if( pBt->pCur
23240 73 6f 72 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20  sor==pCur ){.   
23250 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
23260 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
23270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23280 42 74 43 75 72 73 6f 72 20 2a 70 50 72 65 76 20  BtCursor *pPrev 
23290 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a  = pBt->pCursor;.
232a0 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
232b0 20 20 69 66 28 20 70 50 72 65 76 2d 3e 70 4e 65    if( pPrev->pNe
232c0 78 74 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20  xt==pCur ){.    
232d0 20 20 20 20 20 20 70 50 72 65 76 2d 3e 70 4e 65        pPrev->pNe
232e0 78 74 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  xt = pCur->pNext
232f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
23300 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
23310 20 20 20 20 20 70 50 72 65 76 20 3d 20 70 50 72       pPrev = pPr
23320 65 76 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ev->pNext;.     
23330 20 7d 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28   }while( ALWAYS(
23340 70 50 72 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a  pPrev) );.    }.
23350 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d      for(i=0; i<=
23360 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
23370 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
23380 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67  Page(pCur->apPag
23390 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e[i]);.    }.   
233a0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
233b0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73  used(pBt);.    s
233c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
233d0 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
233e0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65    /* sqlite3_fre
233f0 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20  e(pCur); */.    
23400 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
23410 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  e(pBtree);.  }. 
23420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
23430 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
23440 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
23450 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
23460 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
23470 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
23480 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
23490 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
234a0 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
234b0 61 6c 6c 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  all.** btreePars
234c0 65 43 65 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20  eCell() to fill 
234d0 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43  it in..**.** BtC
234e0 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20  ursor.info is a 
234f0 63 61 63 68 65 20 6f 66 20 74 68 65 20 69 6e 66  cache of the inf
23500 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
23510 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a  current cell..**
23520 20 55 73 69 6e 67 20 74 68 69 73 20 63 61 63 68   Using this cach
23530 65 20 72 65 64 75 63 65 73 20 74 68 65 20 6e 75  e reduces the nu
23540 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f  mber of calls to
23550 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28   btreeParseCell(
23560 29 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  )..*/.#ifndef ND
23570 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
23580 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
23590 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
235a0 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
235b0 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
235c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
235d0 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
235e0 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
235f0 6e 66 6f 29 29 3b 0a 20 20 20 20 62 74 72 65 65  nfo));.    btree
23600 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
23610 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 20 70  apPage[iPage], p
23620 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
23630 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61  ], &info);.    a
23640 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
23650 42 20 7c 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66  B || memcmp(&inf
23660 6f 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20  o, &pCur->info, 
23670 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30  sizeof(info))==0
23680 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20   );.  }.#else.  
23690 23 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65  #define assertCe
236a0 6c 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66  llInfo(x).#endif
236b0 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
236c0 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 67 65 74  OINLINE void get
236d0 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
236e0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 66 28 20  r *pCur){.  if( 
236f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
23700 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
23710 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61  Page = pCur->iPa
23720 67 65 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75  ge;.    pCur->cu
23730 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
23740 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74  alidNKey;.    bt
23750 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
23760 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d  r->apPage[iPage]
23770 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61  ,pCur->aiIdx[iPa
23780 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29  ge],&pCur->info)
23790 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
237a0 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
237b0 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  ur);.  }.}..#ifn
237c0 64 65 66 20 4e 44 45 42 55 47 20 20 2f 2a 20 54  def NDEBUG  /* T
237d0 68 65 20 6e 65 78 74 20 72 6f 75 74 69 6e 65 20  he next routine 
237e0 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
237f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
23800 65 6e 74 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65  ents */./*.** Re
23810 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
23820 20 67 69 76 65 6e 20 42 74 43 75 72 73 6f 72 20   given BtCursor 
23830 69 73 20 76 61 6c 69 64 2e 20 20 41 20 76 61 6c  is valid.  A val
23840 69 64 20 63 75 72 73 6f 72 20 69 73 20 6f 6e 65  id cursor is one
23850 0a 2a 2a 20 74 68 61 74 20 69 73 20 63 75 72 72  .** that is curr
23860 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
23870 6f 20 61 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f  o a row in a (no
23880 6e 2d 65 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a  n-empty) table..
23890 2a 2a 20 54 68 69 73 20 69 73 20 61 20 76 65 72  ** This is a ver
238a0 69 66 69 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e  ification routin
238b0 65 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 77  e is used only w
238c0 69 74 68 69 6e 20 61 73 73 65 72 74 28 29 20 73  ithin assert() s
238d0 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e  tatements..*/.in
238e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
238f0 72 73 6f 72 49 73 56 61 6c 69 64 28 42 74 43 75  rsorIsValid(BtCu
23900 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 72  rsor *pCur){.  r
23910 65 74 75 72 6e 20 70 43 75 72 20 26 26 20 70 43  eturn pCur && pC
23920 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
23930 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64  OR_VALID;.}.#end
23940 69 66 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a  if /* NDEBUG */.
23950 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
23960 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
23970 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
23980 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
23990 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
239a0 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
239b0 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
239c0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
239d0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
239e0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
239f0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
23a00 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
23a10 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
23a20 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
23a30 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
23a40 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
23a50 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
23a60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
23a70 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a  n the key..**.**
23a80 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
23a90 20 70 6f 73 69 74 69 6f 6e 20 74 68 65 20 63 75   position the cu
23aa0 72 73 6f 72 20 70 72 69 6f 72 20 74 6f 20 69 6e  rsor prior to in
23ab0 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
23ac0 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73  ine..** .** This
23ad0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
23ae0 66 61 69 6c 2e 20 20 49 74 20 61 6c 77 61 79 73  fail.  It always
23af0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
23b00 4f 4b 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  OK.  .*/.int sql
23b10 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
23b20 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
23b30 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20   i64 *pSize){.  
23b40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
23b50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
23b60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23b70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23b80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 67 65 74 43  _VALID );.  getC
23b90 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
23ba0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
23bb0 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74  info.nKey;.  ret
23bc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
23bd0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69  ../*.** Set *pSi
23be0 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  ze to the number
23bf0 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74   of bytes of dat
23c00 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74  a in the entry t
23c10 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72  he.** cursor cur
23c20 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
23c30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23c40 65 72 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  er must guarante
23c50 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
23c60 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
23c70 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76   a non-NULL.** v
23c80 61 6c 69 64 20 65 6e 74 72 79 2e 20 20 49 6e 20  alid entry.  In 
23c90 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65  other words, the
23ca0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
23cb0 72 65 20 6d 75 73 74 20 67 75 61 72 61 6e 74 65  re must guarante
23cc0 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 75  e.** that the cu
23cd0 72 73 6f 72 20 68 61 73 20 43 75 72 73 6f 72 2e  rsor has Cursor.
23ce0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23cf0 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c  ALID..**.** Fail
23d00 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
23d10 62 6c 65 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ble.  This funct
23d20 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
23d30 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
23d40 20 49 74 20 6d 69 67 68 74 20 6a 75 73 74 20 61   It might just a
23d50 73 20 77 65 6c 6c 20 62 65 20 61 20 70 72 6f 63  s well be a proc
23d60 65 64 75 72 65 20 28 72 65 74 75 72 6e 69 6e 67  edure (returning
23d70 20 76 6f 69 64 29 20 62 75 74 20 77 65 20 63 6f   void) but we co
23d80 6e 74 69 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74  ntinue.** to ret
23d90 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 72  urn an integer r
23da0 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 20 68  esult code for h
23db0 69 73 74 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e  istorical reason
23dc0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
23dd0 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
23de0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
23df0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73  32 *pSize){.  as
23e00 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
23e10 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
23e20 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23e30 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
23e40 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
23e50 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
23e60 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
23e70 70 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55  pCur->iPage<BTCU
23e80 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29  RSOR_MAX_DEPTH )
23e90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23ea0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
23eb0 50 61 67 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61  Page]->intKeyLea
23ec0 66 3d 3d 31 20 29 3b 0a 20 20 67 65 74 43 65 6c  f==1 );.  getCel
23ed0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a  lInfo(pCur);.  *
23ee0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
23ef0 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72  fo.nPayload;.  r
23f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23f10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
23f20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
23f30 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  of an overflow p
23f40 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
23f50 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a 2a  ase (parameter.*
23f60 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66 75  * ovfl), this fu
23f70 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68 65  nction finds the
23f80 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
23f90 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
23fa0 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20   the .** linked 
23fb0 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77  list of overflow
23fc0 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73 69   pages. If possi
23fd0 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68 65  ble, it uses the
23fe0 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20   auto-vacuum.** 
23ff0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74 61  pointer-map data
24000 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61 64   instead of read
24010 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
24020 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f 20  of page ovfl to 
24030 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  do so. .**.** If
24040 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
24050 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
24060 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
24070 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a  d. Otherwise:.**
24080 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d  .** The page num
24090 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
240a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
240b0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
240c0 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20   is .** written 
240d0 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49  to *pPgnoNext. I
240e0 66 20 70 61 67 65 20 6f 76 66 6c 20 69 73 20 74  f page ovfl is t
240f0 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
24100 69 74 73 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c  its linked .** l
24110 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20  ist, *pPgnoNext 
24120 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
24130 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65  .**.** If ppPage
24140 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e   is not NULL, an
24150 64 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  d a reference to
24160 20 74 68 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a   the MemPage obj
24170 65 63 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ect correspondin
24180 67 0a 2a 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d  g.** to page num
24190 62 65 72 20 70 4f 76 66 6c 20 77 61 73 20 6f 62  ber pOvfl was ob
241a0 74 61 69 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70  tained, then *pp
241b0 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 70  Page is set to p
241c0 6f 69 6e 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20  oint to that.** 
241d0 72 65 66 65 72 65 6e 63 65 2e 20 49 74 20 69 73  reference. It is
241e0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
241f0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
24200 72 20 74 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73  r to call releas
24210 65 50 61 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70  ePage().** on *p
24220 70 50 61 67 65 20 74 6f 20 66 72 65 65 20 74 68  pPage to free th
24230 65 20 72 65 66 65 72 65 6e 63 65 2e 20 49 6e 20  e reference. In 
24240 6e 6f 20 72 65 66 65 72 65 6e 63 65 20 77 61 73  no reference was
24250 20 6f 62 74 61 69 6e 65 64 20 28 62 65 63 61 75   obtained (becau
24260 73 65 0a 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  se.** the pointe
24270 72 2d 6d 61 70 20 77 61 73 20 75 73 65 64 20 74  r-map was used t
24280 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 76 61 6c  o obtain the val
24290 75 65 20 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78  ue for *pPgnoNex
242a0 74 29 2c 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50  t), then.** *ppP
242b0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65  age is set to ze
242c0 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
242d0 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  t getOverflowPag
242e0 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
242f0 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Bt,             
24300 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
24310 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
24320 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
24330 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
24340 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
24350 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65  e number */.  Me
24360 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
24370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24380 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
24390 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
243a0 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
243b0 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
243c0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
243d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
243e0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
243f0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
24400 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
24410 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
24420 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
24430 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
24440 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
24450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
24460 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
24470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
24480 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
24490 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
244a0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
244b0 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
244c0 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
244d0 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
244e0 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
244f0 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
24500 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
24510 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
24520 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
24530 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
24540 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
24550 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
24560 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
24570 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
24580 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
24590 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
245a0 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
245b0 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
245c0 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
245d0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
245e0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
245f0 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
24600 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
24610 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
24620 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
24630 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
24640 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
24650 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
24660 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
24670 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
24680 65 73 73 3c 3d 62 74 72 65 65 50 61 67 65 63 6f  ess<=btreePageco
24690 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
246a0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
246b0 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
246c0 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
246d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
246e0 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
246f0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
24700 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
24710 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
24720 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
24730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
24740 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
24750 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
24760 73 73 65 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c  ssert( next==0 |
24770 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  | rc==SQLITE_DON
24780 45 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  E );.  if( rc==S
24790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
247a0 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
247b0 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50  e(pBt, ovfl, &pP
247c0 61 67 65 2c 20 28 70 70 50 61 67 65 3d 3d 30 29  age, (ppPage==0)
247d0 20 3f 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41   ? PAGER_GET_REA
247e0 44 4f 4e 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20  DONLY : 0);.    
247f0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
24800 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d  TE_OK || pPage==
24810 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 );.    if( rc=
24820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24830 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
24840 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
24850 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
24860 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78  *pPgnoNext = nex
24870 74 3b 0a 20 20 69 66 28 20 70 70 50 61 67 65 20  t;.  if( ppPage 
24880 29 7b 0a 20 20 20 20 2a 70 70 50 61 67 65 20 3d  ){.    *ppPage =
24890 20 70 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b   pPage;.  }else{
248a0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
248b0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
248c0 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
248d0 45 5f 44 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f  E_DONE ? SQLITE_
248e0 4f 4b 20 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  OK : rc);.}../*.
248f0 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  ** Copy data fro
24900 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20 61 20  m a buffer to a 
24910 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20  page, or from a 
24920 70 61 67 65 20 74 6f 20 61 20 62 75 66 66 65 72  page to a buffer
24930 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64  ..**.** pPayload
24940 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
24950 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20   data stored on 
24960 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
24970 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67  bPage..** If arg
24980 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c  ument eOp is fal
24990 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62  se, then nByte b
249a0 79 74 65 73 20 6f 66 20 64 61 74 61 20 61 72 65  ytes of data are
249b0 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20   copied.** from 
249c0 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20  pPayload to the 
249d0 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61  buffer pointed a
249e0 74 20 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f  t by pBuf. If eO
249f0 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68  p is true,.** th
24a00 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  en sqlite3PagerW
24a10 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
24a20 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20   on pDbPage and 
24a30 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f  nByte bytes.** o
24a40 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
24a50 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  d from the buffe
24a60 72 20 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f  r pBuf to pPaylo
24a70 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ad..**.** SQLITE
24a80 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
24a90 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65  on success, othe
24aa0 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63  rwise an error c
24ab0 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
24ac0 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a  nt copyPayload(.
24ad0 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64    void *pPayload
24ae0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
24af0 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64  ointer to page d
24b00 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
24b10 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
24b20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
24b30 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74   buffer */.  int
24b40 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20   nByte,         
24b50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
24b60 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70   of bytes to cop
24b70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20  y */.  int eOp, 
24b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b90 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72   /* 0 -> copy fr
24ba0 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f  om page, 1 -> co
24bb0 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  py to page */.  
24bc0 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 20  DbPage *pDbPage 
24bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
24be0 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61  e containing pPa
24bf0 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  yload */.){.  if
24c00 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( eOp ){.    /* 
24c10 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62  Copy data from b
24c20 75 66 66 65 72 20 74 6f 20 70 61 67 65 20 28 61  uffer to page (a
24c30 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
24c40 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20  ) */.    int rc 
24c50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
24c60 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
24c70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24c80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
24c90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24ca0 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61    memcpy(pPayloa
24cb0 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b  d, pBuf, nByte);
24cc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
24cd0 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
24ce0 70 61 67 65 20 74 6f 20 62 75 66 66 65 72 20 28  page to buffer (
24cf0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
24d00 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28  ) */.    memcpy(
24d10 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20  pBuf, pPayload, 
24d20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65  nByte);.  }.  re
24d30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24d40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24d50 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
24d60 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72  o read or overwr
24d70 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f  ite payload info
24d80 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74  rmation.** for t
24d90 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
24da0 65 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  e pCur cursor is
24db0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68   pointing to. Th
24dc0 65 20 65 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e  e eOp.** argumen
24dd0 74 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  t is interpreted
24de0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
24df0 2a 2a 20 20 20 30 3a 20 54 68 65 20 6f 70 65 72  **   0: The oper
24e00 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61 64 2e  ation is a read.
24e10 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   Populate the ov
24e20 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a  erflow cache..**
24e30 20 20 20 31 3a 20 54 68 65 20 6f 70 65 72 61 74     1: The operat
24e40 69 6f 6e 20 69 73 20 61 20 77 72 69 74 65 2e 20  ion is a write. 
24e50 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65  Populate the ove
24e60 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20  rflow cache..** 
24e70 20 20 32 3a 20 54 68 65 20 6f 70 65 72 61 74 69    2: The operati
24e80 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 44 6f  on is a read. Do
24e90 20 6e 6f 74 20 70 6f 70 75 6c 61 74 65 20 74 68   not populate th
24ea0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
24eb0 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20  ..**.** A total 
24ec0 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61  of "amt" bytes a
24ed0 72 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  re read or writt
24ee0 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  en beginning at 
24ef0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74  "offset"..** Dat
24f00 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20  a is read to or 
24f10 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
24f20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  pBuf..**.** The 
24f30 63 6f 6e 74 65 6e 74 20 62 65 69 6e 67 20 72 65  content being re
24f40 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 6d 69  ad or written mi
24f50 67 68 74 20 61 70 70 65 61 72 20 6f 6e 20 74 68  ght appear on th
24f60 65 20 6d 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f  e main page.** o
24f70 72 20 62 65 20 73 63 61 74 74 65 72 65 64 20 6f  r be scattered o
24f80 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f  ut on multiple o
24f90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a  verflow pages..*
24fa0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
24fb0 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79  ent cursor entry
24fc0 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
24fd0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
24fe0 20 61 6e 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20   and the.** eOp 
24ff0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
25000 32 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  2, this function
25010 20 6d 61 79 20 61 6c 6c 6f 63 61 74 65 20 73 70   may allocate sp
25020 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
25030 6c 79 20 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73  ly .** populates
25040 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
25050 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 61 72  ge-list cache ar
25060 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
25070 76 65 72 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75  verflow). .** Su
25080 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75  bsequent calls u
25090 73 65 20 74 68 69 73 20 63 61 63 68 65 20 74 6f  se this cache to
250a0 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f   make seeking to
250b0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66   the supplied of
250c0 66 73 65 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66  fset .** more ef
250d0 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f  ficient..**.** O
250e0 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  nce an overflow 
250f0 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
25100 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
25110 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a  ed, it may be.**
25120 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20   invalidated if 
25130 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f  some other curso
25140 72 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  r writes to the 
25150 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69  same table, or i
25160 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20  f.** the cursor 
25170 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69  is moved to a di
25180 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64  fferent row. Add
25190 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75  itionally, in au
251a0 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64  to-vacuum.** mod
251b0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
251c0 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61   events may inva
251d0 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c  lidate an overfl
251e0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
251f0 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e  he..**.**   * An
25200 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
25210 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f  uum,.**   * A co
25220 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63  mmit in auto_vac
25230 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c  uum="full" mode,
25240 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67  .**   * Creating
25250 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65   a table (may re
25260 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
25270 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a  overflow page)..
25280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63  */.static int ac
25290 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42  cessPayload(.  B
252a0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
252b0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
252c0 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
252d0 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
252e0 20 20 75 33 32 20 6f 66 66 73 65 74 2c 20 20 20    u32 offset,   
252f0 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20         /* Begin 
25300 72 65 61 64 69 6e 67 20 74 68 69 73 20 66 61 72  reading this far
25310 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f   into payload */
25320 0a 20 20 75 33 32 20 61 6d 74 2c 20 20 20 20 20  .  u32 amt,     
25330 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20          /* Read 
25340 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
25350 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
25360 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69  ar *pBuf, /* Wri
25370 74 65 20 74 68 65 20 62 79 74 65 73 20 69 6e 74  te the bytes int
25380 6f 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f  o this buffer */
25390 20 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20   .  int eOp     
253a0 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f           /* zero
253b0 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65   to read. non-ze
253c0 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a  ro to write. */.
253d0 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
253e0 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *aPayload;.  
253f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25400 4f 4b 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d  OK;.  int iIdx =
25410 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
25420 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
25430 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
25440 3b 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20  ; /* Btree page 
25450 6f 66 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  of current entry
25460 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
25470 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20    /* Btree this 
254a0 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74  cursor belongs t
254b0 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
254c0 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c  TE_DIRECT_OVERFL
254d0 4f 57 5f 52 45 41 44 0a 20 20 75 6e 73 69 67 6e  OW_READ.  unsign
254e0 65 64 20 63 68 61 72 20 2a 20 63 6f 6e 73 74 20  ed char * const 
254f0 70 42 75 66 53 74 61 72 74 20 3d 20 70 42 75 66  pBufStart = pBuf
25500 3b 0a 20 20 69 6e 74 20 62 45 6e 64 3b 20 20 20  ;.  int bEnd;   
25510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25530 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
25540 20 74 6f 20 65 6e 64 20 6f 66 20 64 61 74 61 20   to end of data 
25550 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  */.#endif..  ass
25560 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20  ert( pPage );.  
25570 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
25580 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
25590 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
255a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
255b0 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
255c0 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  nCell );.  asser
255d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
255e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
255f0 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c  ssert( eOp!=2 ||
25600 20 6f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20   offset==0 );   
25610 20 2f 2a 20 41 6c 77 61 79 73 20 73 74 61 72 74   /* Always start
25620 20 66 72 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20   from beginning 
25630 66 6f 72 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20  for eOp==2 */.. 
25640 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
25650 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
25660 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79   pCur->info.pPay
25670 6c 6f 61 64 3b 0a 23 69 66 64 65 66 20 53 51 4c  load;.#ifdef SQL
25680 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
25690 4c 4f 57 5f 52 45 41 44 0a 20 20 62 45 6e 64 20  LOW_READ.  bEnd 
256a0 3d 20 6f 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43  = offset+amt==pC
256b0 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
256c0 64 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  d;.#endif.  asse
256d0 72 74 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  rt( offset+amt <
256e0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61  = pCur->info.nPa
256f0 79 6c 6f 61 64 20 29 3b 0a 0a 20 20 69 66 28 20  yload );..  if( 
25700 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e  &aPayload[pCur->
25710 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26  info.nLocal] > &
25720 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74  pPage->aData[pBt
25730 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b  ->usableSize] ){
25740 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74  .    /* Trying t
25750 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
25760 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
25770 74 68 65 20 64 61 74 61 20 69 73 20 61 6e 20 65  the data is an e
25780 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75  rror */.    retu
25790 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
257a0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f  T_BKPT;.  }..  /
257b0 2a 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20  * Check if data 
257c0 6d 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69  must be read/wri
257d0 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65  tten to/from the
257e0 20 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65   btree page itse
257f0 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  lf. */.  if( off
25800 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set<pCur->info.n
25810 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74  Local ){.    int
25820 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66   a = amt;.    if
25830 28 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d  ( a+offset>pCur-
25840 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
25850 20 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e        a = pCur->
25860 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66  info.nLocal - of
25870 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fset;.    }.    
25880 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
25890 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
258a0 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  t], pBuf, a, (eO
258b0 70 20 26 20 30 78 30 31 29 2c 20 70 50 61 67 65  p & 0x01), pPage
258c0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
258d0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
258e0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
258f0 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
25900 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
25910 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25920 6c 3b 0a 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72  l;.  }...  if( r
25930 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
25940 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
25950 73 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20  st u32 ovflSize 
25960 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
25970 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
25980 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
25990 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
259a0 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
259b0 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
259c0 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
259d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
259e0 6c 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  l]);..    /* If 
259f0 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76  the BtCursor.aOv
25a00 65 72 66 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74  erflow[] has not
25a10 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
25a20 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77   allocate it now
25a30 2e 0a 20 20 20 20 2a 2a 20 45 78 63 65 70 74 2c  ..    ** Except,
25a40 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65   do not allocate
25a50 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72   aOverflow[] for
25a60 20 65 4f 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a   eOp==2..    **.
25a70 20 20 20 20 2a 2a 20 54 68 65 20 61 4f 76 65 72      ** The aOver
25a80 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 69 73 20  flow[] array is 
25a90 73 69 7a 65 64 20 61 74 20 6f 6e 65 20 65 6e 74  sized at one ent
25aa0 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
25ab0 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 2a 2a  flow page.    **
25ac0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
25ad0 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67 65   chain. The page
25ae0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
25af0 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
25b00 67 65 20 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f  ge is.    ** sto
25b10 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
25b20 5b 30 5d 2c 20 65 74 63 2e 20 41 20 76 61 6c 75  [0], etc. A valu
25b30 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
25b40 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a  verflow[] array.
25b50 20 20 20 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f      ** means "no
25b60 74 20 79 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68  t yet known" (th
25b70 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
25b80 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
25b90 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
25ba0 21 3d 32 20 26 26 20 28 70 43 75 72 2d 3e 63 75  !=2 && (pCur->cu
25bb0 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
25bc0 6c 69 64 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20  lidOvfl)==0 ){. 
25bd0 20 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d       int nOvfl =
25be0 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61   (pCur->info.nPa
25bf0 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f  yload-pCur->info
25c00 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65  .nLocal+ovflSize
25c10 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20  -1)/ovflSize;.  
25c20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43      if( nOvfl>pC
25c30 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29  ur->nOvflAlloc )
25c40 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 2a  {.        Pgno *
25c50 61 4e 65 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71  aNew = (Pgno*)sq
25c60 6c 69 74 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20  lite3Realloc(.  
25c70 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
25c80 61 4f 76 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c  aOverflow, nOvfl
25c90 2a 32 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a  *2*sizeof(Pgno).
25ca0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
25cb0 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
25cc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
25cd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
25ce0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25cf0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e 4f          pCur->nO
25d00 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66 6c  vflAlloc = nOvfl
25d10 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  *2;.          pC
25d20 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
25d30 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  aNew;.        }.
25d40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
25d50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25d60 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
25d70 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  t(pCur->aOverflo
25d80 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a 65  w, 0, nOvfl*size
25d90 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20  of(Pgno));.     
25da0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
25db0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4f  s |= BTCF_ValidO
25dc0 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vfl;.      }.   
25dd0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
25de0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
25df0 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
25e00 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  een allocated an
25e10 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74  d the.    ** ent
25e20 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ry for the first
25e30 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c   required overfl
25e40 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  ow page is valid
25e50 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69  , skip.    ** di
25e60 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20  rectly to it..  
25e70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 43    */.    if( (pC
25e80 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
25e90 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d  TCF_ValidOvfl)!=
25ea0 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  0.     && pCur->
25eb0 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
25ec0 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20 29  /ovflSize].    )
25ed0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
25ee0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
25ef0 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
25f00 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
25f10 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
25f20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
25f30 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
25f40 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63  }..    for( ; rc
25f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
25f60 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65  mt>0 && nextPage
25f70 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20 20  ; iIdx++){..    
25f80 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
25f90 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
25fa0 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25fb0 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
25fc0 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
25fd0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
25fe0 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20 20  idOvfl)!=0 ){.  
25ff0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
26000 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26010 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  dx]==0.         
26020 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d 3e         || pCur->
26030 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d  aOverflow[iIdx]=
26040 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20 20  =nextPage.      
26050 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52            || COR
26060 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 20  RUPT_DB );.     
26070 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
26080 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
26090 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
260a0 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
260b0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
260c0 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
260d0 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
260e0 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
260f0 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
26100 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
26110 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
26120 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
26130 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
26140 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
26150 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
26160 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
26170 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
26180 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
26190 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
261a0 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
261b0 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
261c0 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
261d0 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
261e0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
261f0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
26200 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f 76  ote that the aOv
26210 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
26220 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
26230 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32 0a   because eOp!=2.
26240 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65 2e          ** here.
26250 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68 65    If eOp==2, the
26260 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64 20  n offset==0 and 
26270 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20 6e  this branch is n
26280 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20 20  ever taken..    
26290 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61      */.        a
262a0 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29 3b  ssert( eOp!=2 );
262b0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
262c0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
262d0 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  & BTCF_ValidOvfl
262e0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
262f0 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65 65  rt( pCur->pBtree
26300 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29 3b  ->db==pBt->db );
26310 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
26320 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26330 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  x+1] ){.        
26340 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75    nextPage = pCu
26350 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
26360 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  x+1];.        }e
26370 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
26380 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
26390 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67  age(pBt, nextPag
263a0 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29  e, 0, &nextPage)
263b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
263c0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
263d0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
263e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
263f0 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
26400 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
26410 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
26420 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
26430 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
26440 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
26450 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
26460 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
26470 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69  )..        */.#i
26480 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
26490 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
264a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
264b0 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64 69  _file *fd;.#endi
264c0 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 20  f.        int a 
264d0 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20 69  = amt;.        i
264e0 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
264f0 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
26500 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53 69        a = ovflSi
26510 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  ze - offset;.   
26520 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53       }..#ifdef S
26530 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45  QLITE_DIRECT_OVE
26540 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20  RFLOW_READ.     
26550 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68 65     /* If all the
26560 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74   following are t
26570 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a 0a  rue:.        **.
26580 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29 20          **   1) 
26590 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20 6f  this is a read o
265a0 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a 20  peration, and . 
265b0 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20 64         **   2) d
265c0 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
265d0 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20 6f  from the start o
265e0 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20  f this overflow 
265f0 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20 20  page, and.      
26600 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64 61    **   3) the da
26610 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d 62  tabase is file-b
26620 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20 20  acked, and.     
26630 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72 65     **   4) there
26640 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69 74   is no open writ
26650 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e-transaction, a
26660 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
26670 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  5) the database 
26680 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61 74  is not a WAL dat
26690 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 2a  abase,.        *
266a0 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61 20  *   6) all data 
266b0 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 73  from the page is
266c0 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20 20   being read..   
266d0 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74 20       **   7) at 
266e0 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68 61  least 4 bytes ha
266f0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
26700 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f 75  read into the ou
26710 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20 20  tput buffer .   
26720 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
26730 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61 6e  ** then data can
26740 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74 6c   be read directl
26750 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  y from the datab
26760 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74 68  ase file into th
26770 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75 74  e.        ** out
26780 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70 61  put buffer, bypa
26790 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d 63  ssing the page-c
267a0 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72 2e  ache altogether.
267b0 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20 20   This speeds.   
267c0 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64 69       ** up loadi
267d0 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64 73  ng large records
267e0 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79 20   that span many 
267f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a  overflow pages..
26800 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26810 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30 31     if( (eOp&0x01
26820 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
26830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31 29            /* (1)
26850 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26860 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20 20  offset==0       
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26890 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20     /* (2) */.   
268a0 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20 7c        && (bEnd |
268b0 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20 20  | a==ovflSize)  
268c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
268e0 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  6) */.         &
268f0 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
26900 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41 44  tion==TRANS_READ
26910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26920 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a 20       /* (4) */. 
26930 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20 3d          && (fd =
26940 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
26950 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 2d  e(pBt->pPager))-
26960 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f 2a  >pMethods     /*
26970 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (3) */.        
26980 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d   && pBt->pPage1-
26990 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78 30 31  >aData[19]==0x01
269a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269b0 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a 2f         /* (5) */
269c0 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70 42  .         && &pB
269d0 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61 72  uf[-4]>=pBufStar
269e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
269f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a00 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20 20  /* (7) */.      
26a10 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75    ){.          u
26a20 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20 20  8 aSave[4];.    
26a30 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74 65        u8 *aWrite
26a40 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20 20   = &pBuf[-4];.  
26a50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26a60 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61 72  aWrite>=pBufStar
26a70 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  t );            
26a80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a90 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20 20  hence (7) */.   
26aa0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 53         memcpy(aS
26ab0 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29 3b  ave, aWrite, 4);
26ac0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
26ad0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64  sqlite3OsRead(fd
26ae0 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20 28  , aWrite, a+4, (
26af0 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69 7a  i64)pBt->pageSiz
26b00 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29 3b  e*(nextPage-1));
26b10 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50  .          nextP
26b20 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
26b30 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
26b40 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65 2c    memcpy(aWrite,
26b50 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20 20   aSave, 4);.    
26b60 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
26b70 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  ..        {.    
26b80 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
26b90 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  bPage;.         
26ba0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
26bb0 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
26bc0 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44  r, nextPage, &pD
26bd0 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20 20  bPage,.         
26be0 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31 29       ((eOp&0x01)
26bf0 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54 5f  ==0 ? PAGER_GET_
26c00 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20 20  READONLY : 0).  
26c10 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
26c20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
26c30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26c40 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
26c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
26c60 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
26c70 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50             nextP
26c80 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61  age = get4byte(a
26c90 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20  Payload);.      
26ca0 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50        rc = copyP
26cb0 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64  ayload(&aPayload
26cc0 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66  [offset+4], pBuf
26cd0 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29 2c  , a, (eOp&0x01),
26ce0 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20   pDbPage);.     
26cf0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26d00 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
26d10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  );.            o
26d20 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20  ffset = 0;.     
26d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26d40 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  .        amt -= 
26d50 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66 20  a;.        pBuf 
26d60 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += a;.      }.  
26d70 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
26d80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26d90 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
26da0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
26db0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
26dc0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26dd0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
26de0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
26df0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
26e00 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
26e10 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
26e20 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72 65 64  l be transferred
26e30 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54   into pBuf[].  T
26e40 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62  he transfer.** b
26e50 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74  egins at "offset
26e60 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  "..**.** The cal
26e70 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65 20  ler must ensure 
26e80 74 68 61 74 20 70 43 75 72 20 69 73 20 70 6f 69  that pCur is poi
26e90 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c 69 64  nting to a valid
26ea0 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65 20 74   row.** in the t
26eb0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  able..**.** Retu
26ec0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
26ed0 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
26ee0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74  ror code if anyt
26ef0 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
26f00 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73  ng.  An error is
26f10 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66   returned if "of
26f20 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72  fset+amt" is lar
26f30 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20  ger than.** the 
26f40 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61  available payloa
26f50 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
26f60 33 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73  3BtreeKey(BtCurs
26f70 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
26f80 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
26f90 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 61 73  oid *pBuf){.  as
26fa0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
26fb0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
26fc0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26fd0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
26fe0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
26ff0 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  ( pCur->iPage>=0
27000 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
27010 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
27020 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
27030 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
27040 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
27050 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
27060 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75 72 6e  Cell );.  return
27070 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
27080 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Cur, offset, amt
27090 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
270a0 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  *)pBuf, 0);.}../
270b0 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
270c0 66 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  f the data assoc
270d0 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
270e0 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
270f0 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
27100 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
27110 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
27120 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
27130 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
27140 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
27150 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
27160 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
27170 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
27180 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
27190 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
271a0 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
271b0 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
271c0 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
271d0 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
271e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
271f0 42 74 72 65 65 44 61 74 61 28 42 74 43 75 72 73  BtreeData(BtCurs
27200 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66  or *pCur, u32 of
27210 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
27220 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e  oid *pBuf){.  in
27230 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53  t rc;..#ifndef S
27240 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
27250 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75 72 2d  LOB.  if ( pCur-
27260 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
27270 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  INVALID ){.    r
27280 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f  eturn SQLITE_ABO
27290 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  RT;.  }.#endif..
272a0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
272b0 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
272c0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
272d0 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
272e0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
272f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27300 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
27310 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
27320 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61  R_VALID );.    a
27330 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
27340 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
27350 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27360 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e] );.    assert
27370 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
27380 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
27390 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
273a0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
273b0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
273c0 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
273d0 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 30  et, amt, pBuf, 0
273e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
273f0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
27400 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27410 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
27420 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65 6e  tion from the en
27430 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a 2a  try that the .**
27440 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20   pCur cursor is 
27450 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
27460 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f 20  e pointer is to 
27470 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
27480 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20 69  .** the key if i
27490 6e 64 65 78 20 62 74 72 65 65 73 20 28 70 50 61  ndex btrees (pPa
274a0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29 20 61  ge->intKey==0) a
274b0 6e 64 20 69 73 20 74 68 65 20 64 61 74 61 20 66  nd is the data f
274c0 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74 72 65  or.** table btre
274d0 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
274e0 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d 62 65  y==1). The numbe
274f0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
27500 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79 2f 64  ailable.** key/d
27510 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 69  ata is written i
27520 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
27530 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
27540 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74 75 72  e value.** retur
27550 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ned will not be 
27560 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
27570 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27580 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
27590 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
275a0 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
275b0 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
275c0 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
275d0 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
275e0 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
275f0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
27600 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
27610 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
27620 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
27630 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
27640 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
27650 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
27660 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
27670 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
27680 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
27690 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
276a0 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
276b0 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
276c0 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a 2a   to reassemble.*
276d0 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
276e0 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
276f0 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
27700 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
27710 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
27720 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
27730 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
27740 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
27750 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
27760 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
27770 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
27780 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
27790 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
277a0 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
277b0 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
277c0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66 65 74   const void *fet
277d0 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  chPayload(.  BtC
277e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
277f0 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
27800 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
27810 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
27820 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20 20 20  u32 *pAmt       
27830 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
27840 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
27850 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72 65  lable bytes here
27860 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61 6d 74   */.){.  u32 amt
27870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27880 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61  !=0 && pCur->iPa
27890 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
278a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
278b0 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e]);.  assert( p
278c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
278d0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
278e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
278f0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
27900 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
27910 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
27920 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
27930 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
27940 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
27950 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27960 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27970 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
27980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27990 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30 20  r->info.nSize>0 
279a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
279b0 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
279c0 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  >pCur->apPage[pC
279d0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
279e0 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  a || CORRUPT_DB 
279f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27a00 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64  r->info.pPayload
27a10 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
27a20 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61 74  ur->iPage]->aDat
27a30 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f 44  aEnd ||CORRUPT_D
27a40 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e 74  B);.  amt = (int
27a50 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  )(pCur->apPage[p
27a60 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27a70 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69 6e  taEnd - pCur->in
27a80 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20 20  fo.pPayload);.  
27a90 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
27aa0 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74 20  Local<amt ) amt 
27ab0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
27ac0 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20 61  cal;.  *pAmt = a
27ad0 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f  mt;.  return (vo
27ae0 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  id*)pCur->info.p
27af0 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a  Payload;.}.../*.
27b00 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79  ** For the entry
27b10 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75   that cursor pCu
27b20 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72  r is point to, r
27b30 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79  eturn as.** many
27b40 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65   bytes of the ke
27b50 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65  y or data as are
27b60 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
27b70 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65  e local.** b-tre
27b80 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74  e page.  Write t
27b90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
27ba0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74  ilable bytes int
27bb0 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54  o *pAmt..**.** T
27bc0 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
27bd0 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c  ned is ephemeral
27be0 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20  .  The key/data 
27bf0 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62  may move.** or b
27c00 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74  e destroyed on t
27c10 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20  he next call to 
27c20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e  any Btree routin
27c30 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  e,.** including 
27c40 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72  calls from other
27c50 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74   threads against
27c60 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e   the same cache.
27c70 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74  .** Hence, a mut
27c80 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72  ex on the BtShar
27c90 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  ed should be hel
27ca0 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
27cb0 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  ng.** this routi
27cc0 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20  ne..**.** These 
27cd0 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64  routines is used
27ce0 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63   to get quick ac
27cf0 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20  cess to key and 
27d00 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63  data.** in the c
27d10 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
27d20 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   no overflow pag
27d30 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a  es are used..*/.
27d40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
27d50 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68  te3BtreeKeyFetch
27d60 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
27d70 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20 72   u32 *pAmt){.  r
27d80 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c 6f  eturn fetchPaylo
27d90 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b 0a  ad(pCur, pAmt);.
27da0 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
27db0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
27dc0 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
27dd0 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a  ur, u32 *pAmt){.
27de0 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61    return fetchPa
27df0 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
27e00 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  );.}.../*.** Mov
27e10 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
27e20 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64  n to a new child
27e30 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50   page.  The newP
27e40 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20  gno argument is 
27e50 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  the.** page numb
27e60 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
27e70 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
27e80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
27e90 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
27ea0 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 74  ITE_CORRUPT if t
27eb0 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20 66  he page-header f
27ec0 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a 2a  lags field of.**
27ed0 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70   the new child p
27ee0 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  age does not mat
27ef0 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69 65  ch the flags fie
27f00 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ld of the parent
27f10 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e 20   (i.e..** if an 
27f20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70 65  intkey page appe
27f30 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70 61  ars to be the pa
27f40 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69 6e  rent of a non-in
27f50 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a 2a  tkey page, or.**
27f60 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a 2f   vice-versa)..*/
27f70 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
27f80 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72  ToChild(BtCursor
27f90 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50   *pCur, u32 newP
27fa0 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65 64  gno){.  BtShared
27fb0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
27fc0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
27fd0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
27fe0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
27ff0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
28000 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
28010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28020 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
28030 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
28040 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
28050 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  age>=0 );.  if( 
28060 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54  pCur->iPage>=(BT
28070 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48  CURSOR_MAX_DEPTH
28080 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  -1) ){.    retur
28090 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
280a0 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75  _BKPT;.  }.  pCu
280b0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
280c0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
280d0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
280e0 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
280f0 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d  idOvfl);.  pCur-
28100 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72  >iPage++;.  pCur
28110 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
28120 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  age] = 0;.  retu
28130 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67  rn getAndInitPag
28140 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20  e(pBt, newPgno, 
28150 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  &pCur->apPage[pC
28160 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20  ur->iPage],.    
28170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28180 20 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e      pCur, pCur->
28190 63 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a  curPagerFlags);.
281a0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
281b0 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
281c0 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
281d0 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
281e0 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
281f0 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
28200 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
28210 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
28220 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
28230 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
28240 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
28250 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
28260 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
28270 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
28280 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
28290 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
282a0 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
282b0 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
282c0 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
282d0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
282e0 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
282f0 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
28300 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
28310 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
28320 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
28330 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
28340 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73  e conditions tes
28350 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20  ted below might 
28360 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20  not be true.    
28370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28380 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20          ** in a 
28390 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
283a0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49   */.  assert( iI
283b0 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx<=pParent->nCe
283c0 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78  ll );.  if( iIdx
283d0 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  ==pParent->nCell
283e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
283f0 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
28400 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
28410 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
28420 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c  =iChild );.  }el
28430 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
28440 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
28450 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29  l(pParent, iIdx)
28460 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
28470 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69  .}.#else.#  defi
28480 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  ne assertParentI
28490 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e  ndex(x,y,z) .#en
284a0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
284b0 74 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f  the cursor up to
284c0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
284d0 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64  ..**.** pCur->id
284e0 78 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  x is set to the 
284f0 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20  cell index that 
28500 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69  contains the poi
28510 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70  nter.** to the p
28520 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e  age we are comin
28530 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61  g from.  If we a
28540 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74  re coming from t
28550 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74  he.** right-most
28560 20 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e   child page then
28570 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65   pCur->idx is se
28580 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68  t to one more th
28590 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73  an.** the larges
285a0 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f  t cell index..*/
285b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76  .static void mov
285c0 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
285d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
285e0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
285f0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
28600 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28610 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
28620 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
28630 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
28640 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28650 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28660 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
28670 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
28680 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
28690 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
286a0 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
286b0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
286c0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
286d0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
286e0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65  ->pgno.  );.  te
286f0 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e 61 69  stcase( pCur->ai
28700 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
28710 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50 61 67  1] > pCur->apPag
28720 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  e[pCur->iPage-1]
28730 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75  ->nCell );.  pCu
28740 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
28750 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
28760 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61  ags &= ~(BTCF_Va
28770 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c  lidNKey|BTCF_Val
28780 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61  idOvfl);.  relea
28790 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
287a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
287b0 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f  >iPage--]);.}../
287c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
287d0 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
287e0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
287f0 66 20 69 74 73 20 62 2d 74 72 65 65 20 73 74 72  f its b-tree str
28800 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
28810 20 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 61   the table has a
28820 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28830 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ge, then the cur
28840 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  sor is moved to 
28850 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20  point.** to the 
28860 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
28870 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  e instead of the
28880 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
28890 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73 20 61  e. A table has a
288a0 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  .** virtual root
288b0 20 70 61 67 65 20 77 68 65 6e 20 74 68 65 20 61   page when the a
288c0 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20  ctual root page 
288d0 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
288e0 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67  s and a .** sing
288f0 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 54  le child page. T
28900 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
28910 70 65 6e 20 77 69 74 68 20 74 68 65 20 74 61 62  pen with the tab
28920 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
28930 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e 1..**.** If th
28940 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74 75  e b-tree structu
28950 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65  re is empty, the
28960 20 63 75 72 73 6f 72 20 73 74 61 74 65 20 69 73   cursor state is
28970 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53   set to .** CURS
28980 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65  OR_INVALID. Othe
28990 72 77 69 73 65 2c 20 74 68 65 20 63 75 72 73 6f  rwise, the curso
289a0 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  r is set to poin
289b0 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  t to the first.*
289c0 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f  * cell located o
289d0 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72 20 76  n the root (or v
289e0 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70 61 67  irtual root) pag
289f0 65 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  e and the cursor
28a00 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73 65 74   state.** is set
28a10 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   to CURSOR_VALID
28a20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
28a30 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
28a40 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 69   successfully, i
28a50 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65 64  t may be assumed
28a60 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70 61 67   that the.** pag
28a70 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73 20 69  e-header flags i
28a80 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
28a90 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d   [virtual] root-
28aa0 70 61 67 65 20 69 73 20 74 68 65 20 65 78 70 65  page is the expe
28ab0 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66  cted .** kind of
28ac0 20 62 2d 74 72 65 65 20 70 61 67 65 20 28 69 2e   b-tree page (i.
28ad0 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65 6e 69  e. if when openi
28ae0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 68  ng the cursor th
28af0 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74  e caller did not
28b00 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20 4b 65  .** specify a Ke
28b10 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
28b20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 69  the flags byte i
28b30 73 20 73 65 74 20 74 6f 20 30 78 30 35 20 6f 72  s set to 0x05 or
28b40 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61   0x0D,.** indica
28b50 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62 2d 74  ting a table b-t
28b60 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65 20 63  ree, or if the c
28b70 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63 69 66  aller did specif
28b80 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20  y a KeyInfo .** 
28b90 73 74 72 75 63 74 75 72 65 20 74 68 65 20 66 6c  structure the fl
28ba0 61 67 73 20 62 79 74 65 20 69 73 20 73 65 74 20  ags byte is set 
28bb0 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30 41 2c  to 0x02 or 0x0A,
28bc0 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69   indicating an i
28bd0 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e  ndex.** b-tree).
28be0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
28bf0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
28c00 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
28c10 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
28c20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
28c30 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  K;..  assert( cu
28c40 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
28c50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
28c60 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
28c70 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
28c80 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
28c90 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
28ca0 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
28cb0 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
28cc0 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
28cd0 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
28ce0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
28cf0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
28d00 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
28d10 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
28d20 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
28d30 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
28d40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28d50 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c 49 54  >skipNext!=SQLIT
28d60 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72 65  E_OK );.      re
28d70 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e  turn pCur->skipN
28d80 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ext;.    }.    s
28d90 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
28da0 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20  Cursor(pCur);.  
28db0 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69  }..  if( pCur->i
28dc0 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 77  Page>=0 ){.    w
28dd0 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50 61 67  hile( pCur->iPag
28de0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
28df0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
28e00 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30 20  pCur->iPage]!=0 
28e10 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
28e20 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72  PageNotNull(pCur
28e30 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
28e40 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20 7d 0a  Page--]);.    }.
28e50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 75 72    }else if( pCur
28e60 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 29 7b  ->pgnoRoot==0 ){
28e70 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
28e80 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
28e90 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ID;.    return S
28ea0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
28eb0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
28ec0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d 31 29  Cur->iPage==(-1)
28ed0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67 65 74   );.    rc = get
28ee0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43 75 72  AndInitPage(pCur
28ef0 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c 20 70  ->pBtree->pBt, p
28f00 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26  Cur->pgnoRoot, &
28f10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2c  pCur->apPage[0],
28f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28f30 20 20 20 20 20 20 20 20 20 30 2c 20 70 43 75 72           0, pCur
28f40 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
28f50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
28f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
28f70 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
28f80 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
28f90 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
28fa0 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
28fb0 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  >iPage = 0;.    
28fc0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
28fd0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  = pCur->apPage[0
28fe0 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d 0a 20  ]->intKey;.  }. 
28ff0 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61   pRoot = pCur->a
29000 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65  pPage[0];.  asse
29010 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
29020 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20  =pCur->pgnoRoot 
29030 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 75 72  );..  /* If pCur
29040 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20 6e 6f  ->pKeyInfo is no
29050 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65  t NULL, then the
29060 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f 70 65   caller that ope
29070 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f 72 0a  ned this cursor.
29080 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20 74 6f    ** expected to
29090 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e 20 69   open it on an i
290a0 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f 74 68  ndex b-tree. Oth
290b0 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65 79 49  erwise, if pKeyI
290c0 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55 4c 4c  nfo is.  ** NULL
290d0 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65 78 70  , the caller exp
290e0 65 63 74 73 20 61 20 74 61 62 6c 65 20 62 2d 74  ects a table b-t
290f0 72 65 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ree. If this is 
29100 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a 20 20  not the case,.  
29110 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  ** return an SQL
29120 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f  ITE_CORRUPT erro
29130 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61  r. .  **.  ** Ea
29140 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
29150 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 64  f SQLite assumed
29160 20 74 68 61 74 20 74 68 69 73 20 74 65 73 74 20   that this test 
29170 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c 0a 20  could not fail. 
29180 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f 74 20   ** if the root 
29190 70 61 67 65 20 77 61 73 20 61 6c 72 65 61 64 79  page was already
291a0 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74 68 69   loaded when thi
291b0 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  s function was c
291c0 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20 2a 2a  alled (i.e..  **
291d0 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   if pCur->iPage>
291e0 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20 69 73  =0). But this is
291f0 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65 20 64   not so if the d
29200 61 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75  atabase is corru
29210 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20 73 75  pted .  ** in su
29220 63 68 20 61 20 77 61 79 20 74 68 61 74 20 70 61  ch a way that pa
29230 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69 6e 6b  ge pRoot is link
29240 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f 6e 64  ed into a second
29250 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20 0a 20   b-tree table . 
29260 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72 65 65   ** (or the free
29270 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61 73 73  list).  */.  ass
29280 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b  ert( pRoot->intK
29290 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74 2d 3e  ey==1 || pRoot->
292a0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 69  intKey==0 );.  i
292b0 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  f( pRoot->isInit
292c0 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 70 4b  ==0 || (pCur->pK
292d0 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52 6f 6f  eyInfo==0)!=pRoo
292e0 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  t->intKey ){.   
292f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
29300 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
29310 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ..  pCur->aiIdx[
29320 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  0] = 0;.  pCur->
29330 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
29340 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
29350 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73   &= ~(BTCF_AtLas
29360 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  t|BTCF_ValidNKey
29370 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
29380 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  ;..  if( pRoot->
29390 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70  nCell>0 ){.    p
293a0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
293b0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65  RSOR_VALID;.  }e
293c0 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e  lse if( !pRoot->
293d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
293e0 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66   subpage;.    if
293f0 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31  ( pRoot->pgno!=1
29400 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29410 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29420 20 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74     subpage = get
29430 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44  4byte(&pRoot->aD
29440 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66  ata[pRoot->hdrOf
29450 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43  fset+8]);.    pC
29460 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
29470 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
29480 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29490 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
294a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
294b0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
294c0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a  OR_INVALID;.  }.
294d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
294e0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
294f0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
29500 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
29510 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29520 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
29530 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
29540 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
29550 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
29560 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
29570 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
29580 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
29590 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
295a0 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
295b0 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
295c0 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
295d0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
295e0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
295f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
29600 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
29610 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29620 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29630 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29640 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
29650 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
29660 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
29670 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
29680 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29690 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
296a0 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
296b0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
296c0 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
296d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
296e0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
296f0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
29700 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29710 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
29720 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29730 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
29740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29750 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
29760 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
29770 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
29780 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
29790 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
297a0 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
297b0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
297c0 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
297d0 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
297e0 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
297f0 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
29800 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
29810 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
29820 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
29830 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
29840 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
29850 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
29860 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
29870 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
29880 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
29890 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
298a0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
298b0 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
298c0 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
298d0 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
298e0 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
298f0 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29900 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
29910 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
29920 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
29930 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
29940 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
29950 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
29960 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
29970 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
29980 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29990 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
299a0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
299b0 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50 61 67  .  while( !(pPag
299c0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
299d0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
299e0 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
299f0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
29a00 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
29a10 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
29a20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
29a30 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
29a40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20  Page->nCell;.   
29a50 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
29a60 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
29a70 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
29a80 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75  rn rc;.  }.  pCu
29a90 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29aa0 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
29ab0 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74  Cell-1;.  assert
29ac0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69  ( pCur->info.nSi
29ad0 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ze==0 );.  asser
29ae0 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
29af0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e  gs & BTCF_ValidN
29b00 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  Key)==0 );.  ret
29b10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
29b20 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
29b30 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73  rsor to the firs
29b40 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
29b50 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
29b60 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
29b70 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
29b80 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
29b90 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
29ba0 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
29bb0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
29bc0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
29bd0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
29be0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29bf0 65 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20  eFirst(BtCursor 
29c00 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
29c10 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
29c20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29c30 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29c40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29c50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29c60 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
29c70 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
29c80 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
29c90 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
29ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29cb0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29cc0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
29cd0 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
29ce0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
29cf0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
29d00 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
29d10 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
29d20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
29d30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d40 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
29d50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
29d60 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  e]->nCell>0 );. 
29d70 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
29d80 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
29d90 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
29da0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
29db0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f  urn rc;.}../* Mo
29dc0 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ve the cursor to
29dd0 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
29de0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
29df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
29e00 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
29e10 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
29e20 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
29e30 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
29e40 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
29e50 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
29e60 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
29e70 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
29e80 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42 74  ite3BtreeLast(Bt
29e90 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29ea0 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29eb0 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20  rc;. .  assert( 
29ec0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29ed0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
29ee0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
29ef0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
29f00 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
29f10 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
29f20 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79  e cursor already
29f30 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c   points to the l
29f40 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20  ast entry, this 
29f50 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  is a no-op. */. 
29f60 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49   if( CURSOR_VALI
29f70 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
29f80 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
29f90 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74  gs & BTCF_AtLast
29fa0 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )!=0 ){.#ifdef S
29fb0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
29fc0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
29fd0 72 76 65 73 20 74 6f 20 61 73 73 65 72 74 28 29  rves to assert()
29fe0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
29ff0 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69   really does poi
2a000 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  nt .    ** to th
2a010 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2a020 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20  the b-tree. */. 
2a030 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66     int ii;.    f
2a040 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72  or(ii=0; ii<pCur
2a050 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a  ->iPage; ii++){.
2a060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2a070 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70  ur->aiIdx[ii]==p
2a080 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d  Cur->apPage[ii]-
2a090 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a  >nCell );.    }.
2a0a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a0b0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2a0c0 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61  age]==pCur->apPa
2a0d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a0e0 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20  >nCell-1 );.    
2a0f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2a100 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a110 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69  ]->leaf );.#endi
2a120 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
2a130 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72  ITE_OK;.  }..  r
2a140 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
2a150 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
2a160 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2a170 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
2a180 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2a190 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
2a1a0 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t( pCur->pgnoRoo
2a1b0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70  t==0 || pCur->ap
2a1c0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a1d0 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  ]->nCell==0 );. 
2a1e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
2a1f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a200 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2a210 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2a220 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  LID );.      *pR
2a230 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
2a240 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f   = moveToRightmo
2a250 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  st(pCur);.      
2a260 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2a270 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  K ){.        pCu
2a280 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  r->curFlags |= B
2a290 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20  TCF_AtLast;.    
2a2a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a2b0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2a2c0 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b  &= ~BTCF_AtLast;
2a2d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20  .      }.   .   
2a2e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2a2f0 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
2a300 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
2a310 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61  t it points to a
2a320 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65  n entry near the
2a330 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69   key .** specifi
2a340 65 64 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72  ed by pIdxKey or
2a350 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72   intKey.   Retur
2a360 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f 64 65  n a success code
2a370 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b  ..**.** For INTK
2a380 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69  EY tables, the i
2a390 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20  ntKey parameter 
2a3a0 69 73 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65  is used.  pIdxKe
2a3b0 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55  y .** must be NU
2a3c0 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74  LL.  For index t
2a3d0 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69  ables, pIdxKey i
2a3e0 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65  s used and intKe
2a3f0 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e  y.** is ignored.
2a400 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61  .**.** If an exa
2a410 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20  ct match is not 
2a420 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20  found, then the 
2a430 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73  cursor is always
2a440 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e  .** left pointin
2a450 67 20 61 74 20 61 20 6c 65 61 66 20 70 61 67 65  g at a leaf page
2a460 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c   which would hol
2a470 64 20 74 68 65 20 65 6e 74 72 79 20 69 66 20 69  d the entry if i
2a480 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e  t.** were presen
2a490 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d  t.  The cursor m
2a4a0 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  ight point to an
2a4b0 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65   entry that come
2a4c0 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61  s.** before or a
2a4d0 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a  fter the key..**
2a4e0 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69  .** An integer i
2a4f0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a  s written into *
2a500 70 52 65 73 20 77 68 69 63 68 20 69 73 20 74 68  pRes which is th
2a510 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63  e result of.** c
2a520 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79  omparing the key
2a530 20 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20   with the entry 
2a540 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 75 72  to which the cur
2a550 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74  sor is .** point
2a560 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ing.  The meanin
2a570 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  g of the integer
2a580 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a   written into.**
2a590 20 2a 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c   *pRes is as fol
2a5a0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
2a5b0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
2a5c0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
2a5d0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2a5e0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
2a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
2a600 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e   smaller than in
2a610 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20  tKey/pIdxKey or 
2a620 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
2a630 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20  empty.**        
2a640 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68            and th
2a650 65 20 63 75 72 73 6f 72 20 69 73 20 74 68 65 72  e cursor is ther
2a660 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74  efore left point
2a670 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   to nothing..**.
2a680 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20  **     *pRes==0 
2a690 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2a6a0 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2a6b0 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2a6c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2a6d0 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74       exactly mat
2a6e0 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78  ches intKey/pIdx
2a6f0 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  Key..**.**     *
2a700 70 52 65 73 3e 30 20 20 20 20 20 20 54 68 65 20  pRes>0      The 
2a710 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2a720 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2a730 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2a740 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20               is 
2a750 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b  larger than intK
2a760 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a  ey/pIdxKey..**.*
2a770 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c  * For index tabl
2a780 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d  es, the pIdxKey-
2a790 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73  >eqSeen field is
2a7a0 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
2a7b0 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20  re.** exists an 
2a7c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2a7d0 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c 79 20  le that exactly 
2a7e0 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e  matches pIdxKey.
2a7f0 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
2a800 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61  3BtreeMovetoUnpa
2a810 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72  cked(.  BtCursor
2a820 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20 20   *pCur,         
2a830 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
2a840 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
2a850 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
2a860 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61  pIdxKey, /* Unpa
2a870 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a  cked index key *
2a880 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20  /.  i64 intKey, 
2a890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a8a0 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f  The table key */
2a8b0 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74  .  int biasRight
2a8c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ,           /* I
2a8d0 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68 65  f true, bias the
2a8e0 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68   search to the h
2a8f0 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74  igh end */.  int
2a900 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20   *pRes          
2a910 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
2a920 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
2a930 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
2a940 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61  c;.  RecordCompa
2a950 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72  re xRecordCompar
2a960 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2a970 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2a980 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a990 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a9a0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2a9b0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2a9c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2a9d0 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  s );.  assert( (
2a9e0 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43  pIdxKey==0)==(pC
2a9f0 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
2aa00 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
2aa10 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
2aa20 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74  dy positioned at
2aa30 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72   the point we ar
2aa40 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f  e trying.  ** to
2aa50 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a   move to, then j
2aa60 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f  ust return witho
2aa70 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72  ut doing any wor
2aa80 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d  k */.  if( pCur-
2aa90 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2aaa0 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d 3e  VALID && (pCur->
2aab0 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
2aac0 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20  ValidNKey)!=0.  
2aad0 20 26 26 20 70 43 75 72 2d 3e 63 75 72 49 6e 74   && pCur->curInt
2aae0 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66  Key .  ){.    if
2aaf0 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  ( pCur->info.nKe
2ab00 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  y==intKey ){.   
2ab10 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2ab20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ab30 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2ab40 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  if( (pCur->curFl
2ab50 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61 73  ags & BTCF_AtLas
2ab60 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  t)!=0 && pCur->i
2ab70 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79 20  nfo.nKey<intKey 
2ab80 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2ab90 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
2aba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2abb0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 49   }.  }..  if( pI
2abc0 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52 65  dxKey ){.    xRe
2abd0 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73 71  cordCompare = sq
2abe0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
2abf0 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a 20  pare(pIdxKey);. 
2ac00 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72 43     pIdxKey->errC
2ac10 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73 73  ode = 0;.    ass
2ac20 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64 65  ert( pIdxKey->de
2ac30 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20 20  fault_rc==1 .   
2ac40 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65 79        || pIdxKey
2ac50 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30 20  ->default_rc==0 
2ac60 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64  .         || pId
2ac70 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2ac80 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d 65  ==-1.    );.  }e
2ac90 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72 64  lse{.    xRecord
2aca0 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a 20  Compare = 0; /* 
2acb0 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 74  All keys are int
2acc0 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20  egers */.  }..  
2acd0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  rc = moveToRoot(
2ace0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
2acf0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2ad00 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2ad10 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2ad20 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2ad30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29  e[pCur->iPage] )
2ad40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ad50 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c  ->pgnoRoot==0 ||
2ad60 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2ad70 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49 6e  ur->iPage]->isIn
2ad80 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
2ad90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ada0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20  RSOR_INVALID || 
2adb0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2adc0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
2add0 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  >0 );.  if( pCur
2ade0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2adf0 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
2ae00 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
2ae10 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2ae20 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2ae30 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2ae40 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
2ae50 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2ae60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
2ae70 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2ae80 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3d  Page[0]->intKey=
2ae90 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79  =pCur->curIntKey
2aea0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2aeb0 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c  ur->curIntKey ||
2aec0 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f   pIdxKey );.  fo
2aed0 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c  r(;;){.    int l
2aee0 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63 3b  wr, upr, idx, c;
2aef0 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67  .    Pgno chldPg
2af00 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
2af10 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2af20 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2af30 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b  ;.    u8 *pCell;
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
2af60 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
2af70 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a 2f  cell in pPage */
2af80 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e  ..    /* pPage->
2af90 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67 72  nCell must be gr
2afa0 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2e  eater than zero.
2afb0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2afc0 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a  root-page.    **
2afd0 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75 6c   the cursor woul
2afe0 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56 41  d have been INVA
2aff0 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74 68  LID above and th
2b000 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70 0a  is for(;;) loop.
2b010 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e 20      ** not run. 
2b020 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
2b030 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74 68  he root-page, th
2b040 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68 69  en the moveToChi
2b050 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 20  ld() routine.   
2b060 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20 61   ** would have a
2b070 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64 20  lready detected 
2b080 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 53  db corruption. S
2b090 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65 20  imilarly, pPage 
2b0a0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 74  must.    ** be t
2b0b0 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28 69  he right kind (i
2b0c0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20 6f  ndex or table) o
2b0d0 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 4f  f b-tree page. O
2b0e0 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a 20  therwise.    ** 
2b0f0 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29 20  a moveToChild() 
2b100 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29 20  or moveToRoot() 
2b110 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65 20  call would have 
2b120 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70 74  detected corrupt
2b130 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  ion.  */.    ass
2b140 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ert( pPage->nCel
2b150 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  l>0 );.    asser
2b160 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2b170 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20 29  ==(pIdxKey==0) )
2b180 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  ;.    lwr = 0;. 
2b190 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
2b1a0 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73 73  nCell-1;.    ass
2b1b0 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d 3d  ert( biasRight==
2b1c0 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d 3d  0 || biasRight==
2b1d0 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20 75  1 );.    idx = u
2b1e0 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68 74  pr>>(1-biasRight
2b1f0 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61 73  ); /* idx = bias
2b200 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28 6c  Right ? upr : (l
2b210 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20 20  wr+upr)/2; */.  
2b220 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2b230 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2b240 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20 78  6)idx;.    if( x
2b250 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d 30  RecordCompare==0
2b260 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b   ){.      for(;;
2b270 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6e  ){.        i64 n
2b280 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2b290 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2b2a0 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c 20  lPastPtr(pPage, 
2b2b0 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66  idx);.        if
2b2c0 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c  ( pPage->intKeyL
2b2d0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
2b2e0 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d 20   while( 0x80 <= 
2b2f0 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20 20  *(pCell++) ){.  
2b300 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2b310 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61 74  ell>=pPage->aDat
2b320 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53 51  aEnd ) return SQ
2b330 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
2b340 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  T;.          }. 
2b350 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b360 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c   getVarint(pCell
2b370 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65  , (u64*)&nCellKe
2b380 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
2b390 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79 20  nCellKey<intKey 
2b3a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72  ){.          lwr
2b3b0 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20   = idx+1;.      
2b3c0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
2b3d0 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61 6b  ){ c = -1; break
2b3e0 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ; }.        }els
2b3f0 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e 69  e if( nCellKey>i
2b400 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b410 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2b420 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2b430 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31 3b  r>upr ){ c = +1;
2b440 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2b450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b460 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
2b470 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a 20  Key==intKey );. 
2b480 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63           pCur->c
2b490 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f  urFlags |= BTCF_
2b4a0 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20 20  ValidNKey;.     
2b4b0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
2b4c0 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
2b4d0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b4e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2b4f0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2b500 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2b510 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2b520 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20            lwr = 
2b530 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20  idx;.           
2b540 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65 78   goto moveto_nex
2b550 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20 20  t_layer;.       
2b560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b570 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
2b580 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2b590 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2b5a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2b5b0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2b5c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b5d0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2b5e0 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b  t( lwr+upr>=0 );
2b5f0 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28  .        idx = (
2b600 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a  lwr+upr)>>1;  /*
2b610 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2b620 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  /2; */.      }. 
2b630 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b640 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2b650 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20   int nCell;  /* 
2b660 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c  Size of the pCel
2b670 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20  l cell in bytes 
2b680 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  */.        pCell
2b690 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50   = findCellPastP
2b6a0 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a  tr(pPage, idx);.
2b6b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
2b6c0 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  maximum supporte
2b6d0 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36  d page-size is 6
2b6e0 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69 73  5536 bytes. This
2b6f0 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20   means that.    
2b700 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d      ** the maxim
2b710 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63  um number of rec
2b720 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65 64  ord bytes stored
2b730 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54   on an index B-T
2b740 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70  ree.        ** p
2b750 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  age is less than
2b760 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e 64   16384 bytes and
2b770 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20 61   may be stored a
2b780 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20  s a 2-byte.     
2b790 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68     ** varint. Th
2b7a0 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
2b7b0 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70  s used to attemp
2b7c0 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69  t to avoid parsi
2b7d0 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ng .        ** t
2b7e0 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62  he entire cell b
2b7f0 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74  y checking for t
2b800 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20 74  he cases where t
2b810 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20  he record is .  
2b820 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20        ** stored 
2b830 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20  entirely within 
2b840 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65 20  the b-tree page 
2b850 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68  by inspecting th
2b860 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20 20  e first .       
2b870 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74   ** 2 bytes of t
2b880 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20  he cell..       
2b890 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c   */.        nCel
2b8a0 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20  l = pCell[0];.  
2b8b0 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c        if( nCell<
2b8c0 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65  =pPage->max1byte
2b8d0 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20  Payload ){.     
2b8e0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
2b8f0 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65 20  nch runs if the 
2b900 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c  record-size fiel
2b910 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73  d of the cell is
2b920 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20   a.          ** 
2b930 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69  single byte vari
2b940 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72  nt and the recor
2b950 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20  d fits entirely 
2b960 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20  on the main.    
2b970 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20        ** b-tree 
2b980 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
2b990 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 43      testcase( pC
2b9a0 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61  ell+nCell+1==pPa
2b9b0 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a  ge->aDataEnd );.
2b9c0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2b9d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2b9e0 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c  ll, (void*)&pCel
2b9f0 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a  l[1], pIdxKey);.
2ba00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2ba10 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30  ( !(pCell[1] & 0
2ba20 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20 20  x80) .          
2ba30 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43  && (nCell = ((nC
2ba40 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20  ell&0x7f)<<7) + 
2ba50 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65  pCell[1])<=pPage
2ba60 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20  ->maxLocal.     
2ba70 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
2ba80 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69  /* The record-si
2ba90 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32 20  ze field is a 2 
2baa0 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20  byte varint and 
2bab0 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20  the record .    
2bac0 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e        ** fits en
2bad0 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61  tirely on the ma
2bae0 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  in b-tree page. 
2baf0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2bb00 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43  stcase( pCell+nC
2bb10 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44  ell+2==pPage->aD
2bb20 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  ataEnd );.      
2bb30 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43      c = xRecordC
2bb40 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76  ompare(nCell, (v
2bb50 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20  oid*)&pCell[2], 
2bb60 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20  pIdxKey);.      
2bb70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2bb80 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64     /* The record
2bb90 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f   flows over onto
2bba0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
2bbb0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a  rflow pages. In.
2bbc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
2bbd0 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65  s case the whole
2bbe0 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62   cell needs to b
2bbf0 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66 66  e parsed, a buff
2bc00 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20  er allocated.   
2bc10 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63         ** and ac
2bc20 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73  cessPayload() us
2bc30 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  ed to retrieve t
2bc40 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  he record into t
2bc50 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
2bc60 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56 64  buffer before Vd
2bc70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
2bc80 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e  ) can be called.
2bc90 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20   .          **. 
2bca0 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74           ** If t
2bcb0 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2bcc0 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72  rupt, the xRecor
2bcd0 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65  dCompare routine
2bce0 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20 20   may read.      
2bcf0 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f      ** up to two
2bd00 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74 68   varints past th
2bd10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2bd20 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38  fer. An extra 18
2bd30 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62   .          ** b
2bd40 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20  ytes of padding 
2bd50 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20  is allocated at 
2bd60 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2bd70 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20  uffer in.       
2bd80 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20     ** case this 
2bd90 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20  happens.  */.   
2bda0 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65         void *pCe
2bdb0 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  llKey;.         
2bdc0 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c   u8 * const pCel
2bdd0 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20  lBody = pCell - 
2bde0 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
2bdf0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
2be00 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
2be10 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64  (pPage, pCellBod
2be20 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  y, &pCur->info);
2be30 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  .          nCell
2be40 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
2be50 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20  fo.nKey;.       
2be60 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2be70 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75  ll<0 );   /* Tru
2be80 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73  e if key size is
2be90 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f   2^32 or more */
2bea0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2beb0 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ase( nCell==0 );
2bec0 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79    /* Invalid key
2bed0 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38   size:  0x80 0x8
2bee0 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20  0 0x00 */.      
2bef0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2bf00 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e  ell==1 );  /* In
2bf10 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20  valid key size: 
2bf20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31 20   0x80 0x80 0x01 
2bf30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2bf40 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20  tcase( nCell==2 
2bf50 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c  );  /* Minimum l
2bf60 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73  egal index key s
2bf70 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ize */.         
2bf80 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a   if( nCell<2 ){.
2bf90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2bfa0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2bfb0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
2bfc0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2bfd0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2bfe0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c  }.          pCel
2bff0 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61  lKey = sqlite3Ma
2c000 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29  lloc( nCell+18 )
2c010 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c020 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
2c030 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2c040 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2c050 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2c060 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2c070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c080 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c090 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2c0a0 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20  u16)idx;.       
2c0b0 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
2c0c0 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 6e  yload(pCur, 0, n
2c0d0 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64 20  Cell, (unsigned 
2c0e0 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c 20  char*)pCellKey, 
2c0f0 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  2);.          if
2c100 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2c110 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c120 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  (pCellKey);.    
2c130 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
2c140 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
2c150 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c160 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2c170 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65 6c  pare(nCell, pCel
2c180 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a  lKey, pIdxKey);.
2c190 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2c1a0 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29  3_free(pCellKey)
2c1b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c1c0 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
2c1d0 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b 65           (pIdxKe
2c1e0 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  y->errCode!=SQLI
2c1f0 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63 3d  TE_CORRUPT || c=
2c200 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26 20  =0).         && 
2c210 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2c220 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  e!=SQLITE_NOMEM 
2c230 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  || pCur->pBtree-
2c240 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
2c250 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  d).        );.  
2c260 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
2c270 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d  .          lwr =
2c280 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20 20   idx+1;.        
2c290 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29 7b  }else if( c>0 ){
2c2a0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2c2b0 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2c2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2c2d0 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29 3b   assert( c==0 );
2c2e0 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65 73  .          *pRes
2c2f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2c300 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c310 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2c320 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c330 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2c340 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
2c350 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29 20  xKey->errCode ) 
2c360 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2c370 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 67  UPT;.          g
2c380 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c390 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  h;.        }.   
2c3a0 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2c3b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2c3c0 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75 70    assert( lwr+up
2c3d0 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  r>=0 );.        
2c3e0 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 3e  idx = (lwr+upr)>
2c3f0 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28 6c  >1;  /* idx = (l
2c400 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20 20  wr+upr)/2 */.   
2c410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
2c420 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b  ssert( lwr==upr+
2c430 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e 74  1 || (pPage->int
2c440 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
2c450 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73 65  eaf) );.    asse
2c460 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  rt( pPage->isIni
2c470 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  t );.    if( pPa
2c480 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2c490 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2c4a0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c4b0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
2c4c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2c4d0 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43 75  ell );.      pCu
2c4e0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c4f0 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c500 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2c510 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
2c520 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
2c530 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c540 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f 5f  h;.    }.moveto_
2c550 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20 20  next_layer:.    
2c560 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e  if( lwr>=pPage->
2c570 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63  nCell ){.      c
2c580 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65  hldPg = get4byte
2c590 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
2c5a0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
2c5b0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
2c5c0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2c5d0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
2c5e0 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20  (pPage, lwr));. 
2c5f0 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61     }.    pCur->a
2c600 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2c610 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20  ] = (u16)lwr;.  
2c620 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2c630 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
2c640 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62  ;.    if( rc ) b
2c650 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  reak;.  }.moveto
2c660 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72 2d  _finish:.  pCur-
2c670 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
2c680 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
2c690 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69  s &= ~(BTCF_Vali
2c6a0 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64  dNKey|BTCF_Valid
2c6b0 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  Ovfl);.  return 
2c6c0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
2c6d0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
2c6e0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
2c6f0 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2c700 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65  try of the table
2c710 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c  ..**.** TRUE wil
2c720 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66  l be returned af
2c730 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
2c740 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29  lite3BtreeNext()
2c750 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74   moves.** past t
2c760 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2c770 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71   the table or sq
2c780 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29  lite3BtreePrev()
2c790 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74   moves past.** t
2c7a0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20  he first entry. 
2c7b0 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65   TRUE is also re
2c7c0 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61  turned if the ta
2c7d0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
2c7e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2c7f0 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70  eEof(BtCursor *p
2c800 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a  Cur){.  /* TODO:
2c810 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72   What if the cur
2c820 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52  sor is in CURSOR
2c830 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74  _REQUIRESEEK but
2c840 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69   all table entri
2c850 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65  es.  ** have bee
2c860 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20  n deleted? This 
2c870 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f  API will need to
2c880 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72   change to retur
2c890 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a  n an error code.
2c8a0 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20    ** as well as 
2c8b0 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75  the boolean resu
2c8c0 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20  lt value..  */. 
2c8d0 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f   return (CURSOR_
2c8e0 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74  VALID!=pCur->eSt
2c8f0 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ate);.}../*.** A
2c900 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
2c910 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
2c920 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2c930 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2c940 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2c950 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2c960 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2c970 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2c980 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
2c990 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2c9a0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2c9b0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2c9c0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2c9d0 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2c9e0 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2c9f0 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2ca00 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72  eNext().  That r
2ca10 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69  outine is optimi
2ca20 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63  zed.** for the c
2ca30 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65  ommon case of me
2ca40 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e  rely incrementin
2ca50 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74  g the cell count
2ca60 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64  er BtCursor.aiId
2ca70 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74  x.** to the next
2ca80 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2ca90 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2caa0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65  (slower) btreeNe
2cab0 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72  xt() helper.** r
2cac0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
2cad0 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65   when it is nece
2cae0 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f  ssary to move to
2caf0 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67   a different pag
2cb00 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f  e or.** to resto
2cb10 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a  re the cursor..*
2cb20 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67  *.** The calling
2cb30 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73   function will s
2cb40 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72  et *pRes to 0 or
2cb50 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c   1.  The initial
2cb60 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20   *pRes value.** 
2cb70 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65  will be 1 if the
2cb80 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74   cursor being st
2cb90 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64  epped correspond
2cba0 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65  s to an SQL inde
2cbb0 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73  x and.** if this
2cbc0 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68   routine could h
2cbd0 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64  ave been skipped
2cbe0 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64   if that SQL ind
2cbf0 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61  ex had been.** a
2cc00 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20   unique index.  
2cc10 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61  Otherwise the ca
2cc20 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73  ller will have s
2cc30 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f  et *pRes to zero
2cc40 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65  ..** Zero is the
2cc50 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68   common case. Th
2cc60 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2cc70 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74  tation is free t
2cc80 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69  o use the.** ini
2cc90 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2cca0 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d   as a hint to im
2ccb0 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63  prove performanc
2ccc0 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65  e, but the curre
2ccd0 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72  nt.** SQLite btr
2cce0 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ee implementatio
2ccf0 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74  n does not. (Not
2cd00 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62  e that the comdb
2cd10 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65  2 btree.** imple
2cd20 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75  mentation does u
2cd30 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f  se this hint, ho
2cd40 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69  wever.).*/.stati
2cd50 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
2cd60 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28  E int btreeNext(
2cd70 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2cd80 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2cd90 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
2cda0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2cdb0 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
2cdc0 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2cdd0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2cde0 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2cdf0 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2ce00 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2ce10 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2ce20 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69   *pRes==0 );.  i
2ce30 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  f( pCur->eState!
2ce40 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
2ce50 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43  .    assert( (pC
2ce60 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42  ur->curFlags & B
2ce70 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d  TCF_ValidOvfl)==
2ce80 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  0 );.    rc = re
2ce90 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2cea0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
2ceb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2cec0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2ced0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
2cee0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2cef0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2cf00 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2cf10 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   1;.      return
2cf20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2cf30 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
2cf40 73 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  skipNext ){.    
2cf50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2cf60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
2cf70 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
2cf80 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49  tate==CURSOR_SKI
2cf90 50 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70  PNEXT );.      p
2cfa0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
2cfb0 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20  RSOR_VALID;.    
2cfc0 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
2cfd0 4e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  Next>0 ){.      
2cfe0 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74    pCur->skipNext
2cff0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
2d000 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
2d020 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30  ur->skipNext = 0
2d030 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
2d040 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
2d050 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2d060 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72  ;.  idx = ++pCur
2d070 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d080 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
2d090 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d0a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  ..  /* If the da
2d0b0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63  tabase file is c
2d0c0 6f 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f  orrupt, it is po
2d0d0 73 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76  ssible for the v
2d0e0 61 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a  alue of idx .  *
2d0f0 2a 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20  * to be invalid 
2d100 68 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f  here. This can o
2d110 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73  nly occur if a s
2d120 65 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64  econd cursor mod
2d130 69 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70  ifies.  ** the p
2d140 61 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72  age while cursor
2d150 20 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67   pCur is holding
2d160 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
2d170 69 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20  it. Which can.  
2d180 2a 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69  ** only happen i
2d190 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2d1a0 73 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63  s corrupt in suc
2d1b0 68 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69  h a way as to li
2d1c0 6e 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65  nk the.  ** page
2d1d0 20 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20   into more than 
2d1e0 6f 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  one b-tree struc
2d1f0 74 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63  ture. */.  testc
2d200 61 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e  ase( idx>pPage->
2d210 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20  nCell );..  if( 
2d220 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
2d230 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
2d240 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d250 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2d260 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
2d270 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2d280 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2d290 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
2d2a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2d2b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d  ;.      return m
2d2c0 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d2d0 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  ur);.    }.    d
2d2e0 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  o{.      if( pCu
2d2f0 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20  r->iPage==0 ){. 
2d300 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
2d310 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  ;.        pCur->
2d320 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2d330 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20  INVALID;.       
2d340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d350 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
2d360 20 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43   moveToParent(pC
2d370 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  ur);.      pPage
2d380 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d390 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d3a0 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e    }while( pCur->
2d3b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2d3c0 65 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  e]>=pPage->nCell
2d3d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
2d3e0 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
2d3f0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
2d400 33 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c  3BtreeNext(pCur,
2d410 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73   pRes);.    }els
2d420 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
2d430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2d440 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2d450 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2d460 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2d480 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2d490 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2d4a0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2d4b0 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70  Next(BtCursor *p
2d4c0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
2d4d0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2d4e0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
2d4f0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2d500 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d510 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
2d520 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2d530 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a   || *pRes==1 );.
2d540 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d550 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70  skipNext==0 || p
2d560 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
2d570 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70  SOR_VALID );.  p
2d580 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
2d590 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2d5a0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2d5b0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2d5c0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52  alidOvfl);.  *pR
2d5d0 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  es = 0;.  if( pC
2d5e0 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d5f0 4f 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72  OR_VALID ) retur
2d600 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72  n btreeNext(pCur
2d610 2c 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65  , pRes);.  pPage
2d620 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2d630 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2d640 69 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49  if( (++pCur->aiI
2d650 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
2d660 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
2d670 7b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  {.    pCur->aiId
2d680 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2d690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72  ;.    return btr
2d6a0 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65  eeNext(pCur, pRe
2d6b0 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  s);.  }.  if( pP
2d6c0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2d6d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d6e0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
2d6f0 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2d700 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2d710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74  .}../*.** Step t
2d720 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2d730 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65   back to the pre
2d740 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74  vious entry in t
2d750 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2d760 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2d770 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2d780 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2d790 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2d7a0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
2d7b0 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  irst entry in th
2d7c0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
2d7d0 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  e.** this routin
2d7e0 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68  e was called, th
2d7f0 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a  en set *pRes=1..
2d800 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65  **.** The main e
2d810 6e 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71  ntry point is sq
2d820 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f  lite3BtreePrevio
2d830 75 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74  us().  That rout
2d840 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  ine is optimized
2d850 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  .** for the comm
2d860 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c  on case of merel
2d870 79 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74  y decrementing t
2d880 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20  he cell counter 
2d890 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a  BtCursor.aiIdx.*
2d8a0 2a 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  * to the previou
2d8b0 73 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  s cell on the cu
2d8c0 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2d8d0 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50   (slower) btreeP
2d8e0 72 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c  revious().** hel
2d8f0 70 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63  per routine is c
2d900 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73  alled when it is
2d910 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f   necessary to mo
2d920 76 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ve to a differen
2d930 74 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20  t page.** or to 
2d940 72 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  restore the curs
2d950 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2d960 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77  lling function w
2d970 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ill set *pRes to
2d980 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e   0 or 1.  The in
2d990 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2d9a0 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69  e.** will be 1 i
2d9b0 66 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69  f the cursor bei
2d9c0 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65  ng stepped corre
2d9d0 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c  sponds to an SQL
2d9e0 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66   index and.** if
2d9f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f   this routine co
2da00 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b  uld have been sk
2da10 69 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51  ipped if that SQ
2da20 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e  L index had been
2da30 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64  .** a unique ind
2da40 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74  ex.  Otherwise t
2da50 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68  he caller will h
2da60 61 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f  ave set *pRes to
2da70 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69   zero..** Zero i
2da80 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  s the common cas
2da90 65 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70  e. The btree imp
2daa0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66  lementation is f
2dab0 72 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a  ree to use the.*
2dac0 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20  * initial *pRes 
2dad0 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20  value as a hint 
2dae0 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f  to improve perfo
2daf0 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20  rmance, but the 
2db00 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74  current.** SQLit
2db10 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e  e btree implemen
2db20 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e  tation does not.
2db30 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20   (Note that the 
2db40 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20  comdb2 btree.** 
2db50 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2db60 6f 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e  oes use this hin
2db70 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a  t, however.).*/.
2db80 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
2db90 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65  INLINE int btree
2dba0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2dbb0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2dbc0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
2dbd0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
2dbe0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2dbf0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2dc00 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2dc10 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2dc20 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2dc30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2dc40 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2dc50 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2dc60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2dc70 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
2dc80 3e 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43  >curFlags & (BTC
2dc90 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61  F_AtLast|BTCF_Va
2dca0 6c 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c  lidOvfl|BTCF_Val
2dcb0 69 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20  idNKey))==0 );. 
2dcc0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
2dcd0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
2dce0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2dcf0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2dd00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   ){.    rc = res
2dd10 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2dd20 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2dd30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2dd40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2dd50 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2dd60 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2dd70 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2dd80 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2dd90 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2dda0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2ddb0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2ddc0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2ddd0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2dde0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2ddf0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2de00 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2de10 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2de20 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2de30 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2de40 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2de50 65 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ext<0 ){.       
2de60 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2de70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2de80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2de90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2dea0 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2deb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2dec0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2ded0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2dee0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2def0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
2df00 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2df10 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
2df20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2df30 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
2df40 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
2df50 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
2df60 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
2df70 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
2df80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2df90 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67    rc = moveToRig
2dfa0 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  htmost(pCur);.  
2dfb0 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
2dfc0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2dfd0 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b  ur->iPage]==0 ){
2dfe0 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d  .      if( pCur-
2dff0 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20  >iPage==0 ){.   
2e000 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2e010 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
2e020 49 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65  ID;.        *pRe
2e030 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  s = 1;.        r
2e040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2e050 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
2e060 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72  oveToParent(pCur
2e070 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2e080 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
2e090 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nSize==0 );.    
2e0a0 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63  assert( (pCur->c
2e0b0 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f  urFlags & (BTCF_
2e0c0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
2e0d0 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
2e0e0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
2e0f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2e100 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
2e110 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e120 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
2e130 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
2e140 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
2e150 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2e160 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2e170 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2e180 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e190 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e1a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e1b0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
2e1c0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2e1d0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2e1e0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2e1f0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2e200 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2e210 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2e220 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2e230 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
2e240 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
2e250 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2e260 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2e270 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e280 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20  ALID );.  *pRes 
2e290 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2e2a0 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2e2b0 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2e2c0 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
2e2d0 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69  NKey);.  pCur->i
2e2e0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2e2f0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2e300 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a  e!=CURSOR_VALID.
2e310 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64     || pCur->aiId
2e320 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2e330 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70  0.   || pCur->ap
2e340 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2e350 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  ]->leaf==0.  ){.
2e360 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2e370 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2e380 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Res);.  }.  pCur
2e390 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2e3a0 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  age]--;.  return
2e3b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2e3c0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2e3d0 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
2e3e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e3f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
2e400 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
2e410 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
2e420 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
2e430 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
2e440 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2e450 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
2e460 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
2e470 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
2e480 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
2e490 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
2e4a0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
2e4b0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2e4c0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
2e4d0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
2e4e0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
2e4f0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
2e500 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2e510 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
2e520 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
2e530 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
2e540 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
2e550 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
2e560 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
2e570 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2e580 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  n error..**.** I
2e590 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
2e5a0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2e5b0 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
2e5c0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
2e5d0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
2e5e0 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
2e5f0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
2e600 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
2e610 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
2e620 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
2e630 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
2e640 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
2e650 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2e660 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
2e670 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
2e680 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
2e690 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
2e6a0 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
2e6b0 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
2e6c0 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
2e6d0 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
2e6e0 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
2e6f0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2e700 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
2e710 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
2e720 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
2e730 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
2e740 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
2e750 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
2e760 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2e770 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
2e780 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
2e790 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
2e7a0 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
2e7b0 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
2e7c0 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
2e7d0 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
2e7e0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2e7f0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
2e800 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
2e810 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2e820 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
2e830 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2e840 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
2e850 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
2e860 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2e870 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
2e880 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
2e890 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
2e8a0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2e8b0 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2e8c0 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
2e8d0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2e8e0 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
2e8f0 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
2e900 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
2e910 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
2e920 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
2e930 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
2e940 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2e950 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
2e960 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
2e970 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2e980 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2e990 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
2e9a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
2e9b0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
2e9c0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
2e9d0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
2e9e0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
2e9f0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
2ea00 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
2ea10 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
2ea20 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
2ea30 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2ea40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ea50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2ea60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2ea70 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
2ea80 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
2ea90 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
2eaa0 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
2eab0 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
2eac0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2ead0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
2eae0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2eaf0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
2eb00 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
2eb10 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
2eb20 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2eb30 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
2eb40 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
2eb50 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2eb60 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2eb70 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
2eb80 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
2eb90 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2eba0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
2ebb0 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
2ebc0 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
2ebd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ebe0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2ebf0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
2ec00 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
2ec10 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
2ec20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
2ec30 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
2ec40 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
2ec50 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
2ec60 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
2ec70 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
2ec80 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
2ec90 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
2eca0 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65  ' */.    u32 nSe
2ecb0 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43  arch = 0;   /* C
2ecc0 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
2ecd0 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74  er of search att
2ece0 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20  empts */.    .  
2ecf0 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
2ed00 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2ed10 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
2ed20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
2ed30 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
2ed40 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2ed50 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
2ed60 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2ed70 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
2ed80 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
2ed90 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
2eda0 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
2edb0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2edc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2edd0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
2ede0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
2edf0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
2ee00 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
2ee10 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2ee20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2ee30 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
2ee40 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2ee50 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
2ee60 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2ee70 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
2ee80 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
2ee90 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2eea0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2eeb0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
2eec0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
2eed0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2eee0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
2eef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2ef00 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
2ef10 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2ef20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2ef30 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
2ef40 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
2ef50 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
2ef60 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
2ef70 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
2ef80 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
2ef90 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
2efa0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2efb0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
2efc0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
2efd0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2efe0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2eff0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2f000 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f010 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
2f020 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2f030 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
2f040 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
2f050 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
2f060 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
2f070 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
2f080 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
2f090 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
2f0a0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2f0b0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
2f0c0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
2f0d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
2f0e0 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
2f0f0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2f100 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
2f110 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
2f120 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
2f130 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
2f140 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
2f150 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
2f160 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
2f170 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
2f180 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
2f190 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
2f1a0 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2f1b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
2f1c0 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35  OF: R-01506-1105
2f1d0 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  3 The first inte
2f1e0 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2f1f0 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2f200 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70       ** is the p
2f210 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2f220 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20  e next freelist 
2f230 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2f240 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20  e list or.      
2f250 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69    ** zero if thi
2f260 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72  s is the last fr
2f270 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f280 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  e. */.        iT
2f290 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2f2a0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2f2b0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
2f2c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2f2d0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2f2e0 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34  9841-13798 The 4
2f2f0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2f300 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2f310 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a  et 32.        **
2f320 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65   stores the page
2f330 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
2f340 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
2f350 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65   freelist, or ze
2f360 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  ro if.        **
2f370 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
2f380 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
2f390 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2f3a0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2f3b0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
2f3c0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
2f3d0 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
2f3e0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
2f3f0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e  runk>mxPage || n
2f400 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a  Search++ > n ){.
2f410 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2f420 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f430 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f440 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2f450 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
2f460 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
2f470 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
2f480 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2f490 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2f4a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
2f4b0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f4c0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
2f4d0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2f4e0 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
2f4f0 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
2f500 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
2f510 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2f520 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
2f530 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
2f540 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
2f550 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
2f560 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
2f570 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
2f580 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
2f590 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
2f5a0 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2f5b0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2f5c0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
2f5d0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
2f5e0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2f5f0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
2f600 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
2f610 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
2f620 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
2f630 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
2f640 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
2f650 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
2f660 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
2f670 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
2f680 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
2f690 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
2f6a0 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
2f6b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2f6c0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2f6d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2f6e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f6f0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f700 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
2f720 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2f730 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2f740 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2f750 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2f760 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2f770 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2f780 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
2f790 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2f7a0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2f7b0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2f7c0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2f7d0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2f7e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
2f7f0 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
2f800 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2f810 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
2f820 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
2f830 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
2f840 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2f850 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2f860 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2f870 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
2f880 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f890 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
2f8a0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2f8b0 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
2f8c0 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
2f8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2f8e0 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20  (nearby==iTrunk 
2f8f0 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62  || (iTrunk<nearb
2f900 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2f910 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2f920 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2f930 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
2f940 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
2f950 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
2f960 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
2f970 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
2f980 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2f990 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
2f9a0 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
2f9b0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2f9c0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2f9d0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2f9e0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
2f9f0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2fa00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fa10 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2fa20 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fa30 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2fa40 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fa50 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fa60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fa70 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
2fa80 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2fa90 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2faa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2fab0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2fac0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2fad0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2fae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2faf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fb00 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2fb10 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2fb20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2fb30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fb40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2fb50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2fb60 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2fb70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fb80 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
2fb90 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2fba0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2fbb0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2fbc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2fbd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2fbe0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
2fbf0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
2fc00 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
2fc10 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
2fc20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
2fc30 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
2fc40 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
2fc50 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
2fc60 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
2fc70 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
2fc80 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
2fc90 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
2fca0 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
2fcb0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
2fcc0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
2fcd0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
2fce0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
2fcf0 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
2fd00 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
2fd10 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2fd20 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2fd30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2fd40 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fd50 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
2fd60 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
2fd70 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
2fd80 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2fd90 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
2fda0 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
2fdb0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
2fdc0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
2fdd0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2fde0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fdf0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2fe00 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2fe10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2fe20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fe30 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
2fe40 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
2fe50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2fe60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fe70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
2fe80 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
2fe90 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
2fea0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2feb0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2fec0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
2fed0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
2fee0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2fef0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2ff00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
2ff10 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
2ff20 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
2ff30 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
2ff40 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
2ff50 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
2ff60 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
2ff70 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
2ff80 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
2ff90 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
2ffa0 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
2ffb0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
2ffc0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2ffd0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2ffe0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
2fff0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
30000 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
30010 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
30020 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
30030 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30040 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30060 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
30070 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
30080 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30090 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
300a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
300b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
300c0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
300d0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
300e0 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
300f0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
30100 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30110 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
30120 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
30130 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
30140 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
30150 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
30160 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
30170 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
30180 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
30190 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
301a0 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
301b0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
301c0 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
301d0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
301e0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
301f0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
30200 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
30210 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
30220 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
30230 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
30240 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
30250 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
30260 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
30270 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
30280 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
30290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
302a0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
302b0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
302c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
302d0 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
302e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
302f0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
30300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
30310 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
30320 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30330 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
30340 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30350 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
30360 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
30370 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
30380 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
30390 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
303a0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
303b0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
303c0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
303d0 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
303e0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
303f0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
30400 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
30410 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
30420 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30430 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
30440 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30450 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
30460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30480 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
30490 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
304a0 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
304b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
304c0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
304d0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
304e0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
304f0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
30500 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
30510 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
30520 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
30530 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
30540 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
30550 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30560 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
30580 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
30590 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
305a0 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
305b0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
305c0 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
305d0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
305e0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
305f0 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
30600 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
30610 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
30620 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
30630 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
30640 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
30650 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
30660 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
30670 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30680 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
30690 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
306a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
306b0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
306c0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
306d0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
306e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
306f0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
30700 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30710 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
30720 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30730 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
30740 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
30750 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
30760 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
30770 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
30780 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
30790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
307a0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
307b0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
307c0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
307d0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
307e0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
307f0 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
30800 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
30810 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
30820 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30830 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
30840 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
30850 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30870 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30880 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30890 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
308a0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
308b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
308c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
308d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
308e0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
308f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50              *ppP
30900 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
30910 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30920 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
30930 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
30940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30950 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30960 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
30970 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
30980 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
30990 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
309a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
309b0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
309c0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
309d0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
309e0 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
309f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
30a00 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
30a10 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
30a20 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
30a30 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
30a40 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
30a50 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
30a60 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
30a70 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
30a80 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
30a90 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
30aa0 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
30ab0 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
30ac0 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
30ad0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
30ae0 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
30af0 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
30b00 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
30b10 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
30b20 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
30b30 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
30b40 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
30b50 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
30b60 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
30b70 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
30b80 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
30b90 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
30ba0 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
30bb0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
30bc0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
30bd0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
30be0 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
30bf0 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
30c00 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
30c10 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
30c20 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
30c30 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
30c40 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
30c50 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
30c60 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
30c70 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
30c80 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
30c90 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
30ca0 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
30cb0 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
30cc0 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
30cd0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
30ce0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
30cf0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
30d00 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
30d10 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
30d20 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
30d30 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
30d40 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
30d50 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
30d60 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
30d70 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
30d80 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
30d90 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
30da0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30db0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
30dc0 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
30dd0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
30de0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
30df0 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ))? PAGER_GET_NO
30e00 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20  CONTENT:0;..    
30e10 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
30e20 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
30e30 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
30e40 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
30e50 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
30e60 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
30e70 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
30e80 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
30e90 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
30ea0 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
30eb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30ec0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
30ed0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
30ee0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
30ef0 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
30f00 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
30f10 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
30f20 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
30f30 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
30f40 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
30f50 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
30f60 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
30f70 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
30f80 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
30f90 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
30fa0 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
30fb0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
30fc0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
30fd0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
30fe0 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
30ff0 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
31000 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
31010 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
31020 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
31030 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
31040 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
31050 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
31060 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
31070 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31080 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
31090 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
310a0 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
310b0 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
310c0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
310d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
310e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
310f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
31100 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
31110 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31120 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
31130 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
31140 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
31150 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
31160 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
31170 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
31180 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
31190 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
311a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
311b0 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
311c0 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
311d0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
311e0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
311f0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
31200 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
31210 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31220 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
31230 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
31240 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
31250 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
31260 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
31270 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31280 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31290 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
312a0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
312b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
312c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
312d0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
312e0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
312f0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
31300 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
31310 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
31320 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
31330 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
31340 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
31350 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31360 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
31370 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
31380 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
31390 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
313a0 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61  pPrevTrunk);.  a
313b0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
313c0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
313d0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
313e0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
313f0 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73  age)<=1 );.  ass
31400 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
31410 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  OK || (*ppPage)-
31420 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
31430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31440 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
31450 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
31460 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
31470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31480 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
31490 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
314a0 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
314b0 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
314c0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
314d0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
314e0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
314f0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
31500 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
31510 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
31520 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
31530 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
31540 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31550 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
31560 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
31570 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
31580 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
31590 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
315a0 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
315b0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
315c0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
315d0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
315e0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
315f0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
31600 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
31610 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
31620 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
31630 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
31640 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
31650 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
31660 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
31670 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
31680 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
31690 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
316a0 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
316b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
316c0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
316d0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
316e0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
316f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31700 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
31710 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
31720 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
31730 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
31740 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
31750 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
31760 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
31770 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
317a0 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
317b0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
317c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
317e0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
317f0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
31820 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31830 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
31840 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
31850 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
31860 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
31870 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
31880 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b  DB || iPage>1 );
31890 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
318a0 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
318b0 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
318c0 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20  ..  if( iPage<2 
318d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
318e0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
318f0 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
31900 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
31910 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
31920 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
31930 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
31940 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
31950 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
31960 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
31970 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
31980 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
31990 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
319a0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
319b0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
319c0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
319d0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
319e0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
319f0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
31a00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31a10 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
31a20 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31a30 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
31a40 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
31a50 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
31a60 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
31a70 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
31a80 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
31a90 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
31aa0 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
31ab0 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
31ac0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
31ad0 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
31ae0 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
31af0 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
31b00 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
31b10 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
31b20 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
31b30 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
31b40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31b50 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
31b60 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
31b70 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
31b80 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
31b90 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
31ba0 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
31bb0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
31bc0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
31bd0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
31be0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
31bf0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
31c00 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
31c10 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
31c20 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
31c30 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
31c40 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
31c50 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
31c60 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
31c70 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
31c80 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
31c90 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
31ca0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
31cb0 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
31cc0 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
31cd0 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
31ce0 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
31cf0 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
31d00 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
31d10 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
31d20 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
31d30 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
31d40 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
31d50 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
31d60 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
31d70 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
31d80 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
31d90 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
31da0 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
31db0 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
31dc0 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
31dd0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
31de0 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
31df0 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
31e00 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
31e10 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
31e20 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
31e30 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
31e40 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
31e50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
31e60 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
31e70 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
31e80 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
31e90 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
31ea0 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
31eb0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
31ec0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
31ed0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
31ee0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
31ef0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
31f00 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
31f10 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
31f20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31f30 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
31f40 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
31f50 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
31f60 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
31f70 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
31f80 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
31f90 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
31fa0 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
31fb0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
31fc0 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
31fd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31fe0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
31ff0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32000 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
32010 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
32020 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
32030 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
32040 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
32050 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
32060 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
32070 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
32080 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
32090 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
320a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
320b0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
320c0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
320d0 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
320e0 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
320f0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
32100 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
32110 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
32120 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
32130 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
32140 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
32150 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
32160 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
32170 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
32180 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
32190 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
321a0 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
321b0 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
321c0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
321d0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
321e0 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
321f0 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
32200 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
32210 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
32220 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
32230 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
32240 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
32250 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
32260 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
32270 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
32280 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
32290 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
322a0 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
322b0 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
322c0 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
322d0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
322e0 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
322f0 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
32300 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
32310 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
32320 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
32330 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
32340 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
32350 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
32360 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
32370 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
32380 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -8"..      **.  
32390 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
323a0 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37  OF: R-19920-1157
323b0 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72  6 However, newer
323c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
323d0 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20  ite still.      
323e0 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74  ** avoid using t
323f0 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72  he last six entr
32400 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c  ies in the freel
32410 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61  ist trunk page a
32420 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a  rray in.      **
32430 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61   order that data
32440 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
32450 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
32460 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
32470 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72  an be.      ** r
32480 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ead by older ver
32490 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e  sions of SQLite.
324a0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
324b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
324c0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
324d0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
324e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
324f0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
32500 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
32510 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
32520 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
32530 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
32540 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
32550 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
32560 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d  ( pPage && (pBt-
32570 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
32580 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d  SECURE_DELETE)==
32590 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
325a0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
325b0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
325c0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
325d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
325e0 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
325f0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
32600 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
32610 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
32620 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
32630 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
32640 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
32650 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
32660 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32670 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
32680 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
32690 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
326a0 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
326b0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
326c0 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
326d0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
326e0 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
326f0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
32700 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
32710 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
32720 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
32730 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
32740 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
32750 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
32760 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
32770 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
32780 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
32790 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
327a0 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
327b0 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
327c0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
327d0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
327e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
327f0 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
32800 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  !=(rc = btreeGet
32810 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
32820 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a   &pPage, 0)) ){.
32830 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32840 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20  e_out;.  }.  rc 
32850 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32860 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
32870 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
32880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32890 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
328a0 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
328b0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
328c0 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
328d0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
328e0 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
328f0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
32900 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
32910 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
32920 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
32930 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
32940 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
32950 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
32960 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
32970 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
32980 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
32990 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
329a0 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
329b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
329c0 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
329d0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
329e0 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
329f0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70  e *pPage, int *p
32a00 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
32a10 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
32a20 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50      *pRC = freeP
32a30 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c  age2(pPage->pBt,
32a40 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70   pPage, pPage->p
32a50 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gno);.  }.}../*.
32a60 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
32a70 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
32a80 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
32a90 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74  iven Cell.  Writ
32aa0 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43  e the.** local C
32ab0 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75  ell size (the nu
32ac0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
32ad0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
32ae0 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20  ge, omitting.** 
32af0 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a  overflow) into *
32b00 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  pnSize..*/.stati
32b10 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
32b20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32b30 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
32b40 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
32b50 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a  tains the Cell *
32b60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
32b70 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20  r *pCell,    /* 
32b80 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
32b90 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20  e Cell */.  u16 
32ba0 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
32bb0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
32bc0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65  e size of the Ce
32bd0 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ll here */.){.  
32be0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32bf0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
32c00 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
32c10 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
32c20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
32c30 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
32c40 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
32c50 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
32c60 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
32c70 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
32c80 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
32c90 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
32ca0 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65  info);.  *pnSize
32cb0 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
32cc0 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
32cd0 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
32ce0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32cf0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
32d00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
32d10 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
32d20 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
32d30 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
32d40 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 20 3e 20  +info.nSize-1 > 
32d50 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
32d60 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
32d70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32d80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
32d90 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
32da0 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
32db0 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
32dc0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
32dd0 43 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e 53 69 7a  Cell + info.nSiz
32de0 65 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74  e - 4);.  assert
32df0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
32e00 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
32e10 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
32e20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
32e30 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
32e40 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
32e50 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
32e60 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
32e70 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
32e80 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
32e90 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
32ea0 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
32eb0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
32ec0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
32ed0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
32ee0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
32ef0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
32f00 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
32f10 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
32f20 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
32f30 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
32f40 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
32f50 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
32f60 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
32f70 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
32f80 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
32f90 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
32fa0 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
32fb0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
32fc0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
32fd0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
32fe0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
32ff0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
33000 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33010 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
33030 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
33040 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
33050 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
33060 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
33070 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
33080 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33090 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
330a0 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
330b0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
330c0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
330d0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
330e0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
330f0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
33100 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
33110 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
33120 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
33130 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
33140 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
33150 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
33160 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
33170 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
33180 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
33190 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
331a0 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
331b0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
331c0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
331d0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
331e0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
331f0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
33200 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
33210 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
33220 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
33230 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
33240 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
33250 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
33260 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
33270 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
33280 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
33290 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
332a0 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
332b0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
332c0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
332d0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
332e0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
332f0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
33300 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
33310 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
33320 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
33330 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
33340 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
33350 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
33360 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
33370 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
33380 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
33390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
333a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
333b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
333c0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
333d0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
333e0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
333f0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
33400 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33410 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
33420 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
33430 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33440 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
33450 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
33460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33470 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
33480 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
33490 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
334a0 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
334b0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
334c0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
334d0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
334e0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
334f0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
33500 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
33510 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
33520 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
33530 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
33540 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
33550 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
33560 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
33570 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
33580 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
33590 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
335a0 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
335b0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
335c0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
335d0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
335e0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
335f0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
33600 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
33610 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
33620 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
33630 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
33640 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
33650 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
33660 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
33670 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
33680 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
33690 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
336a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
336b0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
336c0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
336d0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
336e0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
336f0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
33700 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
33710 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  ll */.  const vo
33720 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b  id *pKey, i64 nK
33730 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ey,    /* The ke
33740 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  y */.  const voi
33750 64 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61  d *pData,int nDa
33760 74 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74  ta,   /* The dat
33770 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f  a */.  int nZero
33780 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33790 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a        /* Extra z
337a0 65 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70  ero bytes to app
337b0 65 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a  end to pData */.
337c0 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20    int *pnSize   
337d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337e0 20 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73   /* Write cell s
337f0 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ize here */.){. 
33800 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   int nPayload;. 
33810 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b   const u8 *pSrc;
33820 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20  .  int nSrc, n, 
33830 72 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c  rc;.  int spaceL
33840 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  eft;.  MemPage *
33850 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d  pOvfl = 0;.  Mem
33860 50 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65  Page *pToRelease
33870 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64   = 0;.  unsigned
33880 20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20   char *pPrior;. 
33890 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
338a0 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68  pPayload;.  BtSh
338b0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
338c0 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70  e->pBt;.  Pgno p
338d0 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69  gnoOvfl = 0;.  i
338e0 6e 74 20 6e 48 65 61 64 65 72 3b 0a 0a 20 20 61  nt nHeader;..  a
338f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
33900 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
33910 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
33920 0a 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 6e  .  /* pPage is n
33930 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
33940 72 69 74 65 61 62 6c 65 20 73 69 6e 63 65 20 70  riteable since p
33950 43 65 6c 6c 20 6d 69 67 68 74 20 62 65 20 61 75  Cell might be au
33960 78 69 6c 69 61 72 79 0a 20 20 2a 2a 20 62 75 66  xiliary.  ** buf
33970 66 65 72 20 73 70 61 63 65 20 74 68 61 74 20 69  fer space that i
33980 73 20 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20  s separate from 
33990 74 68 65 20 70 50 61 67 65 20 62 75 66 66 65 72  the pPage buffer
339a0 20 61 72 65 61 20 2a 2f 0a 20 20 61 73 73 65 72   area */.  asser
339b0 74 28 20 70 43 65 6c 6c 3c 70 50 61 67 65 2d 3e  t( pCell<pPage->
339c0 61 44 61 74 61 20 7c 7c 20 70 43 65 6c 6c 3e 3d  aData || pCell>=
339d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
339e0 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20  t->pageSize].   
339f0 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
33a00 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
33a10 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
33a20 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ge) );..  /* Fil
33a30 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
33a40 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
33a50 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
33a60 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64 20  ize;.  nPayload 
33a70 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f 3b  = nData + nZero;
33a80 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e  .  if( pPage->in
33a90 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20 20  tKeyLeaf ){.    
33aa0 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61  nHeader += putVa
33ab0 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48  rint32(&pCell[nH
33ac0 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64  eader], nPayload
33ad0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33ae0 61 73 73 65 72 74 28 20 6e 44 61 74 61 3d 3d 30  assert( nData==0
33af0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33b00 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nZero==0 );.  }.
33b10 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
33b20 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
33b30 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
33b40 6e 4b 65 79 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  nKey);.  .  /* F
33b50 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
33b60 61 64 20 73 69 7a 65 20 2a 2f 0a 20 20 69 66 28  ad size */.  if(
33b70 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
33b80 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
33b90 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
33ba0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
33bb0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20  = 0;.  }else{ . 
33bc0 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3c     assert( nKey<
33bd0 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20 70  =0x7fffffff && p
33be0 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20 6e 50  Key!=0 );.    nP
33bf0 61 79 6c 6f 61 64 20 3d 20 28 69 6e 74 29 6e 4b  ayload = (int)nK
33c00 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
33c10 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
33c20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20  (int)nKey;.  }. 
33c30 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d 70   if( nPayload<=p
33c40 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
33c50 7b 0a 20 20 20 20 6e 20 3d 20 6e 48 65 61 64 65  {.    n = nHeade
33c60 72 20 2b 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  r + nPayload;.  
33c70 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 33    testcase( n==3
33c80 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
33c90 28 20 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 69 66  ( n==4 );.    if
33ca0 28 20 6e 3c 34 20 29 20 6e 20 3d 20 34 3b 0a 20  ( n<4 ) n = 4;. 
33cb0 20 20 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 3b 0a     *pnSize = n;.
33cc0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
33cd0 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 50  nPayload;.    pP
33ce0 72 69 6f 72 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  rior = pCell;.  
33cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
33d00 6e 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f  n = pPage->minLo
33d10 63 61 6c 3b 0a 20 20 20 20 6e 20 3d 20 6d 6e 20  cal;.    n = mn 
33d20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20 6d 6e  + (nPayload - mn
33d30 29 20 25 20 28 70 50 61 67 65 2d 3e 70 42 74 2d  ) % (pPage->pBt-
33d40 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 29  >usableSize - 4)
33d50 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
33d60 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  n==pPage->maxLoc
33d70 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
33d80 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
33d90 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
33da0 69 66 28 20 6e 20 3e 20 70 50 61 67 65 2d 3e 6d  if( n > pPage->m
33db0 61 78 4c 6f 63 61 6c 20 29 20 6e 20 3d 20 6d 6e  axLocal ) n = mn
33dc0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
33dd0 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65  = n;.    *pnSize
33de0 20 3d 20 6e 20 2b 20 6e 48 65 61 64 65 72 20 2b   = n + nHeader +
33df0 20 34 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d   4;.    pPrior =
33e00 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 2b   &pCell[nHeader+
33e10 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 79 6c 6f  n];.  }.  pPaylo
33e20 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  ad = &pCell[nHea
33e30 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20 41 74 20 74  der];..  /* At t
33e40 68 69 73 20 70 6f 69 6e 74 20 76 61 72 69 61 62  his point variab
33e50 6c 65 73 20 73 68 6f 75 6c 64 20 62 65 20 73 65  les should be se
33e60 74 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20  t as follows:.  
33e70 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50 61 79 6c 6f  **.  **   nPaylo
33e80 61 64 20 20 20 20 20 20 20 20 20 20 20 54 6f 74  ad           Tot
33e90 61 6c 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  al payload size 
33ea0 69 6e 20 62 79 74 65 73 0a 20 20 2a 2a 20 20 20  in bytes.  **   
33eb0 70 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20  pPayload        
33ec0 20 20 20 42 65 67 69 6e 20 77 72 69 74 69 6e 67     Begin writing
33ed0 20 70 61 79 6c 6f 61 64 20 68 65 72 65 0a 20 20   payload here.  
33ee0 2a 2a 20 20 20 73 70 61 63 65 4c 65 66 74 20 20  **   spaceLeft  
33ef0 20 20 20 20 20 20 20 20 53 70 61 63 65 20 61 76          Space av
33f00 61 69 6c 61 62 6c 65 20 61 74 20 70 50 61 79 6c  ailable at pPayl
33f10 6f 61 64 2e 20 20 49 66 20 6e 50 61 79 6c 6f 61  oad.  If nPayloa
33f20 64 3e 73 70 61 63 65 4c 65 66 74 2c 0a 20 20 2a  d>spaceLeft,.  *
33f30 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
33f40 20 20 20 20 20 20 20 74 68 61 74 20 6d 65 61 6e         that mean
33f50 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74 20 73  s content must s
33f60 70 69 6c 6c 20 69 6e 74 6f 20 6f 76 65 72 66 6c  pill into overfl
33f70 6f 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20 20  ow pages..  **  
33f80 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20   *pnSize        
33f90 20 20 20 20 53 69 7a 65 20 6f 66 20 74 68 65 20      Size of the 
33fa0 6c 6f 63 61 6c 20 63 65 6c 6c 20 28 6e 6f 74 20  local cell (not 
33fb0 63 6f 75 6e 74 69 6e 67 20 6f 76 65 72 66 6c 6f  counting overflo
33fc0 77 20 70 61 67 65 73 29 0a 20 20 2a 2a 20 20 20  w pages).  **   
33fd0 70 50 72 69 6f 72 20 20 20 20 20 20 20 20 20 20  pPrior          
33fe0 20 20 20 57 68 65 72 65 20 74 6f 20 77 72 69 74     Where to writ
33ff0 65 20 74 68 65 20 70 67 6e 6f 20 6f 66 20 74 68  e the pgno of th
34000 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
34010 20 70 61 67 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20   page.  **.  ** 
34020 55 73 65 20 61 20 63 61 6c 6c 20 74 6f 20 62 74  Use a call to bt
34030 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
34040 29 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  ) to verify that
34050 20 74 68 65 20 76 61 6c 75 65 73 20 61 62 6f 76   the values abov
34060 65 0a 20 20 2a 2a 20 77 65 72 65 20 63 6f 6d 70  e.  ** were comp
34070 75 74 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  uted correctly..
34080 20 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f    */.#if SQLITE_
34090 44 45 42 55 47 0a 20 20 7b 0a 20 20 20 20 43 65  DEBUG.  {.    Ce
340a0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
340b0 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
340c0 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
340d0 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73   &info);.    ass
340e0 65 72 74 28 20 6e 48 65 61 64 65 72 3d 3d 28 69  ert( nHeader==(i
340f0 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  nt)(info.pPayloa
34100 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20  d - pCell) );.  
34110 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e    assert( info.n
34120 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 20  Key==nKey );.   
34130 20 61 73 73 65 72 74 28 20 2a 70 6e 53 69 7a 65   assert( *pnSize
34140 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 20 29   == info.nSize )
34150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 70  ;.    assert( sp
34160 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e 66 6f 2e  aceLeft == info.
34170 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 7d 0a 23 65  nLocal );.  }.#e
34180 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72 69 74 65  ndif..  /* Write
34190 20 74 68 65 20 70 61 79 6c 6f 61 64 20 69 6e 74   the payload int
341a0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43 65 6c 6c  o the local Cell
341b0 20 61 6e 64 20 61 6e 79 20 65 78 74 72 61 20 69   and any extra i
341c0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
341d0 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  es */.  while( n
341e0 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
341f0 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
34200 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  0 ){.#ifndef SQL
34210 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
34220 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
34230 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
34240 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
34250 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
34260 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
34270 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
34280 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
34290 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
342a0 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
342b0 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
342c0 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
342d0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
342e0 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
342f0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
34300 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
34310 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
34320 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
34330 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
34340 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c  Page(pBt, &pOvfl
34350 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e  , &pgnoOvfl, pgn
34360 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69 66 6e 64  oOvfl, 0);.#ifnd
34370 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
34380 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
34390 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
343a0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
343b0 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
343c0 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
343d0 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
343e0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
343f0 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
34400 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
34410 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
34420 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
34430 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
34440 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
34450 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
34460 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
34470 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
34480 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
34490 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
344a0 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
344b0 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
344c0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
344d0 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
344e0 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
344f0 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
34500 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
34510 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
34520 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
34530 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
34540 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 6c  ninitialized val
34550 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
34560 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
34570 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
34580 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
34590 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
345a0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
345b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
345c0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
345d0 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
345e0 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
345f0 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
34600 57 31 29 3b 0a 20 20 20 20 20 20 20 20 70 74 72  W1);.        ptr
34610 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
34620 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e  Ovfl, eType, pgn
34630 6f 50 74 72 6d 61 70 2c 20 26 72 63 29 3b 0a 20  oPtrmap, &rc);. 
34640 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
34650 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
34660 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
34670 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
34680 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
34690 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
346a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
346b0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
346c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
346d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
346e0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
346f0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 72  ot zero than pPr
34700 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  ior points into 
34710 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
34720 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
34730 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
34740 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
34750 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
34760 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
34770 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c   pToRelease==0 |
34780 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
34790 77 72 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c  writeable(pToRel
347a0 65 61 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29  ease->pDbPage) )
347b0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 70  ;..      /* If p
347c0 50 72 69 6f 72 20 69 73 20 70 61 72 74 20 6f 66  Prior is part of
347d0 20 74 68 65 20 64 61 74 61 20 61 72 65 61 20 6f   the data area o
347e0 66 20 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61  f pPage, then ma
347f0 6b 65 20 73 75 72 65 20 70 50 61 67 65 0a 20 20  ke sure pPage.  
34800 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c 6c 20      ** is still 
34810 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20 20 20  writeable */.   
34820 20 20 20 61 73 73 65 72 74 28 20 70 50 72 69 6f     assert( pPrio
34830 72 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c  r<pPage->aData |
34840 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50 61 67 65  | pPrior>=&pPage
34850 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67  ->aData[pBt->pag
34860 65 53 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20  eSize].         
34870 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67     || sqlite3Pag
34880 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
34890 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
348a0 0a 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ..      put4byte
348b0 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
348c0 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
348d0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
348e0 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
348f0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
34900 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
34910 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
34920 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
34930 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
34940 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
34950 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
34960 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
34970 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
34980 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
34990 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
349a0 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
349b0 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a 20 20 20   spaceLeft;..   
349c0 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61 73   /* If pToReleas
349d0 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68  e is not zero th
349e0 61 6e 20 70 50 61 79 6c 6f 61 64 20 70 6f 69 6e  an pPayload poin
349f0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
34a00 20 61 72 65 61 0a 20 20 20 20 2a 2a 20 6f 66 20   area.    ** of 
34a10 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b  pToRelease.  Mak
34a20 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61 73  e sure pToReleas
34a30 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65  e is still write
34a40 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  able. */.    ass
34a50 65 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d  ert( pToRelease=
34a60 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67  =0 || sqlite3Pag
34a70 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54  erIswriteable(pT
34a80 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67  oRelease->pDbPag
34a90 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  e) );..    /* If
34aa0 20 70 50 61 79 6c 6f 61 64 20 69 73 20 70 61 72   pPayload is par
34ab0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72  t of the data ar
34ac0 65 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65  ea of pPage, the
34ad0 6e 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67  n make sure pPag
34ae0 65 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69 6c  e.    ** is stil
34af0 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a 20  l writeable */. 
34b00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 79 6c     assert( pPayl
34b10 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44 61 74 61  oad<pPage->aData
34b20 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e 3d 26 70   || pPayload>=&p
34b30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d  Page->aData[pBt-
34b40 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20  >pageSize].     
34b50 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
34b60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34b70 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34b80 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 53  ) );..    if( nS
34b90 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
34ba0 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
34bb0 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
34bc0 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
34bd0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
34be0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
34bf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
34c00 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
34c10 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
34c20 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
34c30 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
34c40 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
34c50 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
34c60 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
34c70 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
34c80 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
34c90 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
34ca0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
34cb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
34cc0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
34cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
34ce0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
34cf0 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74 68 20  Remove the i-th 
34d00 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e  cell from pPage.
34d10 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65    This routine e
34d20 66 66 65 63 74 73 20 70 50 61 67 65 20 6f 6e 6c  ffects pPage onl
34d30 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 20 63  y..** The cell c
34d40 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20 66 72  ontent is not fr
34d50 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63 61 74  eed or deallocat
34d60 65 64 2e 20 20 49 74 20 69 73 20 61 73 73 75 6d  ed.  It is assum
34d70 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 63  ed that.** the c
34d80 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20  ell content has 
34d90 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f 6d 65  been copied some
34da0 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54 68 69  place else.  Thi
34db0 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 0a 2a  s routine just.*
34dc0 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20 72 65  * removes the re
34dd0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63  ference to the c
34de0 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a  ell from pPage..
34df0 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73 74 20  **.** "sz" must 
34e00 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
34e10 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 63 65   bytes in the ce
34e20 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ll..*/.static vo
34e30 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65 6d 50  id dropCell(MemP
34e40 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
34e50 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  idx, int sz, int
34e60 20 2a 70 52 43 29 7b 0a 20 20 75 33 32 20 70 63   *pRC){.  u32 pc
34e70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66  ;         /* Off
34e80 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74  set to cell cont
34e90 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e  ent of cell bein
34ea0 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75  g deleted */.  u
34eb0 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 2f  8 *data;       /
34ec0 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 2a  * pPage->aData *
34ed0 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20  /.  u8 *ptr;    
34ee0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d      /* Used to m
34ef0 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e 64  ove bytes around
34f00 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a   within data[] *
34f10 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
34f20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
34f30 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
34f40 68 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  hdr;        /* B
34f50 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
34f60 68 65 61 64 65 72 2e 20 20 30 20 6d 6f 73 74 20  header.  0 most 
34f70 70 61 67 65 73 2e 20 20 31 30 30 20 70 61 67 65  pages.  100 page
34f80 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52   1 */..  if( *pR
34f90 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61  C ) return;..  a
34fa0 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
34fb0 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
34fc0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  l );.  assert( C
34fd0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 73 7a 3d  ORRUPT_DB || sz=
34fe0 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c  =cellSize(pPage,
34ff0 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73 65 72   idx) );.  asser
35000 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
35010 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
35020 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
35030 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35040 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35050 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
35060 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
35070 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20 3d 20  >aData;.  ptr = 
35080 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78  &pPage->aCellIdx
35090 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20  [2*idx];.  pc = 
350a0 67 65 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20  get2byte(ptr);. 
350b0 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
350c0 72 4f 66 66 73 65 74 3b 0a 20 20 74 65 73 74 63  rOffset;.  testc
350d0 61 73 65 28 20 70 63 3d 3d 67 65 74 32 62 79 74  ase( pc==get2byt
350e0 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
350f0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
35100 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e 70 42 74  c+sz==pPage->pBt
35110 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
35120 20 20 69 66 28 20 70 63 20 3c 20 28 75 33 32 29    if( pc < (u32)
35130 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
35140 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b 73 7a 20  dr+5]) || pc+sz 
35150 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  > pPage->pBt->us
35160 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  ableSize ){.    
35170 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRC = SQLITE_CO
35180 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
35190 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
351a0 20 3d 20 66 72 65 65 53 70 61 63 65 28 70 50 61   = freeSpace(pPa
351b0 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69  ge, pc, sz);.  i
351c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 2a 70 52  f( rc ){.    *pR
351d0 43 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  C = rc;.    retu
351e0 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  rn;.  }.  pPage-
351f0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69 66 28 20  >nCell--;.  if( 
35200 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
35210 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64  ){.    memset(&d
35220 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
35230 29 3b 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b  );.    data[hdr+
35240 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70 75 74 32  7] = 0;.    put2
35250 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
35260 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  ], pPage->pBt->u
35270 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
35280 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 70  pPage->nFree = p
35290 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
352a0 65 53 69 7a 65 20 2d 20 70 50 61 67 65 2d 3e 68  eSize - pPage->h
352b0 64 72 4f 66 66 73 65 74 0a 20 20 20 20 20 20 20  drOffset.       
352c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352d0 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
352e0 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20 7d 65 6c  rSize - 8;.  }el
352f0 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28  se{.    memmove(
35300 70 74 72 2c 20 70 74 72 2b 32 2c 20 32 2a 28 70  ptr, ptr+2, 2*(p
35310 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 64  Page->nCell - id
35320 78 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  x));.    put2byt
35330 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
35340 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
35350 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
35360 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  += 2;.  }.}../*.
35370 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  ** Insert a new 
35380 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74  cell on pPage at
35390 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e   cell index "i".
353a0 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74    pCell points t
353b0 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  o the.** content
353c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a   of the cell..**
353d0 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20  .** If the cell 
353e0 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74  content will fit
353f0 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68   on the page, th
35400 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65 2e  en put it there.
35410 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20    If it.** will 
35420 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61  not fit, then ma
35430 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
35440 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
35450 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70  to pTemp if.** p
35460 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  Temp is not null
35470 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  .  Regardless of
35480 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65   pTemp, allocate
35490 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20   a new entry.** 
354a0 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  in pPage->apOvfl
354b0 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
354c0 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
354d0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
354e0 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
354f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
35500 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
35510 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
35520 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
35530 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
35540 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
35550 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
35560 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
35570 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2f   incremented..*/
35580 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 73  .static void ins
35590 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  ertCell(.  MemPa
355a0 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20  ge *pPage,   /* 
355b0 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68 20  Page into which 
355c0 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20 2a  we are copying *
355d0 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20 20  /.  int i,      
355e0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65 6c        /* New cel
355f0 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69 2d  l becomes the i-
35600 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20 70  th cell of the p
35610 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  age */.  u8 *pCe
35620 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ll,        /* Co
35630 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65 77  ntent of the new
35640 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 73   cell */.  int s
35650 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  z,           /* 
35660 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  Bytes of content
35670 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75   in pCell */.  u
35680 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20 20  8 *pTemp,       
35690 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
356a0 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c 6c   space for pCell
356b0 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a 20  , if needed */. 
356c0 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20   Pgno iChild,   
356d0 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72     /* If non-zer
356e0 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73 74  o, replace first
356f0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
35700 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e  is value */.  in
35710 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20 20  t *pRC          
35720 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69 74  /* Read and writ
35730 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66 72  e return code fr
35740 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  om here */.){.  
35750 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20 20  int idx = 0;    
35760 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
35770 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e  ite new cell con
35780 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a  tent in data[] *
35790 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20  /.  int j;      
357a0 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
357b0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 64  unter */.  u8 *d
357c0 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ata;         /* 
357d0 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  The content of t
357e0 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f  he whole page */
357f0 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20 20  .  u8 *pIns;    
35800 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e       /* The poin
35810 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c  t in pPage->aCel
35820 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f 20  lIdx[] where no 
35830 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a 2f  cell inserted */
35840 0a 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ..  if( *pRC ) r
35850 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74  eturn;..  assert
35860 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
35870 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
35880 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
35890 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 28  assert( MX_CELL(
358a0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 31 30 39  pPage->pBt)<=109
358b0 32 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  21 );.  assert( 
358c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
358d0 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
358e0 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  ) || CORRUPT_DB 
358f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35900 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41  ge->nOverflow<=A
35910 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
35920 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  apOvfl) );.  ass
35930 65 72 74 28 20 41 72 72 61 79 53 69 7a 65 28 70  ert( ArraySize(p
35940 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 3d 3d 41  Page->apOvfl)==A
35950 72 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e  rraySize(pPage->
35960 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73  aiOvfl) );.  ass
35970 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
35980 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
35990 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
359a0 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73 68 6f 75  /* The cell shou
359b0 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62 65 20 73  ld normally be s
359c0 69 7a 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  ized correctly. 
359d0 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e 20 6d   However, when m
359e0 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20 6d 61 6c  oving a.  ** mal
359f0 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66 72 6f 6d  formed cell from
35a00 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20   a leaf page to 
35a10 61 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  an interior page
35a20 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 20 73 69  , if the cell si
35a30 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65 64 20 74  ze.  ** wanted t
35a40 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34  o be less than 4
35a50 20 62 75 74 20 67 6f 74 20 72 6f 75 6e 64 65 64   but got rounded
35a60 20 75 70 20 74 6f 20 34 20 6f 6e 20 74 68 65 20   up to 4 on the 
35a70 6c 65 61 66 2c 20 74 68 65 6e 20 73 69 7a 65 0a  leaf, then size.
35a80 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 6c 65    ** might be le
35a90 73 73 20 74 68 61 6e 20 38 20 28 6c 65 61 66 2d  ss than 8 (leaf-
35aa0 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65 72 29 20  size + pointer) 
35ab0 6f 6e 20 74 68 65 20 69 6e 74 65 72 69 6f 72 20  on the interior 
35ac0 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a 20 20 2a  node.  Hence.  *
35ad0 2a 20 74 68 65 20 74 65 72 6d 20 61 66 74 65 72  * the term after
35ae0 20 74 68 65 20 7c 7c 20 69 6e 20 74 68 65 20 66   the || in the f
35af0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
35b00 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ). */.  assert( 
35b10 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43 65 6c 6c  sz==pPage->xCell
35b20 53 69 7a 65 28 70 50 61 67 65 2c 20 70 43 65 6c  Size(pPage, pCel
35b30 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20 26 26 20  l) || (sz==8 && 
35b40 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a 20 20 69  iChild>0) );.  i
35b50 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  f( pPage->nOverf
35b60 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67  low || sz+2>pPag
35b70 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20  e->nFree ){.    
35b80 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20  if( pTemp ){.   
35b90 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c     memcpy(pTemp,
35ba0 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20   pCell, sz);.   
35bb0 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70     pCell = pTemp
35bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35bd0 69 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20  iChild ){.      
35be0 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20  put4byte(pCell, 
35bf0 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a 20  iChild);.    }. 
35c00 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f     j = pPage->nO
35c10 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61  verflow++;.    a
35c20 73 73 65 72 74 28 20 6a 3c 28 69 6e 74 29 28 73  ssert( j<(int)(s
35c30 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f  izeof(pPage->apO
35c40 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50 61 67  vfl)/sizeof(pPag
35c50 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29 29 20 29  e->apOvfl[0])) )
35c60 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 70 4f  ;.    pPage->apO
35c70 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c 6c 3b 0a  vfl[j] = pCell;.
35c80 20 20 20 20 70 50 61 67 65 2d 3e 61 69 4f 76 66      pPage->aiOvf
35c90 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69 3b 0a 0a  l[j] = (u16)i;..
35ca0 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 75 6c 74      /* When mult
35cb0 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 6f  iple overflows o
35cc0 63 63 75 72 2c 20 74 68 65 79 20 61 72 65 20 61  ccur, they are a
35cd0 6c 77 61 79 73 20 73 65 71 75 65 6e 74 69 61 6c  lways sequential
35ce0 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a 2a 20 73   and in.    ** s
35cf0 6f 72 74 65 64 20 6f 72 64 65 72 2e 20 20 54 68  orted order.  Th
35d00 69 73 20 69 6e 76 61 72 69 61 6e 74 73 20 61 72  is invariants ar
35d10 69 73 65 20 62 65 63 61 75 73 65 20 6d 75 6c 74  ise because mult
35d20 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 73 20 63  iple overflows c
35d30 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 6f  an.    ** only o
35d40 63 63 75 72 20 77 68 65 6e 20 69 6e 73 65 72 74  ccur when insert
35d50 69 6e 67 20 64 69 76 69 64 65 72 20 63 65 6c 6c  ing divider cell
35d60 73 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e  s into the paren
35d70 74 20 70 61 67 65 20 64 75 72 69 6e 67 0a 20 20  t page during.  
35d80 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2c 20    ** balancing, 
35d90 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 73  and the dividers
35da0 20 61 72 65 20 61 64 6a 61 63 65 6e 74 20 61 6e   are adjacent an
35db0 64 20 73 6f 72 74 65 64 2e 0a 20 20 20 20 2a 2f  d sorted..    */
35dc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d  .    assert( j==
35dd0 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61 69 4f 76  0 || pPage->aiOv
35de0 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29 69 20 29  fl[j-1]<(u16)i )
35df0 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20 69  ; /* Overflows i
35e00 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20 2a  n sorted order *
35e10 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d  /.    assert( j=
35e20 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67 65 2d 3e  =0 || i==pPage->
35e30 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31 20 29 3b  aiOvfl[j-1]+1 );
35e40 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 73 20     /* Overflows 
35e50 61 72 65 20 73 65 71 75 65 6e 74 69 61 6c 20 2a  are sequential *
35e60 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
35e70 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
35e80 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
35e90 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  >pDbPage);.    i
35ea0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
35eb0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 43 20 3d   ){.      *pRC =
35ec0 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74 75 72   rc;.      retur
35ed0 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  n;.    }.    ass
35ee0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
35ef0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
35f00 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
35f10 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
35f20 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 61 73 73  ->aData;.    ass
35f30 65 72 74 28 20 26 64 61 74 61 5b 70 50 61 67 65  ert( &data[pPage
35f40 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d 3d 3d 70  ->cellOffset]==p
35f50 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 29  Page->aCellIdx )
35f60 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  ;.    rc = alloc
35f70 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
35f80 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20 20 20 69  sz, &idx);.    i
35f90 66 28 20 72 63 20 29 7b 20 2a 70 52 43 20 3d 20  f( rc ){ *pRC = 
35fa0 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d 0a 20 20  rc; return; }.  
35fb0 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f 63 61 74    /* The allocat
35fc0 65 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65  eSpace() routine
35fd0 20 67 75 61 72 61 6e 74 65 65 73 20 74 68 65 20   guarantees the 
35fe0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72  following proper
35ff0 74 69 65 73 0a 20 20 20 20 2a 2a 20 69 66 20 69  ties.    ** if i
36000 74 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73  t returns succes
36010 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20 20 61 73  sfully */.    as
36020 73 65 72 74 28 20 69 64 78 20 3e 3d 20 30 20 29  sert( idx >= 0 )
36030 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
36040 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c  x >= pPage->cell
36050 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e  Offset+2*pPage->
36060 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f 52 52 55  nCell+2 || CORRU
36070 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 61 73 73  PT_DB );.    ass
36080 65 72 74 28 20 69 64 78 2b 73 7a 20 3c 3d 20 28  ert( idx+sz <= (
36090 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
360a0 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
360b0 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d    pPage->nFree -
360c0 3d 20 28 75 31 36 29 28 32 20 2b 20 73 7a 29 3b  = (u16)(2 + sz);
360d0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
360e0 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c 2c 20 73  a[idx], pCell, s
360f0 7a 29 3b 0a 20 20 20 20 69 66 28 20 69 43 68 69  z);.    if( iChi
36100 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  ld ){.      put4
36110 62 79 74 65 28 26 64 61 74 61 5b 69 64 78 5d 2c  byte(&data[idx],
36120 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 7d 0a   iChild);.    }.
36130 20 20 20 20 70 49 6e 73 20 3d 20 70 50 61 67 65      pIns = pPage
36140 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20 69 2a 32  ->aCellIdx + i*2
36150 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 49  ;.    memmove(pI
36160 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32 2a 28 70  ns+2, pIns, 2*(p
36170 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 69 29  Page->nCell - i)
36180 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28  );.    put2byte(
36190 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20 20 20 20  pIns, idx);.    
361a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a  pPage->nCell++;.
361b0 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d 65 6e 74      /* increment
361c0 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 20   the cell count 
361d0 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b 2b 64 61  */.    if( (++da
361e0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
361f0 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20 64 61 74  set+4])==0 ) dat
36200 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
36210 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20 61 73 73  et+3]++;.    ass
36220 65 72 74 28 20 67 65 74 32 62 79 74 65 28 26 64  ert( get2byte(&d
36230 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
36240 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61 67 65 2d  fset+3])==pPage-
36250 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66 6e 64 65  >nCell );.#ifnde
36260 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
36270 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
36280 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
36290 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
362a0 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
362b0 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
362c0 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
362d0 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
362e0 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
362f0 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
36300 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
36310 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
36320 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
36330 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c     ptrmapPutOvfl
36340 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
36350 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d 0a 23 65  , pRC);.    }.#e
36360 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ndif.  }.}../*.*
36370 2a 20 41 20 43 65 6c 6c 41 72 72 61 79 20 6f 62  * A CellArray ob
36380 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
36390 63 61 63 68 65 20 6f 66 20 70 6f 69 6e 74 65 72  cache of pointer
363a0 73 20 61 6e 64 20 73 69 7a 65 73 20 66 6f 72 20  s and sizes for 
363b0 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74 69 76 65  a.** consecutive
363c0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 63 65 6c   sequence of cel
363d0 6c 73 20 74 68 61 74 20 6d 69 67 68 74 20 62 65  ls that might be
363e0 20 68 65 6c 64 20 6d 75 6c 74 69 70 6c 65 20 70   held multiple p
363f0 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ages..*/.typedef
36400 20 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61   struct CellArra
36410 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a 73 74 72  y CellArray;.str
36420 75 63 74 20 43 65 6c 6c 41 72 72 61 79 20 7b 0a  uct CellArray {.
36430 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20    int nCell;    
36440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
36450 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20  ber of cells in 
36460 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 4d 65  apCell[] */.  Me
36470 6d 50 61 67 65 20 2a 70 52 65 66 3b 20 20 20 20  mPage *pRef;    
36480 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
36490 63 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ce page */.  u8 
364a0 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20  **apCell;       
364b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
364c0 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
364d0 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
364e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l;            /*
364f0 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61   Local size of a
36500 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65  ll cells in apCe
36510 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ll[] */.};../*.*
36520 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
36530 63 65 6c 6c 20 73 69 7a 65 73 20 61 74 20 69 64  cell sizes at id
36540 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e 2c 20 69  x, idx+1, ..., i
36550 64 78 2b 4e 2d 31 20 68 61 76 65 20 62 65 65 6e  dx+N-1 have been
36560 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e 0a 2a 2f  .** computed..*/
36570 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 6f 70  .static void pop
36580 75 6c 61 74 65 43 65 6c 6c 43 61 63 68 65 28 43  ulateCellCache(C
36590 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74  ellArray *p, int
365a0 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b 0a 20 20   idx, int N){.  
365b0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
365c0 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c  & idx+N<=p->nCel
365d0 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e  l );.  while( N>
365e0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
365f0 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 21   p->apCell[idx]!
36600 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  =0 );.    if( p-
36610 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 30 20  >szCell[idx]==0 
36620 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 7a 43 65  ){.      p->szCe
36630 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e 70 52 65  ll[idx] = p->pRe
36640 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e  f->xCellSize(p->
36650 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b  pRef, p->apCell[
36660 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  idx]);.    }else
36670 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
36680 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 0a 20 20  CORRUPT_DB ||.  
36690 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 73              p->s
366a0 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70 2d 3e 70  zCell[idx]==p->p
366b0 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
366c0 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
366d0 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20 20 20 7d  l[idx]) );.    }
366e0 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20 20 20 20  .    idx++;.    
366f0 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  N--;.  }.}../*.*
36700 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
36710 65 20 6f 66 20 74 68 65 20 4e 74 68 20 65 6c 65  e of the Nth ele
36720 6d 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  ment of the cell
36730 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61 74 69 63   array.*/.static
36740 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
36750 20 75 31 36 20 63 6f 6d 70 75 74 65 43 65 6c 6c   u16 computeCell
36760 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79 20 2a  Size(CellArray *
36770 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73  p, int N){.  ass
36780 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70  ert( N>=0 && N<p
36790 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
367a0 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  ert( p->szCell[N
367b0 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 73 7a 43  ]==0 );.  p->szC
367c0 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70 52 65 66  ell[N] = p->pRef
367d0 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70  ->xCellSize(p->p
367e0 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 4e  Ref, p->apCell[N
367f0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  ]);.  return p->
36800 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61  szCell[N];.}.sta
36810 74 69 63 20 75 31 36 20 63 61 63 68 65 64 43 65  tic u16 cachedCe
36820 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61 79  llSize(CellArray
36830 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
36840 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20 4e  ssert( N>=0 && N
36850 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 69  <p->nCell );.  i
36860 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20  f( p->szCell[N] 
36870 29 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65  ) return p->szCe
36880 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75 72 6e 20  ll[N];.  return 
36890 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28  computeCellSize(
368a0 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, N);.}../*.** 
368b0 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63  Array apCell[] c
368c0 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74 65 72 73  ontains pointers
368d0 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74 72 65 65   to nCell b-tree
368e0 20 70 61 67 65 20 63 65 6c 6c 73 2e 20 54 68 65   page cells. The
368f0 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d 20 61 72   .** szCell[] ar
36900 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ray contains the
36910 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
36920 66 20 65 61 63 68 20 63 65 6c 6c 2e 20 54 68 69  f each cell. Thi
36930 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
36940 70 6c 61 63 65 73 20 74 68 65 20 63 75 72 72 65  places the curre
36950 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  nt contents of p
36960 61 67 65 20 70 50 67 20 77 69 74 68 20 74 68 65  age pPg with the
36970 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
36980 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61 79 2e 0a   cell.** array..
36990 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66 20 74 68  **.** Some of th
369a0 65 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  e cells in apCel
369b0 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65 6e 74 6c  l[] may currentl
369c0 79 20 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70  y be stored in p
369d0 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  Pg. This.** func
369e0 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72 6f 75 6e  tion works aroun
369f0 64 20 70 72 6f 62 6c 65 6d 73 20 63 61 75 73 65  d problems cause
36a00 64 20 62 79 20 74 68 69 73 20 62 79 20 6d 61 6b  d by this by mak
36a10 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 61 6e  ing a copy of an
36a20 79 20 0a 2a 2a 20 73 75 63 68 20 63 65 6c 6c 73  y .** such cells
36a30 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69 74   before overwrit
36a40 69 6e 67 20 74 68 65 20 70 61 67 65 20 64 61 74  ing the page dat
36a50 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4d 65 6d  a..**.** The Mem
36a60 50 61 67 65 2e 6e 46 72 65 65 20 66 69 65 6c 64  Page.nFree field
36a70 20 69 73 20 69 6e 76 61 6c 69 64 61 74 65 64 20   is invalidated 
36a80 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
36a90 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
36aa0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
36ab0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
36ac0 73 65 74 20 69 74 20 63 6f 72 72 65 63 74 6c 79  set it correctly
36ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36ae0 72 65 62 75 69 6c 64 50 61 67 65 28 0a 20 20 4d  rebuildPage(.  M
36af0 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
36b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36b10 2a 20 45 64 69 74 20 74 68 69 73 20 70 61 67 65  * Edit this page
36b20 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c   */.  int nCell,
36b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b40 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c 20 6e        /* Final n
36b50 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
36b60 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  n page */.  u8 *
36b70 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  *apCell,        
36b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
36b90 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
36ba0 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 20 20  .  u16 *szCell  
36bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bc0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
36bd0 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a 29 7b 0a  ell sizes */.){.
36be0 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20    const int hdr 
36bf0 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74  = pPg->hdrOffset
36c00 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  ;          /* Of
36c10 66 73 65 74 20 6f 66 20 68 65 61 64 65 72 20 6f  fset of header o
36c20 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38 20 2a 20  n pPg */.  u8 * 
36c30 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
36c40 67 2d 3e 61 44 61 74 61 3b 20 20 20 20 20 20 20  g->aData;       
36c50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
36c60 6f 20 64 61 74 61 20 66 6f 72 20 70 50 67 20 2a  o data for pPg *
36c70 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 75 73  /.  const int us
36c80 61 62 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ableSize = pPg->
36c90 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
36ca0 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45  .  u8 * const pE
36cb0 6e 64 20 3d 20 26 61 44 61 74 61 5b 75 73 61 62  nd = &aData[usab
36cc0 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 69  leSize];.  int i
36cd0 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  ;.  u8 *pCellptr
36ce0 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c 49 64 78   = pPg->aCellIdx
36cf0 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20 3d 20 73  ;.  u8 *pTmp = s
36d00 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
36d10 70 61 63 65 28 70 50 67 2d 3e 70 42 74 2d 3e 70  pace(pPg->pBt->p
36d20 50 61 67 65 72 29 3b 0a 20 20 75 38 20 2a 70 44  Pager);.  u8 *pD
36d30 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67 65 74 32  ata;..  i = get2
36d40 62 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b  byte(&aData[hdr+
36d50 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70  5]);.  memcpy(&p
36d60 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74 61 5b 69  Tmp[i], &aData[i
36d70 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  ], usableSize - 
36d80 69 29 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 70  i);..  pData = p
36d90 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  End;.  for(i=0; 
36da0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
36db0 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 61     u8 *pCell = a
36dc0 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66  pCell[i];.    if
36dd0 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49 4e 28  ( SQLITE_WITHIN(
36de0 70 43 65 6c 6c 2c 61 44 61 74 61 2c 70 45 6e 64  pCell,aData,pEnd
36df0 29 20 29 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ) ){.      pCell
36e00 20 3d 20 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d   = &pTmp[pCell -
36e10 20 61 44 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20   aData];.    }. 
36e20 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 43 65     pData -= szCe
36e30 6c 6c 5b 69 5d 3b 0a 20 20 20 20 70 75 74 32 62  ll[i];.    put2b
36e40 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
36e50 44 61 74 61 20 2d 20 61 44 61 74 61 29 29 3b 0a  Data - aData));.
36e60 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
36e70 32 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  2;.    if( pData
36e80 20 3c 20 70 43 65 6c 6c 70 74 72 20 29 20 72 65   < pCellptr ) re
36e90 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
36ea0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65  UPT_BKPT;.    me
36eb0 6d 63 70 79 28 70 44 61 74 61 2c 20 70 43 65 6c  mcpy(pData, pCel
36ec0 6c 2c 20 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20  l, szCell[i]);. 
36ed0 20 20 20 61 73 73 65 72 74 28 20 73 7a 43 65 6c     assert( szCel
36ee0 6c 5b 69 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c  l[i]==pPg->xCell
36ef0 53 69 7a 65 28 70 50 67 2c 20 70 43 65 6c 6c 29  Size(pPg, pCell)
36f00 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
36f10 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
36f20 73 7a 43 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e  szCell[i]!=pPg->
36f30 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43  xCellSize(pPg,pC
36f40 65 6c 6c 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ell) );.  }..  /
36f50 2a 20 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65  * The pPg->nFree
36f60 20 66 69 65 6c 64 20 69 73 20 6e 6f 77 20 73 65   field is now se
36f70 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54  t incorrectly. T
36f80 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66  he caller will f
36f90 69 78 20 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d  ix it. */.  pPg-
36fa0 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a  >nCell = nCell;.
36fb0 20 20 70 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77    pPg->nOverflow
36fc0 20 3d 20 30 3b 0a 0a 20 20 70 75 74 32 62 79 74   = 0;..  put2byt
36fd0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c  e(&aData[hdr+1],
36fe0 20 30 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28   0);.  put2byte(
36ff0 26 61 44 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70  &aData[hdr+3], p
37000 50 67 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75  Pg->nCell);.  pu
37010 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
37020 72 2b 35 5d 2c 20 70 44 61 74 61 20 2d 20 61 44  r+5], pData - aD
37030 61 74 61 29 3b 0a 20 20 61 44 61 74 61 5b 68 64  ata);.  aData[hd
37040 72 2b 37 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72  r+7] = 0x00;.  r
37050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
37070 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
37080 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73  s nCell pointers
37090 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73   to b-tree cells
370a0 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a  . Array szCell.*
370b0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  * contains the s
370c0 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20  ize in bytes of 
370d0 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e 20  each such cell. 
370e0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
370f0 74 65 6d 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64  tempts to .** ad
37100 64 20 74 68 65 20 63 65 6c 6c 73 20 73 74 6f 72  d the cells stor
37110 65 64 20 69 6e 20 74 68 65 20 61 72 72 61 79 20  ed in the array 
37120 74 6f 20 70 61 67 65 20 70 50 67 2e 20 49 66 20  to page pPg. If 
37130 69 74 20 63 61 6e 6e 6f 74 20 28 62 65 63 61 75  it cannot (becau
37140 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  se .** the page 
37150 6e 65 65 64 73 20 74 6f 20 62 65 20 64 65 66 72  needs to be defr
37160 61 67 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 20  agmented before 
37170 74 68 65 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66  the cells will f
37180 69 74 29 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a  it), non-zero.**
37190 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
371a0 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
371b0 63 65 6c 6c 73 20 61 72 65 20 61 64 64 65 64 20  cells are added 
371c0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65  successfully, ze
371d0 72 6f 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  ro is.** returne
371e0 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
371f0 74 20 70 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74  t pCellptr point
37200 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  s to the first e
37210 6e 74 72 79 20 69 6e 20 74 68 65 20 63 65 6c 6c  ntry in the cell
37220 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 0a 2a  -pointer array.*
37230 2a 20 28 70 61 72 74 20 6f 66 20 70 61 67 65 20  * (part of page 
37240 70 50 67 29 20 74 6f 20 70 6f 70 75 6c 61 74 65  pPg) to populate
37250 2e 20 41 66 74 65 72 20 63 65 6c 6c 20 61 70 43  . After cell apC
37260 65 6c 6c 5b 30 5d 20 69 73 20 77 72 69 74 74 65  ell[0] is writte
37270 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65  n to the.** page
37280 20 62 6f 64 79 2c 20 61 20 31 36 2d 62 69 74 20   body, a 16-bit 
37290 6f 66 66 73 65 74 20 69 73 20 77 72 69 74 74 65  offset is writte
372a0 6e 20 74 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41  n to pCellptr. A
372b0 6e 64 20 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61  nd so on, for ea
372c0 63 68 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68  ch.** cell in th
372d0 65 20 61 72 72 61 79 2e 20 49 74 20 69 73 20 74  e array. It is t
372e0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
372f0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
37300 74 6f 20 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61  to ensure.** tha
37310 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
37320 6f 76 65 72 77 72 69 74 65 20 74 68 69 73 20 70  overwrite this p
37330 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d  art of the cell-
37340 70 6f 69 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a  pointer array..*
37350 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66  *.** When this f
37360 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
37370 64 2c 20 2a 70 70 44 61 74 61 20 70 6f 69 6e 74  d, *ppData point
37380 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
37390 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e  f the .** conten
373a0 74 20 61 72 65 61 20 6f 6e 20 70 61 67 65 20 70  t area on page p
373b0 50 67 2e 20 49 66 20 74 68 65 20 73 69 7a 65 20  Pg. If the size 
373c0 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61  of the content a
373d0 72 65 61 20 69 73 20 65 78 74 65 6e 64 65 64 2c  rea is extended,
373e0 0a 2a 2a 20 2a 70 70 44 61 74 61 20 69 73 20 75  .** *ppData is u
373f0 70 64 61 74 65 64 20 74 6f 20 70 6f 69 6e 74 20  pdated to point 
37400 74 6f 20 74 68 65 20 6e 65 77 20 73 74 61 72 74  to the new start
37410 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   of the content 
37420 61 72 65 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72  area.** before r
37430 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
37440 46 69 6e 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e  Finally, argumen
37450 74 20 70 42 65 67 69 6e 20 70 6f 69 6e 74 73 20  t pBegin points 
37460 74 6f 20 74 68 65 20 62 79 74 65 20 69 6d 6d 65  to the byte imme
37470 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
37480 67 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  g the.** end of 
37490 74 68 65 20 73 70 61 63 65 20 72 65 71 75 69 72  the space requir
374a0 65 64 20 62 79 20 74 68 69 73 20 70 61 67 65 20  ed by this page 
374b0 66 6f 72 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69  for the cell-poi
374c0 6e 74 65 72 20 61 72 65 61 20 28 66 6f 72 0a 2a  nter area (for.*
374d0 2a 20 61 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f  * all cells - no
374e0 74 20 6a 75 73 74 20 74 68 6f 73 65 20 69 6e 73  t just those ins
374f0 65 72 74 65 64 20 62 79 20 74 68 65 20 63 75 72  erted by the cur
37500 72 65 6e 74 20 63 61 6c 6c 29 2e 20 49 66 20 74  rent call). If t
37510 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72  he content.** ar
37520 65 61 20 6d 75 73 74 20 62 65 20 65 78 74 65 6e  ea must be exten
37530 64 65 64 20 74 6f 20 62 65 66 6f 72 65 20 74 68  ded to before th
37540 69 73 20 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65  is point in orde
37550 72 20 74 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20  r to accomodate 
37560 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20  all.** cells in 
37570 61 70 43 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74  apCell[], then t
37580 68 65 20 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20  he cells do not 
37590 66 69 74 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f  fit and non-zero
375a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
375b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
375c0 49 6e 73 65 72 74 41 72 72 61 79 28 0a 20 20 4d  InsertArray(.  M
375d0 65 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20  emPage *pPg,    
375e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
375f0 2a 20 50 61 67 65 20 74 6f 20 61 64 64 20 63 65  * Page to add ce
37600 6c 6c 73 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a  lls to */.  u8 *
37610 70 42 65 67 69 6e 2c 20 20 20 20 20 20 20 20 20  pBegin,         
37620 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
37630 6e 64 20 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74  nd of cell-point
37640 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38  er array */.  u8
37650 20 2a 2a 70 70 44 61 74 61 2c 20 20 20 20 20 20   **ppData,      
37660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37670 20 49 4e 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f   IN/OUT: Page co
37680 6e 74 65 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e  ntent -area poin
37690 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ter */.  u8 *pCe
376a0 6c 6c 70 74 72 2c 20 20 20 20 20 20 20 20 20 20  llptr,          
376b0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
376c0 74 65 72 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e  ter to cell-poin
376d0 74 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e  ter area */.  in
376e0 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20  t iFirst,       
376f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37700 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
37710 63 65 6c 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20  cell to add */. 
37720 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
37730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
37750 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 70 50  lls to add to pP
37760 67 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79  g */.  CellArray
37770 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20   *pCArray       
37780 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
37790 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20  of cells */.){. 
377a0 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 61 44   int i;.  u8 *aD
377b0 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
377c0 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 20 3d 20  ;.  u8 *pData = 
377d0 2a 70 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  *ppData;.  int i
377e0 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e  End = iFirst + n
377f0 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
37800 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 70 50  CORRUPT_DB || pP
37810 67 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 30 20  g->hdrOffset==0 
37820 29 3b 20 20 20 20 2f 2a 20 4e 65 76 65 72 20 63  );    /* Never c
37830 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 20  alled on page 1 
37840 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73  */.  for(i=iFirs
37850 74 3b 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b  t; i<iEnd; i++){
37860 0a 20 20 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b  .    int sz, rc;
37870 0a 20 20 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a  .    u8 *pSlot;.
37880 20 20 20 20 73 7a 20 3d 20 63 61 63 68 65 64 43      sz = cachedC
37890 65 6c 6c 53 69 7a 65 28 70 43 41 72 72 61 79 2c  ellSize(pCArray,
378a0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 28 61 44   i);.    if( (aD
378b0 61 74 61 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61  ata[1]==0 && aDa
378c0 74 61 5b 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53  ta[2]==0) || (pS
378d0 6c 6f 74 20 3d 20 70 61 67 65 46 69 6e 64 53 6c  lot = pageFindSl
378e0 6f 74 28 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d  ot(pPg,sz,&rc))=
378f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  =0 ){.      pDat
37900 61 20 2d 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69  a -= sz;.      i
37910 66 28 20 70 44 61 74 61 3c 70 42 65 67 69 6e 20  f( pData<pBegin 
37920 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
37930 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b    pSlot = pData;
37940 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 70 53  .    }.    /* pS
37950 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61 79 2d  lot and pCArray-
37960 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20  >apCell[i] will 
37970 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20 6f 6e  never overlap on
37980 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20   a well-formed. 
37990 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20     ** database. 
379a0 20 42 75 74 20 74 68 65 79 20 6d 69 67 68 74 20   But they might 
379b0 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20 64 61  for a corrupt da
379c0 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65 20 75  tabase.  Hence u
379d0 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20 20 20  se memmove().   
379e0 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63 70 79   ** since memcpy
379f0 28 29 20 73 65 6e 64 73 20 53 49 47 41 42 4f 52  () sends SIGABOR
37a00 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70 70 69  T with overlappi
37a10 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20 4f 70  ng buffers on Op
37a20 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61 73 73  enBSD */.    ass
37a30 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a 29 3c  ert( (pSlot+sz)<
37a40 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c  =pCArray->apCell
37a50 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  [i].         || 
37a60 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61 79 2d  pSlot>=(pCArray-
37a70 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20  >apCell[i]+sz). 
37a80 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55          || CORRU
37a90 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d 65 6d  PT_DB );.    mem
37aa0 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43 41 72  move(pSlot, pCAr
37ab0 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20  ray->apCell[i], 
37ac0 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  sz);.    put2byt
37ad0 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c  e(pCellptr, (pSl
37ae0 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20  ot - aData));.  
37af0 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b    pCellptr += 2;
37b00 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d  .  }.  *ppData =
37b10 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75 72 6e   pData;.  return
37b20 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72   0;.}../*.** Arr
37b30 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74  ay apCell[] cont
37b40 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74  ains nCell point
37b50 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20 63 65  ers to b-tree ce
37b60 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43 65 6c  lls. Array szCel
37b70 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  l .** contains t
37b80 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  he size in bytes
37b90 20 6f 66 20 65 61 63 68 20 73 75 63 68 20 63 65   of each such ce
37ba0 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
37bb0 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20 73 70  n adds the.** sp
37bc0 61 63 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ace associated w
37bd0 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20 69 6e  ith each cell in
37be0 20 74 68 65 20 61 72 72 61 79 20 74 68 61 74 20   the array that 
37bf0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  is currently sto
37c00 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74  red .** within t
37c10 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67 20 74  he body of pPg t
37c20 6f 20 74 68 65 20 70 50 67 20 66 72 65 65 2d 6c  o the pPg free-l
37c30 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f  ist. The cell-po
37c40 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68 65 72  inters and other
37c50 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20 74 68  .** fields of th
37c60 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74 20 75  e page are not u
37c70 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  pdated..**.** Th
37c80 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
37c90 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  rns the total nu
37ca0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 61 64  mber of cells ad
37cb0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ded to the free-
37cc0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
37cd0 69 6e 74 20 70 61 67 65 46 72 65 65 41 72 72 61  int pageFreeArra
37ce0 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  y(.  MemPage *pP
37cf0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
37d00 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f 20       /* Page to 
37d10 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  edit */.  int iF
37d20 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  irst,           
37d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
37d40 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74  st cell to delet
37d50 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  e */.  int nCell
37d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37d70 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20         /* Cells 
37d80 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43  to delete */.  C
37d90 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61  ellArray *pCArra
37da0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y              /
37db0 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
37dc0 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f   */.){.  u8 * co
37dd0 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50 67 2d  nst aData = pPg-
37de0 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 20 63  >aData;.  u8 * c
37df0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
37e00 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61  ta[pPg->pBt->usa
37e10 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a  bleSize];.  u8 *
37e20 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20 3d 20   const pStart = 
37e30 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f  &aData[pPg->hdrO
37e40 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50 67 2d  ffset + 8 + pPg-
37e50 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
37e60 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a    int nRet = 0;.
37e70 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
37e80 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b 20 6e  End = iFirst + n
37e90 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65  Cell;.  u8 *pFre
37ea0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46  e = 0;.  int szF
37eb0 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  ree = 0;..  for(
37ec0 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64  i=iFirst; i<iEnd
37ed0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
37ee0 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d  pCell = pCArray-
37ef0 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >apCell[i];.    
37f00 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54 48 49  if( SQLITE_WITHI
37f10 4e 28 70 43 65 6c 6c 2c 20 70 53 74 61 72 74 2c  N(pCell, pStart,
37f20 20 70 45 6e 64 29 20 29 7b 0a 20 20 20 20 20 20   pEnd) ){.      
37f30 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 2f 2a  int sz;.      /*
37f40 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73 65 20   No need to use 
37f50 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 29  cachedCellSize()
37f60 20 68 65 72 65 2e 20 20 54 68 65 20 73 69 7a 65   here.  The size
37f70 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 74  s of all cells t
37f80 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 72 65  hat.      ** are
37f90 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 61 76   to be freed hav
37fa0 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  e already been c
37fb0 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c 65 20 64  omputing while d
37fc0 65 63 69 64 69 6e 67 20 77 68 69 63 68 0a 20 20  eciding which.  
37fd0 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e 65 65      ** cells nee
37fe0 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20 20 20  d freeing */.   
37ff0 20 20 20 73 7a 20 3d 20 70 43 41 72 72 61 79 2d     sz = pCArray-
38000 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61 73 73  >szCell[i];  ass
38010 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20 20 20  ert( sz>0 );.   
38020 20 20 20 69 66 28 20 70 46 72 65 65 21 3d 28 70     if( pFree!=(p
38030 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a 20 20  Cell + sz) ){.  
38040 20 20 20 20 20 20 69 66 28 20 70 46 72 65 65 20        if( pFree 
38050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
38060 65 72 74 28 20 70 46 72 65 65 3e 61 44 61 74 61  ert( pFree>aData
38070 20 26 26 20 28 70 46 72 65 65 20 2d 20 61 44 61   && (pFree - aDa
38080 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20 20  ta)<65536 );.   
38090 20 20 20 20 20 20 20 66 72 65 65 53 70 61 63 65         freeSpace
380a0 28 70 50 67 2c 20 28 75 31 36 29 28 70 46 72 65  (pPg, (u16)(pFre
380b0 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a 46 72  e - aData), szFr
380c0 65 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ee);.        }. 
380d0 20 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70         pFree = p
380e0 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a  Cell;.        sz
380f0 46 72 65 65 20 3d 20 73 7a 3b 0a 20 20 20 20 20  Free = sz;.     
38100 20 20 20 69 66 28 20 70 46 72 65 65 2b 73 7a 3e     if( pFree+sz>
38110 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30 3b  pEnd ) return 0;
38120 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
38130 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 70 43        pFree = pC
38140 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 73 7a 46  ell;.        szF
38150 72 65 65 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ree += sz;.     
38160 20 7d 0a 20 20 20 20 20 20 6e 52 65 74 2b 2b 3b   }.      nRet++;
38170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
38180 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 61 73   pFree ){.    as
38190 73 65 72 74 28 20 70 46 72 65 65 3e 61 44 61 74  sert( pFree>aDat
381a0 61 20 26 26 20 28 70 46 72 65 65 20 2d 20 61 44  a && (pFree - aD
381b0 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20 20  ata)<65536 );.  
381c0 20 20 66 72 65 65 53 70 61 63 65 28 70 50 67 2c    freeSpace(pPg,
381d0 20 28 75 31 36 29 28 70 46 72 65 65 20 2d 20 61   (u16)(pFree - a
381e0 44 61 74 61 29 2c 20 73 7a 46 72 65 65 29 3b 0a  Data), szFree);.
381f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 52 65    }.  return nRe
38200 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 61 70 43 65  t;.}../*.** apCe
38210 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
38220 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  ] contains point
38230 65 72 73 20 74 6f 20 61 6e 64 20 73 69 7a 65 73  ers to and sizes
38240 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
38250 20 74 68 65 0a 2a 2a 20 70 61 67 65 73 20 62 65   the.** pages be
38260 69 6e 67 20 62 61 6c 61 6e 63 65 64 2e 20 20 54  ing balanced.  T
38270 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2c  he current page,
38280 20 70 50 67 2c 20 68 61 73 20 70 50 67 2d 3e 6e   pPg, has pPg->n
38290 43 65 6c 6c 20 63 65 6c 6c 73 20 73 74 61 72 74  Cell cells start
382a0 69 6e 67 0a 2a 2a 20 77 69 74 68 20 61 70 43 65  ing.** with apCe
382b0 6c 6c 5b 69 4f 6c 64 5d 2e 20 20 41 66 74 65 72  ll[iOld].  After
382c0 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68 69 73   balancing, this
382d0 20 70 61 67 65 20 73 68 6f 75 6c 64 20 68 6f 6c   page should hol
382e0 64 20 6e 4e 65 77 20 63 65 6c 6c 73 0a 2a 2a 20  d nNew cells.** 
382f0 73 74 61 72 74 69 6e 67 20 61 74 20 61 70 43 65  starting at apCe
38300 6c 6c 5b 69 4e 65 77 5d 2e 0a 2a 2a 0a 2a 2a 20  ll[iNew]..**.** 
38310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
38320 65 73 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  es the necessary
38330 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
38340 70 50 67 20 73 6f 20 74 68 61 74 20 69 74 20 63  pPg so that it c
38350 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74 68 65 20 63  ontains.** the c
38360 6f 72 72 65 63 74 20 63 65 6c 6c 73 20 61 66 74  orrect cells aft
38370 65 72 20 62 65 69 6e 67 20 62 61 6c 61 6e 63 65  er being balance
38380 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 50 67  d..**.** The pPg
38390 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  ->nFree field is
383a0 20 69 6e 76 61 6c 69 64 20 77 68 65 6e 20 74 68   invalid when th
383b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
383c0 72 6e 73 2e 20 49 74 20 69 73 20 74 68 65 0a 2a  rns. It is the.*
383d0 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
383e0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
383f0 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63 74  o set it correct
38400 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
38410 74 20 65 64 69 74 50 61 67 65 28 0a 20 20 4d 65  t editPage(.  Me
38420 6d 50 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20  mPage *pPg,     
38430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38440 20 45 64 69 74 20 74 68 69 73 20 70 61 67