/ Hex Artifact Content
Login

Artifact 5d93e2477acb99d50a8b045f2e26a0be3d7751fe:


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 64  MEM;.          d
13f30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13f40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 0;.          g
13f50 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  oto btree_open_o
13f60 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
13f70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
13f80 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13f90 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
13fa0 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d      pBt->pNext =
13fb0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
13fc0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
13fd0 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20  acheList);.     
13fe0 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64   GLOBAL(BtShared
13ff0 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43  *,sqlite3SharedC
14000 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 3b  acheList) = pBt;
14010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14020 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
14030 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23  Shared);.    }.#
14040 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21  endif.  }..#if !
14050 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
14060 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
14070 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
14080 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
14090 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e 65  ).  /* If the ne
140a0 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20 73  w Btree uses a s
140b0 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72 65  harable pBtShare
140c0 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65  d, then link the
140d0 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65 20   new.  ** Btree 
140e0 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  into the list of
140f0 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42 74   all sharable Bt
14100 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61 6d  rees for the sam
14110 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20  e connection..  
14120 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 6b  ** The list is k
14130 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  ept in ascending
14140 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61 64   order by pBt ad
14150 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  dress..  */.  if
14160 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b  ( p->sharable ){
14170 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
14180 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20 20  Btree *pSib;.   
14190 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
141a0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nDb; i++){.     
141b0 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62 2d   if( (pSib = db-
141c0 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20  >aDb[i].pBt)!=0 
141d0 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62 6c  && pSib->sharabl
141e0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  e ){.        whi
141f0 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76 20  le( pSib->pPrev 
14200 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e  ){ pSib = pSib->
14210 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20 20  pPrev; }.       
14220 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69 62   if( p->pBt<pSib
14230 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
14240 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53     p->pNext = pS
14250 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  ib;.          p-
14260 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
14270 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72 65        pSib->pPre
14280 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d  v = p;.        }
14290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
142a0 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65  while( pSib->pNe
142b0 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65 78  xt && pSib->pNex
142c0 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b  t->pBt<p->pBt ){
142d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 69  .            pSi
142e0 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b  b = pSib->pNext;
142f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14300 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20         p->pNext 
14310 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSib->pNext;. 
14320 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72 65           p->pPre
14330 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  v = pSib;.      
14340 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74      if( p->pNext
14350 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
14360 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  p->pNext->pPrev 
14370 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = p;.          }
14380 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
14390 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20 20  >pNext = p;.    
143a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
143b0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
143c0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
143d0 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62  *ppBtree = p;..b
143e0 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20  tree_open_out:. 
143f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14400 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  OK ){.    if( pB
14410 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72  t && pBt->pPager
14420 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14430 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
14440 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  >pPager);.    }.
14450 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14460 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pBt);.    sqlit
14470 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
14480 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20 20  *ppBtree = 0;.  
14490 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
144a0 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73 20   the B-Tree was 
144b0 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70 65  successfully ope
144c0 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61 67  ned, set the pag
144d0 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74 6f  er-cache size to
144e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
144f0 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70  ult value. Excep
14500 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  t, when opening 
14510 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73  on an existing s
14520 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63 68  hared pager-cach
14530 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f 74  e,.    ** do not
14540 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   change the page
14550 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20 20  r-cache size..  
14560 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c    */.    if( sql
14570 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
14580 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a 20  p, 0, 0)==0 ){. 
14590 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
145a0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 2d  rSetCachesize(p-
145b0 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51  >pBt->pPager, SQ
145c0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41 43  LITE_DEFAULT_CAC
145d0 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d 0a  HE_SIZE);.    }.
145e0 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78 4f    }.  if( mutexO
145f0 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  pen ){.    asser
14600 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
14610 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29  _held(mutexOpen)
14620 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
14630 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14640 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72 65  xOpen);.  }.  re
14650 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14660 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
14670 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
14680 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74 20  unter.  When it 
14690 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a  reaches zero,.**
146a0 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53 68   remove the BtSh
146b0 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20 66  ared structure f
146c0 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67 20  rom the sharing 
146d0 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  list.  Return.**
146e0 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74 53   true if the BtS
146f0 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74  hared.nRef count
14700 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f 20  er reaches zero 
14710 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66 61  and return.** fa
14720 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74 69  lse if it is sti
14730 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a  ll positive..*/.
14740 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f 76  static int remov
14750 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
14760 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14770 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14780 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14790 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  E.  MUTEX_LOGIC(
147a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
147b0 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74 53  pMaster; ).  BtS
147c0 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20  hared *pList;.  
147d0 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b  int removed = 0;
147e0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
147f0 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c  te3_mutex_nothel
14800 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
14810 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20  .  MUTEX_LOGIC( 
14820 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
14830 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
14840 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
14850 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71 6c  MASTER); ).  sql
14860 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14870 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74  (pMaster);.  pBt
14880 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
14890 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a  pBt->nRef<=0 ){.
148a0 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28 42      if( GLOBAL(B
148b0 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
148c0 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
148d0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 47  ==pBt ){.      G
148e0 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
148f0 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14900 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e 70  heList) = pBt->p
14910 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
14920 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 47  .      pList = G
14930 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c  LOBAL(BtShared*,
14940 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63  sqlite3SharedCac
14950 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 77  heList);.      w
14960 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c 69  hile( ALWAYS(pLi
14970 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  st) && pList->pN
14980 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
14990 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
149a0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
149b0 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
149c0 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20  (pList) ){.     
149d0 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20     pList->pNext 
149e0 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
149f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
14a00 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
14a10 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20 73  DSAFE ){.      s
14a20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
14a30 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20  e(pBt->mutex);. 
14a40 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64     }.    removed
14a50 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 1;.  }.  sqli
14a60 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
14a70 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
14a80 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73  rn removed;.#els
14a90 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  e.  return 1;.#e
14aa0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ndif.}../*.** Ma
14ab0 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54 6d  ke sure pBt->pTm
14ac0 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74 6f  pSpace points to
14ad0 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f   an allocation o
14ae0 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49  f .** MX_CELL_SI
14af0 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77 69  ZE(pBt) bytes wi
14b00 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65 66  th a 4-byte pref
14b10 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63 68  ix for a left-ch
14b20 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e 0a  ild.** pointer..
14b30 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
14b40 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
14b50 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
14b60 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54 6d  .  if( !pBt->pTm
14b70 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
14b80 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  t->pTmpSpace = s
14b90 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
14ba0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
14bb0 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f  );..    /* One o
14bc0 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70 42  f the uses of pB
14bd0 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73 20  t->pTmpSpace is 
14be0 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73 20  to format cells 
14bf0 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 6e  before.    ** in
14c00 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e 74  serting them int
14c10 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28 66  o a leaf page (f
14c20 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43 65  unction fillInCe
14c30 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a 2a  ll()). If.    **
14c40 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73 20   a cell is less 
14c50 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e 20  than 4 bytes in 
14c60 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75 6e  size, it is roun
14c70 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74 65  ded up to 4 byte
14c80 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20  s.    ** by the 
14c90 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65 73  various routines
14ca0 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74 65   that manipulate
14cb0 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20 57   binary cells. W
14cc0 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e 20  hich.    ** can 
14cd0 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49 6e  mean that fillIn
14ce0 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69 74  Cell() only init
14cf0 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72 73  ializes the firs
14d00 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a 20  t 2 or 3.    ** 
14d10 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70 61  bytes of pTmpSpa
14d20 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68 65  ce, but that the
14d30 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 61   first 4 bytes a
14d40 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 20  re copied from. 
14d50 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61 20     ** it into a 
14d60 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 54  database page. T
14d70 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75 61  his is not actua
14d80 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20 62  lly a problem, b
14d90 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  ut it.    ** doe
14da0 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72 69  s cause a valgri
14db0 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74 68  nd error when th
14dc0 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20 6f  e 1 or 2 bytes o
14dd0 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a 20  f unitialized . 
14de0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70 61     ** data is pa
14df0 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20 63  ssed to system c
14e00 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f 20  all write(). So 
14e10 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65 72  to avoid this er
14e20 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72 6f  ror,.    ** zero
14e30 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
14e40 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63 65  es of temp space
14e50 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   here..    **.  
14e60 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f 76    ** Also:  Prov
14e70 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20 6f  ide four bytes o
14e80 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70  f initialized sp
14e90 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a 20  ace before the. 
14ea0 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20     ** beginning 
14eb0 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73 20  of pTmpSpace as 
14ec0 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62 6c  an area availabl
14ed0 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68 65  e to prepend the
14ee0 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68 69  .    ** left-chi
14ef0 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ld pointer to th
14f00 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
14f10 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20   cell..    */.  
14f20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70 53    if( pBt->pTmpS
14f30 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  pace ){.      me
14f40 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53 70  mset(pBt->pTmpSp
14f50 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20  ace, 0, 8);.    
14f60 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
14f70 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 4;.    }.  }
14f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
14f90 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  he pBt->pTmpSpac
14fa0 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a  e allocation.*/.
14fb0 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
14fc0 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72  TempSpace(BtShar
14fd0 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20  ed *pBt){.  if( 
14fe0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14ff0 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
15000 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20 73  pace -= 4;.    s
15010 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
15020 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
15030 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61      pBt->pTmpSpa
15040 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ce = 0;.  }.}../
15050 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
15060 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
15070 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
15080 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
15090 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
150a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
150b0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
150c0 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
150d0 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
150e0 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
150f0 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
15100 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
15110 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15120 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15130 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15140 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15150 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d 3e  ;.  pCur = pBt->
15160 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65  pCursor;.  while
15170 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42 74  ( pCur ){.    Bt
15180 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70  Cursor *pTmp = p
15190 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d 20  Cur;.    pCur = 
151a0 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
151b0 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72 65   if( pTmp->pBtre
151c0 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73 71  e==p ){.      sq
151d0 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43  lite3BtreeCloseC
151e0 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20  ursor(pTmp);.   
151f0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c   }.  }..  /* Rol
15200 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65  lback any active
15210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
15220 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c 65   free the handle
15230 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a   structure..  **
15240 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   The call to sql
15250 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
15260 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74 61  k() drops any ta
15270 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62  ble-locks held b
15280 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e 64  y.  ** this hand
15290 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  le..  */.  sqlit
152a0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
152b0 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29  p, SQLITE_OK, 0)
152c0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
152d0 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20  Leave(p);..  /* 
152e0 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69  If there are sti
152f0 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e  ll other outstan
15300 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20  ding references 
15310 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  to the shared-bt
15320 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  ree.  ** structu
15330 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20  re, return now. 
15340 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  The remainder of
15350 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
15360 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20  cleans .  ** up 
15370 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
15380 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
15390 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d   p->wantToLock==
153a0 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d  0 && p->locked==
153b0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73  0 );.  if( !p->s
153c0 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76  harable || remov
153d0 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74  eFromSharingList
153e0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20  (pBt) ){.    /* 
153f0 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f  The pBt is no lo
15400 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72  nger on the shar
15410 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20  ing list, so we 
15420 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a  can access.    *
15430 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76  * it without hav
15440 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ing to hold the 
15450 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20  mutex..    **.  
15460 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61    ** Clean out a
15470 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74  nd delete the Bt
15480 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20  Shared object.. 
15490 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
154a0 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
154b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
154c0 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
154d0 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
154e0 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20  Bt->xFreeSchema 
154f0 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20  && pBt->pSchema 
15500 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46  ){.      pBt->xF
15510 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70  reeSchema(pBt->p
15520 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20  Schema);.    }. 
15530 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15540 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d 61  (0, pBt->pSchema
15550 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  );.    freeTempS
15560 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 73  pace(pBt);.    s
15570 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74 29  qlite3_free(pBt)
15580 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
15590 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
155a0 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72 74  D_CACHE.  assert
155b0 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
155c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
155d0 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a  p->locked==0 );.
155e0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
155f0 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74   p->pPrev->pNext
15600 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 69   = p->pNext;.  i
15610 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70 2d  f( p->pNext ) p-
15620 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
15630 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69 66  p->pPrev;.#endif
15640 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
15650 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15660 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15670 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 6f  * Change the "so
15680 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65  ft" limit on the
15690 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
156a0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   in the cache..*
156b0 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e 6d  * Unused and unm
156c0 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77 69  odified pages wi
156d0 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20 77  ll be recycled w
156e0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
156f0 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74 68  f.** pages in th
15700 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73 20  e cache exceeds 
15710 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74 2e  this soft limit.
15720 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20 6f    But the size o
15730 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 69  f the.** cache i
15740 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72 6f  s allowed to gro
15750 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  w larger than th
15760 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20 63  is limit if it c
15770 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74 79  ontains.** dirty
15780 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73 20   pages or pages 
15790 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65 20  still in active 
157a0 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  use..*/.int sqli
157b0 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65  te3BtreeSetCache
157c0 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
157d0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
157e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
157f0 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
15800 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
15810 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
15820 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
15830 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71  eeEnter(p);.  sq
15840 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15850 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  hesize(pBt->pPag
15860 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15870 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15880 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
15890 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
158a0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73 70  * Change the "sp
158b0 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  ill" limit on th
158c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
158d0 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
158e0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
158f0 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65 64   of pages exceed
15900 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75 72  s this limit dur
15910 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61 6e  ing a write tran
15920 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 20  saction,.** the 
15930 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74 65  pager might atte
15940 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20 70  mpt to "spill" p
15950 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  ages to the jour
15960 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a 20  nal early in.** 
15970 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75 70  order to free up
15980 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
15990 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
159a0 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e 74  d is the current
159b0 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49 66   spill size.  If
159c0 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64 0a   zero is passed.
159d0 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ** as an argumen
159e0 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61 72  t, no changes ar
159f0 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73 70  e made to the sp
15a00 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e 67  ill size setting
15a10 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d 78  , so.** using mx
15a20 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20 77  Page of 0 is a w
15a30 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65 20  ay to query the 
15a40 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73 69  current spill si
15a50 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ze..*/.int sqlit
15a60 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c 53  e3BtreeSetSpillS
15a70 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
15a80 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
15a90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15aa0 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  pBt;.  int res;.
15ab0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ac0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15ad0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15ae0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15af0 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73 71  r(p);.  res = sq
15b00 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70 69  lite3PagerSetSpi
15b10 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  llsize(pBt->pPag
15b20 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
15b30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15b40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  (p);.  return re
15b50 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  s;.}..#if SQLITE
15b60 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
15b70 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15b80 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 61  e limit on the a
15b90 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61 74  mount of the dat
15ba0 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74 20  abase file that 
15bb0 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72 79  may be.** memory
15bc0 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74 20   mapped..*/.int 
15bd0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 4d  sqlite3BtreeSetM
15be0 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20 2a  mapLimit(Btree *
15bf0 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
15c00 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53 68   szMmap){.  BtSh
15c10 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15c20 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
15c30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15c40 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15c50 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15c60 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
15c70 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c  te3PagerSetMmapL
15c80 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72  imit(pBt->pPager
15c90 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71 6c  , szMmap);.  sql
15ca0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
15cb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
15cc0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
15cd0 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
15ce0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
15cf0 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77  .** Change the w
15d00 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  ay data is synce
15d10 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64  d to disk in ord
15d20 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f  er to increase o
15d30 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f  r decrease.** ho
15d40 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62  w well the datab
15d50 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61  ase resists dama
15d60 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
15d70 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a  shes and power.*
15d80 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76  * failures.  Lev
15d90 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65  el 1 is the same
15da0 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73   as asynchronous
15db0 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63   (no syncs() occ
15dc0 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20  ur and.** there 
15dd0 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62  is a high probab
15de0 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29  ility of damage)
15df0 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65    Level 2 is the
15e00 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65   default.  There
15e10 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f  .** is a very lo
15e20 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70  w but non-zero p
15e30 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
15e40 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72  mage.  Level 3 r
15e50 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72  educes the.** pr
15e60 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
15e70 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f  age to near zero
15e80 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74   but with a writ
15e90 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65  e performance re
15ea0 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e  duction..*/.#ifn
15eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ec0 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e  PAGER_PRAGMAS.in
15ed0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65  t sqlite3BtreeSe
15ee0 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20 42  tPagerFlags(.  B
15ef0 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
15f00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
15f10 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73 61  ee to set the sa
15f20 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a 2f  fety level on */
15f30 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46 6c  .  unsigned pgFl
15f40 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61 72  ags       /* Var
15f50 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c 61  ious PAGER_* fla
15f60 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61  gs */.){.  BtSha
15f70 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
15f80 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
15f90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
15fa0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
15fb0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
15fc0 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
15fd0 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73 28  e3PagerSetFlags(
15fe0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 46  pBt->pPager, pgF
15ff0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
16000 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
16010 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16020 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16030 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
16040 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72 65  f the given btre
16050 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66 65  e is set to safe
16060 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20  ty level 1.  In 
16070 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20  other.** words, 
16080 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e  return TRUE if n
16090 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20  o sync() occurs 
160a0 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
160b0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
160c0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
160d0 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ed(Btree *p){.  
160e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
160f0 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
16100 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16110 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16120 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20  ->db->mutex) ); 
16130 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65   .  sqlite3Btree
16140 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
16150 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  rt( pBt && pBt->
16160 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d  pPager );.  rc =
16170 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73   sqlite3PagerNos
16180 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ync(pBt->pPager)
16190 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
161a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
161b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
161c0 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
161d0 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
161e0 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
161f0 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
16200 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20  er page..** Or, 
16210 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  if the page size
16220 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
16230 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e 20  n fixed, return 
16240 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20  SQLITE_READONLY 
16250 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61 6e  .** without chan
16260 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  ging anything..*
16270 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
16280 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
16290 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
162a0 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
162b0 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
162c0 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
162d0 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
162e0 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
162f0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
16300 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
16310 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
16320 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
16330 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
16340 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
16350 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
16360 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16370 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
16380 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
16390 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
163a0 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
163b0 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
163c0 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
163d0 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
163e0 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
163f0 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
16400 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
16410 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
16420 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16430 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
16440 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
16450 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
16460 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
16470 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ..**.** If the i
16480 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65 20  Fix!=0 then the 
16490 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
164a0 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20 73  ED flag is set s
164b0 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  o that the page 
164c0 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f  size.** and auto
164d0 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20  vacuum mode can 
164e0 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68 61  no longer be cha
164f0 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
16500 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
16510 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
16520 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e 74  nt pageSize, int
16530 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20 69   nReserve, int i
16540 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Fix){.  int rc =
16550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
16560 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
16570 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20  >pBt;.  assert( 
16580 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26 20  nReserve>=-1 && 
16590 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29 3b  nReserve<=255 );
165a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
165b0 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51 4c  nter(p);.#if SQL
165c0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
165d0 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42 74  if( nReserve>pBt
165e0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
165f0 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52   ) pBt->optimalR
16600 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52 65  eserve = (u8)nRe
16610 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16620 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
16630 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45  s & BTS_PAGESIZE
16640 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73 71  _FIXED ){.    sq
16650 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16660 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  p);.    return S
16670 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
16680 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65 72    }.  if( nReser
16690 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65 73  ve<0 ){.    nRes
166a0 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  erve = pBt->page
166b0 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
166c0 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73  leSize;.  }.  as
166d0 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
166e0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d 32  0 && nReserve<=2
166f0 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67 65  55 );.  if( page
16700 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
16710 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
16720 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a 20  X_PAGE_SIZE &&. 
16730 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69 7a         ((pageSiz
16740 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d 3d  e-1)&pageSize)==
16750 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
16760 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
16770 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
16780 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  ( !pBt->pCursor 
16790 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65  );.    pBt->page
167a0 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67 65  Size = (u32)page
167b0 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54 65  Size;.    freeTe
167c0 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
167d0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
167e0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
167f0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
16800 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52  Bt->pageSize, nR
16810 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e  eserve);.  pBt->
16820 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
16830 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75 31  ->pageSize - (u1
16840 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69 66  6)nReserve;.  if
16850 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62 74  ( iFix ) pBt->bt
16860 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
16870 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20  GESIZE_FIXED;.  
16880 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16890 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
168a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
168b0 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  rn the currently
168c0 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73 69   defined page si
168d0 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
168e0 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69 7a  3BtreeGetPageSiz
168f0 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  e(Btree *p){.  r
16900 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61  eturn p->pBt->pa
16910 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
16920 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16930 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c  s similar to sql
16940 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
16950 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74 68  rve(), except th
16960 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c  at it.** may onl
16970 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 69  y be called if i
16980 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
16990 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65 20  that the b-tree 
169a0 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64 79  mutex is already
169b0 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  .** held..**.** 
169c0 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20 69  This is useful i
169d0 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63 61  n one special ca
169e0 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75 70  se in the backup
169f0 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65 20   API code where 
16a00 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74  it is.** known t
16a10 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20 62  hat the shared b
16a20 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
16a30 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75 74  eld, but the mut
16a40 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ex on the .** da
16a50 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 68  tabase handle th
16a60 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f  at owns *p is no
16a70 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
16a80 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  if sqlite3BtreeE
16a90 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20 74  nter().** were t
16aa0 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74 20  o be called, it 
16ab0 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77 69  might collide wi
16ac0 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70  th some other op
16ad0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a  eration on the.*
16ae0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
16af0 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c 20  e that owns *p, 
16b00 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e 65  causing undefine
16b10 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69  d behavior..*/.i
16b20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
16b30 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78  etReserveNoMutex
16b40 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
16b50 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 73  t n;.  assert( s
16b60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16b70 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
16b80 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74   );.  n = p->pBt
16b90 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
16ba0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
16bb0 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
16bc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16bd0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
16be0 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65   of space at the
16bf0 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70 61   end of every pa
16c00 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20 69  ge that.** are i
16c10 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20  ntentually left 
16c20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69 73  unused.  This is
16c30 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22 20   the "reserved" 
16c40 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a 2a  space that is.**
16c50 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64 20   sometimes used 
16c60 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a  by extensions..*
16c70 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 48  *.** If SQLITE_H
16c80 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66 69  AS_MUTEX is defi
16c90 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75 6d  ned then the num
16ca0 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20  ber returned is 
16cb0 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f  the.** greater o
16cc0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65  f the current re
16cd0 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e 64  served space and
16ce0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65 71   the maximum req
16cf0 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72 76  uested.** reserv
16d00 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20  e space..*/.int 
16d10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4f  sqlite3BtreeGetO
16d20 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42 74  ptimalReserve(Bt
16d30 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16d40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16d50 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
16d60 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16d70 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70 29  eserveNoMutex(p)
16d80 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16d90 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28 20  HAS_CODEC.  if( 
16da0 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  n<p->pBt->optima
16db0 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20 70  lReserve ) n = p
16dc0 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16dd0 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20  serve;.#endif.  
16de0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
16df0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
16e00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ;.}.../*.** Set 
16e10 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  the maximum page
16e20 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61 74   count for a dat
16e30 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65 20  abase if mxPage 
16e40 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20  is positive..** 
16e50 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20 6d  No changes are m
16e60 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69 73  ade if mxPage is
16e70 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a   0 or negative..
16e80 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66  ** Regardless of
16e90 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 78   the value of mx
16ea0 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  Page, return the
16eb0 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16ec0 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  unt..*/.int sqli
16ed0 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65 43  te3BtreeMaxPageC
16ee0 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20 69  ount(Btree *p, i
16ef0 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e  nt mxPage){.  in
16f00 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t n;.  sqlite3Bt
16f10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e  reeEnter(p);.  n
16f20 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
16f30 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70  axPageCount(p->p
16f40 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
16f50 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
16f60 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
16f70 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
16f80 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53 45  * Set the BTS_SE
16f90 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61 67  CURE_DELETE flag
16fa0 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20 30   if newFlag is 0
16fb0 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46 6c   or 1.  If newFl
16fc0 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65  ag is -1,.** the
16fd0 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  n make no change
16fe0 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  s.  Always retur
16ff0 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
17000 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45  he BTS_SECURE_DE
17010 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20  LETE.** setting 
17020 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67 65  after the change
17030 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17040 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65 74  BtreeSecureDelet
17050 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
17060 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20  newFlag){.  int 
17070 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  b;.  if( p==0 ) 
17080 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69  return 0;.  sqli
17090 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
170a0 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67 3e  ;.  if( newFlag>
170b0 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74  =0 ){.    p->pBt
170c0 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e 42  ->btsFlags &= ~B
170d0 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
170e0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c 61  ;.    if( newFla
170f0 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46  g ) p->pBt->btsF
17100 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43 55  lags |= BTS_SECU
17110 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a  RE_DELETE;.  } .
17120 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62    b = (p->pBt->b
17130 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
17140 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b  CURE_DELETE)!=0;
17150 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
17160 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
17170 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  n b;.}../*.** Ch
17180 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76  ange the 'auto-v
17190 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20  acuum' property 
171a0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
171b0 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61 63   If the 'autoVac
171c0 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65  uum'.** paramete
171d0 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
171e0 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  hen auto-vacuum 
171f0 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e  mode is enabled.
17200 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20   If zero, it.** 
17210 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65  is disabled. The
17220 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66   default value f
17230 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  or the auto-vacu
17240 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a  um property is .
17250 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
17260 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41   the SQLITE_DEFA
17270 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d  ULT_AUTOVACUUM m
17280 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  acro..*/.int sql
17290 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74 6f  ite3BtreeSetAuto
172a0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c  Vacuum(Btree *p,
172b0 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29   int autoVacuum)
172c0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
172d0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
172e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
172f0 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a  READONLY;.#else.
17300 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
17310 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
17320 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17330 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61 75    u8 av = (u8)au
17340 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c  toVacuum;..  sql
17350 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17360 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  );.  if( (pBt->b
17370 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 41  tsFlags & BTS_PA
17380 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d 30  GESIZE_FIXED)!=0
17390 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d 70   && (av ?1:0)!=p
173a0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
173b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
173c0 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65  E_READONLY;.  }e
173d0 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75  lse{.    pBt->au
173e0 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f 31  toVacuum = av ?1
173f0 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  :0;.    pBt->inc
17400 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20  rVacuum = av==2 
17410 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ?1:0;.  }.  sqli
17420 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
17430 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
17440 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
17450 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
17460 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  of the 'auto-vac
17470 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20 49  uum' property. I
17480 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69 73  f auto-vacuum is
17490 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20 69   .** enabled 1 i
174a0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
174b0 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rwise 0..*/.int 
174c0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 41  sqlite3BtreeGetA
174d0 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20  utoVacuum(Btree 
174e0 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  *p){.#ifdef SQLI
174f0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
17500 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52 45  UM.  return BTRE
17510 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e  E_AUTOVACUUM_NON
17520 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72  E;.#else.  int r
17530 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
17540 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63 20  eEnter(p);.  rc 
17550 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42 74  = (.    (!p->pBt
17560 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42 54  ->autoVacuum)?BT
17570 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
17580 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42  ONE:.    (!p->pB
17590 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f 42  t->incrVacuum)?B
175a0 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
175b0 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f  FULL:.    BTREE_
175c0 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a  AUTOVACUUM_INCR.
175d0 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74    );.  sqlite3Bt
175e0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
175f0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
17600 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61  .}.../*.** Get a
17610 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 50   reference to pP
17620 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74 61  age1 of the data
17630 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69 73  base file.  This
17640 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63   will.** also ac
17650 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63 6b  quire a readlock
17660 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a   on that file..*
17670 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
17680 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
17690 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20 66  ccess.  If the f
176a0 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ile is not a.** 
176b0 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
176c0 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
176d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69  SQLITE_CORRUPT i
176e0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53  s returned..** S
176f0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
17700 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64 61  turned if the da
17710 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
17720 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  .  SQLITE_NOMEM.
17730 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ** is returned i
17740 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  f we run out of 
17750 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74  memory. .*/.stat
17760 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65  ic int lockBtree
17770 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
17780 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
17790 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
177a0 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66  t code from subf
177b0 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65  unctions */.  Me
177c0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20 20  mPage *pPage1;  
177d0 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66 20     /* Page 1 of 
177e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
177f0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
17800 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
17810 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17820 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
17830 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69 6c  /.  int nPageFil
17840 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  e = 0;   /* Numb
17850 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17860 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17870 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 48   */.  int nPageH
17880 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75  eader;     /* Nu
17890 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
178a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 63   the database ac
178b0 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20 2a  cording to hdr *
178c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
178d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
178e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
178f0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50   assert( pBt->pP
17900 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20  age1==0 );.  rc 
17910 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68  = sqlite3PagerSh
17920 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50  aredLock(pBt->pP
17930 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
17940 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
17950 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 62  urn rc;.  rc = b
17960 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
17970 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b   1, &pPage1, 0);
17980 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17990 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
179a0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20  ;..  /* Do some 
179b0 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70  checking to help
179c0 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   insure the file
179d0 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c   we opened reall
179e0 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69  y is.  ** a vali
179f0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
17a00 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d   .  */.  nPage =
17a10 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20 67   nPageHeader = g
17a20 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29  et4byte(28+(u8*)
17a30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a  pPage1->aData);.
17a40 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
17a50 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
17a60 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65 29  ger, &nPageFile)
17a70 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30  ;.  if( nPage==0
17a80 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75   || memcmp(24+(u
17a90 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61  8*)pPage1->aData
17aa0 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65 31  , 92+(u8*)pPage1
17ab0 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29 7b  ->aData,4)!=0 ){
17ac0 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61  .    nPage = nPa
17ad0 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66  geFile;.  }.  if
17ae0 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
17af0 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a 20   u32 pageSize;. 
17b00 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69 7a     u32 usableSiz
17b10 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
17b20 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
17b30 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
17b40 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a  E_NOTADB;.    /*
17b50 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
17b60 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65 72  43737-39999 Ever
17b70 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20 64  y valid SQLite d
17b80 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65 67  atabase file beg
17b90 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ins.    ** with 
17ba0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36  the following 16
17bb0 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29 3a   bytes (in hex):
17bc0 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34 20   53 51 4c 69 74 
17bd0 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20 36  65 20 66 6f 72 6
17be0 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20 32  d.    ** 61 74 2
17bf0 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20  0 33 00. */.    
17c00 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31  if( memcmp(page1
17c10 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20  , zMagicHeader, 
17c20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  16)!=0 ){.      
17c30 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
17c40 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23  failed;.    }..#
17c50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
17c60 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70 61  T_WAL.    if( pa
17c70 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20  ge1[18]>1 ){.   
17c80 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73     pBt->btsFlags
17c90 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c   |= BTS_READ_ONL
17ca0 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
17cb0 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a   page1[19]>1 ){.
17cc0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
17cd0 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
17ce0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
17cf0 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b  ( page1[18]>2 ){
17d00 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46  .      pBt->btsF
17d10 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41 44  lags |= BTS_READ
17d20 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20  _ONLY;.    }.   
17d30 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 32   if( page1[19]>2
17d40 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
17d50 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
17d60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
17d70 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65 72  If the write ver
17d80 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20 32  sion is set to 2
17d90 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  , this database 
17da0 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73 73  should be access
17db0 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c  ed.    ** in WAL
17dc0 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c 6f   mode. If the lo
17dd0 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  g is not already
17de0 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e   open, open it n
17df0 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a  ow. Then .    **
17e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17e10 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69 74  K and return wit
17e20 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67 20  hout populating 
17e30 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31 2e  BtShared.pPage1.
17e40 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c  .    ** The call
17e50 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73 20  er detects this 
17e60 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20 66  and calls this f
17e70 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54  unction again. T
17e80 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72 65  his is.    ** re
17e90 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76 65  quired as the ve
17ea0 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  rsion of page 1 
17eb0 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65  currently in the
17ec0 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20 20   page1 buffer.  
17ed0 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20    ** may not be 
17ee0 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73 69  the latest versi
17ef0 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20 62  on - there may b
17f00 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e  e a newer one in
17f10 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20   the log.    ** 
17f20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
17f30 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d   if( page1[19]==
17f40 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  2 && (pBt->btsFl
17f50 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c  ags & BTS_NO_WAL
17f60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
17f70 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  t isOpen = 0;.  
17f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
17f90 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42 74  PagerOpenWal(pBt
17fa0 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70 65  ->pPager, &isOpe
17fb0 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
17fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17fd0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
17fe0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17ff0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
18000 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  sOpen==0 ){.    
18010 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
18020 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
18030 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18040 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
18050 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
18060 41 44 42 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ADB;.    }.#endi
18070 66 0a 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  f..    /* EVIDEN
18080 43 45 2d 4f 46 3a 20 52 2d 31 35 34 36 35 2d 32  CE-OF: R-15465-2
18090 30 38 31 33 20 54 68 65 20 6d 61 78 69 6d 75 6d  0813 The maximum
180a0 20 61 6e 64 20 6d 69 6e 69 6d 75 6d 20 65 6d 62   and minimum emb
180b0 65 64 64 65 64 20 70 61 79 6c 6f 61 64 0a 20 20  edded payload.  
180c0 20 20 2a 2a 20 66 72 61 63 74 69 6f 6e 73 20 61    ** fractions a
180d0 6e 64 20 74 68 65 20 6c 65 61 66 20 70 61 79 6c  nd the leaf payl
180e0 6f 61 64 20 66 72 61 63 74 69 6f 6e 20 76 61 6c  oad fraction val
180f0 75 65 73 20 6d 75 73 74 20 62 65 20 36 34 2c 20  ues must be 64, 
18100 33 32 2c 20 61 6e 64 20 33 32 2e 0a 20 20 20 20  32, and 32..    
18110 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  **.    ** The or
18120 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
18130 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
18140 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
18150 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
18160 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
18170 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
18180 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
18190 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
181a0 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
181b0 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
181c0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
181d0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
181e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45  ;.    }.    /* E
181f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
18200 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
18210 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
18220 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
18230 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
18240 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
18250 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
18260 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
18270 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
18280 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
18290 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
182a0 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
182b0 61 67 65 53 69 7a 65 20 3d 20 28 70 61 67 65 31  ageSize = (page1
182c0 5b 31 36 5d 3c 3c 38 29 20 7c 20 28 70 61 67 65  [16]<<8) | (page
182d0 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20  1[17]<<16);.    
182e0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
182f0 52 2d 32 35 30 30 38 2d 32 31 36 38 38 20 54 68  R-25008-21688 Th
18300 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
18310 20 69 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74   is a power of t
18320 77 6f 0a 20 20 20 20 2a 2a 20 62 65 74 77 65 65  wo.    ** betwee
18330 6e 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 20  n 512 and 65536 
18340 69 6e 63 6c 75 73 69 76 65 2e 20 2a 2f 0a 20 20  inclusive. */.  
18350 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
18360 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
18370 0a 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a  .     || pageSiz
18380 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
18390 45 5f 53 49 5a 45 20 0a 20 20 20 20 20 7c 7c 20  E_SIZE .     || 
183a0 70 61 67 65 53 69 7a 65 3c 3d 32 35 36 20 0a 20  pageSize<=256 . 
183b0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
183c0 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
183d0 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ed;.    }.    as
183e0 73 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20  sert( (pageSize 
183f0 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 2f  & 7)==0 );.    /
18400 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18410 2d 35 39 33 31 30 2d 35 31 32 30 35 20 54 68 65  -59310-51205 The
18420 20 22 72 65 73 65 72 76 65 64 20 73 70 61 63 65   "reserved space
18430 22 20 73 69 7a 65 20 69 6e 20 74 68 65 20 31 2d  " size in the 1-
18440 62 79 74 65 0a 20 20 20 20 2a 2a 20 69 6e 74 65  byte.    ** inte
18450 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 32 30  ger at offset 20
18460 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
18470 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
18480 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 0a 20   at the end of. 
18490 20 20 20 2a 2a 20 65 61 63 68 20 70 61 67 65 20     ** each page 
184a0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 65  to reserve for e
184b0 78 74 65 6e 73 69 6f 6e 73 2e 20 0a 20 20 20 20  xtensions. .    
184c0 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  **.    ** EVIDEN
184d0 43 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34  CE-OF: R-37497-4
184e0 32 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66  2412 The size of
184f0 20 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65   the reserved re
18500 67 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 64  gion is.    ** d
18510 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
18520 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e   one-byte unsign
18530 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64  ed integer found
18540 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66   at an offset of
18550 20 32 30 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20   20.    ** into 
18560 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18570 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
18580 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 61   usableSize = pa
18590 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b 32  geSize - page1[2
185a0 30 5d 3b 0a 20 20 20 20 69 66 28 20 28 75 33 32  0];.    if( (u32
185b0 29 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d 3e  )pageSize!=pBt->
185c0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
185d0 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64 69    /* After readi
185e0 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
185f0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
18600 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61 67  e assuming a pag
18610 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a 20  e size.      ** 
18620 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67 65  of BtShared.page
18630 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64 69  Size, we have di
18640 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74 68  scovered that th
18650 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a 20  e page-size is. 
18660 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c 79       ** actually
18670 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f 63   pageSize. Unloc
18680 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
18690 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67 65  leave pBt->pPage
186a0 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a 65  1 at.      ** ze
186b0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ro and return SQ
186c0 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61 6c  LITE_OK. The cal
186d0 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74 68  ler will call th
186e0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  is function.    
186f0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 20    ** again with 
18700 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67 65  the correct page
18710 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  -size..      */.
18720 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
18730 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  e(pPage1);.     
18740 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18750 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
18760 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69       pBt->pageSi
18770 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
18780 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
18790 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  ce(pBt);.      r
187a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
187b0 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
187c0 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
187d0 61 67 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20  ageSize,.       
187e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187f0 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65              page
18800 53 69 7a 65 2d 75 73 61 62 6c 65 53 69 7a 65 29  Size-usableSize)
18810 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18820 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
18830 20 28 70 42 74 2d 3e 64 62 2d 3e 66 6c 61 67 73   (pBt->db->flags
18840 20 26 20 53 51 4c 49 54 45 5f 52 65 63 6f 76 65   & SQLITE_Recove
18850 72 79 4d 6f 64 65 29 3d 3d 30 20 26 26 20 6e 50  ryMode)==0 && nP
18860 61 67 65 3e 6e 50 61 67 65 46 69 6c 65 20 29 7b  age>nPageFile ){
18870 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
18880 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18890 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
188a0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
188b0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44     }.    /* EVID
188c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 33 31 32  ENCE-OF: R-28312
188d0 2d 36 34 37 30 34 20 48 6f 77 65 76 65 72 2c 20  -64704 However, 
188e0 74 68 65 20 75 73 61 62 6c 65 20 73 69 7a 65 20  the usable size 
188f0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  is not allowed t
18900 6f 0a 20 20 20 20 2a 2a 20 62 65 20 6c 65 73 73  o.    ** be less
18910 20 74 68 61 6e 20 34 38 30 2e 20 49 6e 20 6f 74   than 480. In ot
18920 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68  her words, if th
18930 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 35  e page size is 5
18940 31 32 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  12, then the.   
18950 20 2a 2a 20 72 65 73 65 72 76 65 64 20 73 70 61   ** reserved spa
18960 63 65 20 73 69 7a 65 20 63 61 6e 6e 6f 74 20 65  ce size cannot e
18970 78 63 65 65 64 20 33 32 2e 20 2a 2f 0a 20 20 20  xceed 32. */.   
18980 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c   if( usableSize<
18990 34 38 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  480 ){.      got
189a0 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
189b0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
189c0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
189d0 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74  ageSize;.    pBt
189e0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
189f0 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
18a00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
18a10 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
18a20 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
18a30 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
18a40 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
18a50 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
18a60 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
18a70 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
18a80 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
18a90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
18aa0 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
18ab0 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
18ac0 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
18ad0 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
18ae0 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
18af0 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
18b00 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
18b10 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
18b20 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
18b30 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
18b40 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
18b50 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
18b60 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
18b70 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
18b80 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
18b90 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
18ba0 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
18bb0 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
18bc0 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
18bd0 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
18be0 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
18bf0 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
18c00 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
18c10 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
18c20 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
18c30 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
18c40 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
18c50 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72  a 2-byte pointer
18c60 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68  , a header which
18c70 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20   is as much as. 
18c80 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e   ** 17 bytes lon
18c90 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20  g, 0 to N bytes 
18ca0 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20  of payload, and 
18cb0 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79  an optional 4 by
18cc0 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a  te overflow.  **
18cd0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20   page pointer.. 
18ce0 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f   */.  pBt->maxLo
18cf0 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74  cal = (u16)((pBt
18d00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
18d10 2a 36 34 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20  *64/255 - 23);. 
18d20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d   pBt->minLocal =
18d30 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
18d40 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
18d50 35 35 20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d  55 - 23);.  pBt-
18d60 3e 6d 61 78 4c 65 61 66 20 3d 20 28 75 31 36 29  >maxLeaf = (u16)
18d70 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
18d80 20 2d 20 33 35 29 3b 0a 20 20 70 42 74 2d 3e 6d   - 35);.  pBt->m
18d90 69 6e 4c 65 61 66 20 3d 20 28 75 31 36 29 28 28  inLeaf = (u16)((
18da0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18db0 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
18dc0 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 61 78  ;.  if( pBt->max
18dd0 4c 6f 63 61 6c 3e 31 32 37 20 29 7b 0a 20 20 20  Local>127 ){.   
18de0 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
18df0 79 6c 6f 61 64 20 3d 20 31 32 37 3b 0a 20 20 7d  yload = 127;.  }
18e00 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 6d  else{.    pBt->m
18e10 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
18e20 20 28 75 38 29 70 42 74 2d 3e 6d 61 78 4c 6f 63   (u8)pBt->maxLoc
18e30 61 6c 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  al;.  }.  assert
18e40 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b  ( pBt->maxLeaf +
18e50 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53   23 <= MX_CELL_S
18e60 49 5a 45 28 70 42 74 29 20 29 3b 0a 20 20 70 42  IZE(pBt) );.  pB
18e70 74 2d 3e 70 50 61 67 65 31 20 3d 20 70 50 61 67  t->pPage1 = pPag
18e80 65 31 3b 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  e1;.  pBt->nPage
18e90 20 3d 20 6e 50 61 67 65 3b 0a 20 20 72 65 74 75   = nPage;.  retu
18ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70  rn SQLITE_OK;..p
18eb0 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
18ec0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
18ed0 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e  pPage1);.  pBt->
18ee0 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65  pPage1 = 0;.  re
18ef0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
18f00 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
18f10 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
18f20 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 6f 70  er of cursors op
18f30 65 6e 20 6f 6e 20 70 42 74 2e 20 54 68 69 73 20  en on pBt. This 
18f40 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e  is for use.** in
18f50 20 61 73 73 65 72 74 28 29 20 65 78 70 72 65 73   assert() expres
18f60 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20  sions, so it is 
18f70 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66  only compiled if
18f80 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a   NDEBUG is not.*
18f90 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a  * defined..**.**
18fa0 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73   Only write curs
18fb0 6f 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 20  ors are counted 
18fc0 69 66 20 77 72 4f 6e 6c 79 20 69 73 20 74 72 75  if wrOnly is tru
18fd0 65 2e 20 20 49 66 20 77 72 4f 6e 6c 79 20 69 73  e.  If wrOnly is
18fe0 0a 2a 2a 20 66 61 6c 73 65 20 74 68 65 6e 20 61  .** false then a
18ff0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 63  ll cursors are c
19000 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  ounted..**.** Fo
19010 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
19020 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20  f this routine, 
19030 61 20 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20  a cursor is any 
19040 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69  cursor that.** i
19050 73 20 63 61 70 61 62 6c 65 20 6f 66 20 72 65 61  s capable of rea
19060 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
19070 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
19080 20 20 43 75 72 73 6f 72 73 20 74 68 61 74 0a 2a    Cursors that.*
19090 2a 20 68 61 76 65 20 62 65 65 6e 20 74 72 69 70  * have been trip
190a0 70 65 64 20 69 6e 74 6f 20 74 68 65 20 43 55 52  ped into the CUR
190b0 53 4f 52 5f 46 41 55 4c 54 20 73 74 61 74 65 20  SOR_FAULT state 
190c0 61 72 65 20 6e 6f 74 20 63 6f 75 6e 74 65 64 2e  are not counted.
190d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
190e0 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73  ountValidCursors
190f0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
19100 69 6e 74 20 77 72 4f 6e 6c 79 29 7b 0a 20 20 42  int wrOnly){.  B
19110 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20  tCursor *pCur;. 
19120 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f   int r = 0;.  fo
19130 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72  r(pCur=pBt->pCur
19140 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d  sor; pCur; pCur=
19150 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pCur->pNext){.  
19160 20 20 69 66 28 20 28 77 72 4f 6e 6c 79 3d 3d 30    if( (wrOnly==0
19170 20 7c 7c 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   || (pCur->curFl
19180 61 67 73 20 26 20 42 54 43 46 5f 57 72 69 74 65  ags & BTCF_Write
19190 46 6c 61 67 29 21 3d 30 29 0a 20 20 20 20 20 26  Flag)!=0).     &
191a0 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  & pCur->eState!=
191b0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72  CURSOR_FAULT ) r
191c0 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72  ++; .  }.  retur
191d0 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n r;.}.#endif../
191e0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
191f0 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  e no outstanding
19200 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20   cursors and we 
19210 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d  are not in the m
19220 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72  iddle.** of a tr
19230 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68  ansaction but th
19240 65 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f  ere is a read lo
19250 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
19260 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  se, then.** this
19270 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20   routine unrefs 
19280 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f  the first page o
19290 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
192a0 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61  ile which .** ha
192b0 73 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  s the effect of 
192c0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65  releasing the re
192d0 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ad lock..**.** I
192e0 66 20 74 68 65 72 65 20 69 73 20 61 20 74 72 61  f there is a tra
192f0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
19300 72 65 73 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ress, this routi
19310 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
19320 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
19330 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
19340 64 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  d(BtShared *pBt)
19350 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
19360 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19370 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
19380 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
19390 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 30 29  idCursors(pBt,0)
193a0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72  ==0 || pBt->inTr
193b0 61 6e 73 61 63 74 69 6f 6e 3e 54 52 41 4e 53 5f  ansaction>TRANS_
193c0 4e 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 70 42  NONE );.  if( pB
193d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
193e0 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
193f0 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
19400 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
19410 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61  Page1 = pBt->pPa
19420 67 65 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge1;.    assert(
19430 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29   pPage1->aData )
19440 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  ;.    assert( sq
19450 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
19460 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  nt(pBt->pPager)=
19470 3d 31 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70  =1 );.    pBt->p
19480 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 72  Page1 = 0;.    r
19490 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
194a0 6c 28 70 50 61 67 65 31 29 3b 0a 20 20 7d 0a 7d  l(pPage1);.  }.}
194b0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 42 74 20 70  ../*.** If pBt p
194c0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6d 70 74  oints to an empt
194d0 79 20 66 69 6c 65 20 74 68 65 6e 20 63 6f 6e 76  y file then conv
194e0 65 72 74 20 74 68 61 74 20 65 6d 70 74 79 20 66  ert that empty f
194f0 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20 61 20 6e 65  ile.** into a ne
19500 77 20 65 6d 70 74 79 20 64 61 74 61 62 61 73 65  w empty database
19510 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
19520 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
19530 6f 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  of.** the databa
19540 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
19550 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42 74  t newDatabase(Bt
19560 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
19570 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20  MemPage *pP1;.  
19580 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
19590 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ata;.  int rc;..
195a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
195b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
195c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
195d0 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
195e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
195f0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
19600 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
19610 0a 20 20 61 73 73 65 72 74 28 20 70 50 31 21 3d  .  assert( pP1!=
19620 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  0 );.  data = pP
19630 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63 20 3d  1->aData;.  rc =
19640 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
19650 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67 65 29  te(pP1->pDbPage)
19660 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
19670 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63 70 79  urn rc;.  memcpy
19680 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48 65 61  (data, zMagicHea
19690 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d 61 67  der, sizeof(zMag
196a0 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20 61 73  icHeader));.  as
196b0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a 4d 61  sert( sizeof(zMa
196c0 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36 20 29  gicHeader)==16 )
196d0 3b 0a 20 20 64 61 74 61 5b 31 36 5d 20 3d 20 28  ;.  data[16] = (
196e0 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
196f0 7a 65 3e 3e 38 29 26 30 78 66 66 29 3b 0a 20 20  ze>>8)&0xff);.  
19700 64 61 74 61 5b 31 37 5d 20 3d 20 28 75 38 29 28  data[17] = (u8)(
19710 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3e  (pBt->pageSize>>
19720 31 36 29 26 30 78 66 66 29 3b 0a 20 20 64 61 74  16)&0xff);.  dat
19730 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
19740 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 61 73 73  a[19] = 1;.  ass
19750 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c 65  ert( pBt->usable
19760 53 69 7a 65 3c 3d 70 42 74 2d 3e 70 61 67 65 53  Size<=pBt->pageS
19770 69 7a 65 20 26 26 20 70 42 74 2d 3e 75 73 61 62  ize && pBt->usab
19780 6c 65 53 69 7a 65 2b 32 35 35 3e 3d 70 42 74 2d  leSize+255>=pBt-
19790 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61  >pageSize);.  da
197a0 74 61 5b 32 30 5d 20 3d 20 28 75 38 29 28 70 42  ta[20] = (u8)(pB
197b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
197c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
197d0 20 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b    data[21] = 64;
197e0 0a 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32  .  data[22] = 32
197f0 3b 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33  ;.  data[23] = 3
19800 32 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74  2;.  memset(&dat
19810 61 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34  a[24], 0, 100-24
19820 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
19830 31 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54  1, PTF_INTKEY|PT
19840 46 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44  F_LEAF|PTF_LEAFD
19850 41 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 62 74  ATA );.  pBt->bt
19860 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 41  sFlags |= BTS_PA
19870 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69  GESIZE_FIXED;.#i
19880 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
19890 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61  T_AUTOVACUUM.  a
198a0 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
198b0 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74  Vacuum==1 || pBt
198c0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20  ->autoVacuum==0 
198d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  );.  assert( pBt
198e0 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20  ->incrVacuum==1 
198f0 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  || pBt->incrVacu
19900 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62  um==0 );.  put4b
19910 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34  yte(&data[36 + 4
19920 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61  *4], pBt->autoVa
19930 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74  cuum);.  put4byt
19940 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34  e(&data[36 + 7*4
19950 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  ], pBt->incrVacu
19960 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 42  um);.#endif.  pB
19970 74 2d 3e 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  t->nPage = 1;.  
19980 64 61 74 61 5b 33 31 5d 20 3d 20 31 3b 0a 20 20  data[31] = 1;.  
19990 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
199a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
199b0 61 6c 69 7a 65 20 74 68 65 20 66 69 72 73 74 20  alize the first 
199c0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
199d0 62 61 73 65 20 66 69 6c 65 20 28 63 72 65 61 74  base file (creat
199e0 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ing a database.*
199f0 2a 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  * consisting of 
19a00 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 61 6e  a single page an
19a10 64 20 6e 6f 20 73 63 68 65 6d 61 20 6f 62 6a 65  d no schema obje
19a20 63 74 73 29 2e 20 52 65 74 75 72 6e 20 53 51 4c  cts). Return SQL
19a30 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66 20 73 75 63  ITE_OK.** if suc
19a40 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
19a50 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
19a60 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
19a70 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
19a80 65 77 44 62 28 42 74 72 65 65 20 2a 70 29 7b 0a  ewDb(Btree *p){.
19a90 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
19aa0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
19ab0 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ;.  p->pBt->nPag
19ac0 65 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 6e 65  e = 0;.  rc = ne
19ad0 77 44 61 74 61 62 61 73 65 28 70 2d 3e 70 42 74  wDatabase(p->pBt
19ae0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19af0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
19b00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19b10 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72   Attempt to star
19b20 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  t a new transact
19b30 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61  ion. A write-tra
19b40 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73  nsaction.** is s
19b50 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65  tarted if the se
19b60 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
19b70 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77   nonzero, otherw
19b80 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74  ise a read-.** t
19b90 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20  ransaction.  If 
19ba0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19bb0 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65  ent is 2 or more
19bc0 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a   and exclusive.*
19bd0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
19be0 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e   started, meanin
19bf0 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  g that no other 
19c00 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77  process is allow
19c10 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ed.** to access 
19c20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41  the database.  A
19c30 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61   preexisting tra
19c40 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74  nsaction may not
19c50 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20   be.** upgraded 
19c60 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20  to exclusive by 
19c70 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  calling this rou
19c80 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69  tine a second ti
19c90 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c  me - the.** excl
19ca0 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c  usivity flag onl
19cb0 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65  y works for a ne
19cc0 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  w transaction..*
19cd0 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61  *.** A write-tra
19ce0 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
19cf0 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20   started before 
19d00 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a  attempting any .
19d10 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ** changes to th
19d20 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e  e database.  Non
19d30 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
19d40 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20  ng routines .** 
19d50 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73  will work unless
19d60 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19d70 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a  s started first:
19d80 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
19d90 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
19da0 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ble().**      sq
19db0 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65  lite3BtreeCreate
19dc0 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20  Index().**      
19dd0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
19de0 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  rTable().**     
19df0 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
19e00 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  pTable().**     
19e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73   sqlite3BtreeIns
19e20 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ert().**      sq
19e30 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65  lite3BtreeDelete
19e40 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
19e50 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74  e3BtreeUpdateMet
19e60 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  a().**.** If an 
19e70 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20  initial attempt 
19e80 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c  to acquire the l
19e90 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73  ock fails becaus
19ea0 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  e of lock conten
19eb0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20  tion.** and the 
19ec0 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65  database was pre
19ed0 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64  viously unlocked
19ee0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
19ef0 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a  e busy handler.*
19f00 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  * if there is on
19f10 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65  e.  But if there
19f20 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
19f30 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20  a read-lock, do 
19f40 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68  not.** invoke th
19f50 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d  e busy handler -
19f60 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c   just return SQL
19f70 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54  ITE_BUSY.  SQLIT
19f80 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65  E_BUSY is .** re
19f90 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72  turned when ther
19fa0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72  e is already a r
19fb0 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65  ead-lock in orde
19fc0 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61  r to avoid a dea
19fd0 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70  dlock..**.** Sup
19fe0 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74  pose there are t
19ff0 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61  wo processes A a
1a000 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72  nd B.  A has a r
1a010 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68  ead lock and B h
1a020 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64  as.** a reserved
1a030 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20   lock.  B tries 
1a040 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78  to promote to ex
1a050 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62  clusive but is b
1a060 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a  locked because.*
1a070 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f  * of A's read lo
1a080 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20  ck.  A tries to 
1a090 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72  promote to reser
1a0a0 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b  ved but is block
1a0b0 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20  ed by B..** One 
1a0c0 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
1a0d0 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65  the two processe
1a0e0 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20  s must give way 
1a0f0 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  or there can be.
1a100 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20  ** no progress. 
1a110 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51   By returning SQ
1a120 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f  LITE_BUSY and no
1a130 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62  t invoking the b
1a140 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  usy callback.** 
1a150 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68  when A already h
1a160 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  as a read lock, 
1a170 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74  we encourage A t
1a180 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65  o give up and le
1a190 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a  t B.** proceed..
1a1a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1a1b0 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74  reeBeginTrans(Bt
1a1c0 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c  ree *p, int wrfl
1a1d0 61 67 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ag){.  BtShared 
1a1e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1a1f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a200 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  _OK;..  sqlite3B
1a210 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
1a220 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1a230 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1a240 62 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79  btree is already
1a250 20 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e   in a write-tran
1a260 73 61 63 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20  saction, or it. 
1a270 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 69   ** is already i
1a280 6e 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  n a read-transac
1a290 74 69 6f 6e 20 61 6e 64 20 61 20 72 65 61 64 2d  tion and a read-
1a2a0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
1a2b0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74   is requested, t
1a2c0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
1a2d0 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
1a2e0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
1a2f0 54 45 20 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e  TE || (p->inTran
1a300 73 3d 3d 54 52 41 4e 53 5f 52 45 41 44 20 26 26  s==TRANS_READ &&
1a310 20 21 77 72 66 6c 61 67 29 20 29 7b 0a 20 20 20   !wrflag) ){.   
1a320 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a330 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
1a340 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1a350 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
1a360 20 7c 7c 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28   || IfNotOmitAV(
1a370 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1a380 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72  )==0 );..  /* Wr
1a390 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite transactions
1a3a0 20 61 72 65 20 6e 6f 74 20 70 6f 73 73 69 62 6c   are not possibl
1a3b0 65 20 6f 6e 20 61 20 72 65 61 64 2d 6f 6e 6c 79  e on a read-only
1a3c0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
1a3d0 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  f( (pBt->btsFlag
1a3e0 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c  s & BTS_READ_ONL
1a3f0 59 29 21 3d 30 20 26 26 20 77 72 66 6c 61 67 20  Y)!=0 && wrflag 
1a400 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a410 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
1a420 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
1a430 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  n;.  }..#ifndef 
1a440 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1a450 45 44 5f 43 41 43 48 45 0a 20 20 7b 0a 20 20 20  ED_CACHE.  {.   
1a460 20 73 71 6c 69 74 65 33 20 2a 70 42 6c 6f 63 6b   sqlite3 *pBlock
1a470 20 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 49 66 20   = 0;.    /* If 
1a480 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
1a490 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
1a4a0 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
1a4b0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
1a4c0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73      ** on this s
1a4d0 68 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75  hared-btree stru
1a4e0 63 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f  cture and a seco
1a4f0 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  nd write transac
1a500 74 69 6f 6e 20 69 73 0a 20 20 20 20 2a 2a 20 72  tion is.    ** r
1a510 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
1a520 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
1a530 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1a540 77 72 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69  wrflag && pBt->i
1a550 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1a560 41 4e 53 5f 57 52 49 54 45 29 0a 20 20 20 20 20  ANS_WRITE).     
1a570 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  || (pBt->btsFlag
1a580 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e 47 29  s & BTS_PENDING)
1a590 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
1a5a0 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70   pBlock = pBt->p
1a5b0 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 20 20  Writer->db;.    
1a5c0 7d 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67  }else if( wrflag
1a5d0 3e 31 20 29 7b 0a 20 20 20 20 20 20 42 74 4c 6f  >1 ){.      BtLo
1a5e0 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 20  ck *pIter;.     
1a5f0 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
1a600 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
1a610 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
1a620 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1a630 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20  Iter->pBtree!=p 
1a640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 42 6c  ){.          pBl
1a650 6f 63 6b 20 3d 20 70 49 74 65 72 2d 3e 70 42 74  ock = pIter->pBt
1a660 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20  ree->db;.       
1a670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1a680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1a690 7d 0a 20 20 20 20 69 66 28 20 70 42 6c 6f 63 6b  }.    if( pBlock
1a6a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1a6b0 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
1a6c0 65 64 28 70 2d 3e 64 62 2c 20 70 42 6c 6f 63 6b  ed(p->db, pBlock
1a6d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1a6e0 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
1a6f0 45 44 43 41 43 48 45 3b 0a 20 20 20 20 20 20 67  EDCACHE;.      g
1a700 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
1a710 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1a720 66 0a 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64  f..  /* Any read
1a730 2d 6f 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72  -only or read-wr
1a740 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
1a750 69 6d 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c  implies a read-l
1a760 6f 63 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67  ock on .  ** pag
1a770 65 20 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20  e 1. So if some 
1a780 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61 63  other shared-cac
1a790 68 65 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64  he client alread
1a7a0 79 20 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f  y has a write-lo
1a7b0 63 6b 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65  ck .  ** on page
1a7c0 20 31 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74   1, the transact
1a7d0 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70  ion cannot be op
1a7e0 65 6e 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ened. */.  rc = 
1a7f0 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65  querySharedCache
1a800 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53  TableLock(p, MAS
1a810 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c  TER_ROOT, READ_L
1a820 4f 43 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  OCK);.  if( SQLI
1a830 54 45 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f  TE_OK!=rc ) goto
1a840 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20   trans_begun;.. 
1a850 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
1a860 3d 20 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59  = ~BTS_INITIALLY
1a870 5f 45 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42  _EMPTY;.  if( pB
1a880 74 2d 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42  t->nPage==0 ) pB
1a890 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1a8a0 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
1a8b0 54 59 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f  TY;.  do {.    /
1a8c0 2a 20 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65  * Call lockBtree
1a8d0 28 29 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20  () until either 
1a8e0 70 42 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70  pBt->pPage1 is p
1a8f0 6f 70 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20  opulated or.    
1a900 2a 2a 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72  ** lockBtree() r
1a910 65 74 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67  eturns something
1a920 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49   other than SQLI
1a930 54 45 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65  TE_OK. lockBtree
1a940 28 29 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65  ().    ** may re
1a950 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62  turn SQLITE_OK b
1a960 75 74 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  ut leave pBt->pP
1a970 61 67 65 31 20 73 65 74 20 74 6f 20 30 20 69 66  age1 set to 0 if
1a980 20 61 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65   after.    ** re
1a990 61 64 69 6e 67 20 70 61 67 65 20 31 20 69 74 20  ading page 1 it 
1a9a0 64 69 73 63 6f 76 65 72 73 20 74 68 61 74 20 74  discovers that t
1a9b0 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20  he page-size of 
1a9c0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 20 20  the database .  
1a9d0 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74    ** file is not
1a9e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20   pBt->pageSize. 
1a9f0 49 6e 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63  In this case loc
1aa00 6b 42 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70  kBtree() will up
1aa10 64 61 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d  date.    ** pBt-
1aa20 3e 70 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65  >pageSize to the
1aa30 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1aa40 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
1aa50 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65      */.    while
1aa60 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
1aa70 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28   && SQLITE_OK==(
1aa80 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70  rc = lockBtree(p
1aa90 42 74 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  Bt)) );..    if(
1aaa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1aab0 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20  & wrflag ){.    
1aac0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
1aad0 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
1aae0 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20  ONLY)!=0 ){.    
1aaf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1ab00 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  READONLY;.      
1ab10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1ab20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1ab30 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65  Begin(pBt->pPage
1ab40 72 2c 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74  r,wrflag>1,sqlit
1ab50 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70  e3TempInMemory(p
1ab60 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
1ab70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1ab90 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
1aba0 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
1abb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1abc0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1abd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1abe0 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1abf0 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  sed(pBt);.    }.
1ac00 20 20 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78    }while( (rc&0x
1ac10 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  FF)==SQLITE_BUSY
1ac20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
1ac30 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
1ac40 4e 45 20 26 26 0a 20 20 20 20 20 20 20 20 20 20  NE &&.          
1ac50 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  btreeInvokeBusyH
1ac60 61 6e 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a  andler(pBt) );..
1ac70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ac80 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
1ac90 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1aca0 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
1acb0 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1acc0 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ++;.#ifndef SQLI
1acd0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1ace0 41 43 48 45 0a 20 20 20 20 20 20 69 66 28 20 70  ACHE.      if( p
1acf0 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
1ad00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1ad10 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20  >lock.pBtree==p 
1ad20 26 26 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c  && p->lock.iTabl
1ad30 65 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  e==1 );.        
1ad40 70 2d 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20  p->lock.eLock = 
1ad50 52 45 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  READ_LOCK;.     
1ad60 20 20 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74     p->lock.pNext
1ad70 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20   = pBt->pLock;. 
1ad80 20 20 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63         pBt->pLoc
1ad90 6b 20 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20  k = &p->lock;.  
1ada0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1adb0 20 7d 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e   }.    p->inTran
1adc0 73 20 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e  s = (wrflag?TRAN
1add0 53 5f 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45  S_WRITE:TRANS_RE
1ade0 41 44 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  AD);.    if( p->
1adf0 69 6e 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54  inTrans>pBt->inT
1ae00 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
1ae10 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
1ae20 61 63 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72  action = p->inTr
1ae30 61 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ans;.    }.    i
1ae40 66 28 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20  f( wrflag ){.   
1ae50 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
1ae60 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1ae70 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1ae80 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1ae90 48 45 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  HE.      assert(
1aea0 20 21 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29   !pBt->pWriter )
1aeb0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72  ;.      pBt->pWr
1aec0 69 74 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20  iter = p;.      
1aed0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d  pBt->btsFlags &=
1aee0 20 7e 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b   ~BTS_EXCLUSIVE;
1aef0 0a 20 20 20 20 20 20 69 66 28 20 77 72 66 6c 61  .      if( wrfla
1af00 67 3e 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  g>1 ) pBt->btsFl
1af10 61 67 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55  ags |= BTS_EXCLU
1af20 53 49 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  SIVE;.#endif..  
1af30 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62      /* If the db
1af40 2d 73 69 7a 65 20 68 65 61 64 65 72 20 66 69 65  -size header fie
1af50 6c 64 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20  ld is incorrect 
1af60 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69 66  (as it may be if
1af70 20 61 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a   an old.      **
1af80 20 63 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e   client has been
1af90 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
1afa0 61 62 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64  abase file), upd
1afb0 61 74 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e  ate it now. Doin
1afc0 67 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20  g.      ** this 
1afd0 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
1afe0 61 6e 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74  an later means t
1aff0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
1b000 20 63 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20   can safely .   
1b010 20 20 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68     ** re-read th
1b020 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b030 66 72 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61  from page 1 if a
1b040 20 73 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72   savepoint or tr
1b050 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
1b060 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75  ** rollback occu
1b070 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 74 72  rs within the tr
1b080 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1b090 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
1b0a0 74 2d 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79  t->nPage!=get4by
1b0b0 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1b0c0 61 5b 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20  a[28]) ){.      
1b0d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1b0e0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1b0f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1b100 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b120 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
1b130 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70  e1->aData[28], p
1b140 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1b150 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1b160 20 20 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f    }.  }...trans_
1b170 62 65 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d  begun:.  if( rc=
1b180 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72  =SQLITE_OK && wr
1b190 66 6c 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54  flag ){.    /* T
1b1a0 68 69 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73  his call makes s
1b1b0 75 72 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ure that the pag
1b1c0 65 72 20 68 61 73 20 74 68 65 20 63 6f 72 72 65  er has the corre
1b1d0 63 74 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20  ct number of.   
1b1e0 20 2a 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69   ** open savepoi
1b1f0 6e 74 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f  nts. If the seco
1b200 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
1b210 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 20 61  greater than 0 a
1b220 6e 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75  nd.    ** the su
1b230 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  b-journal is not
1b240 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74   already open, t
1b250 68 65 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f  hen it will be o
1b260 70 65 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20  pened here..    
1b270 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1b280 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
1b290 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
1b2a0 72 2c 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  r, p->db->nSavep
1b2b0 6f 69 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74  oint);.  }..  bt
1b2c0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
1b2d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
1b2e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
1b2f0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
1b300 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1b310 4f 56 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53  OVACUUM../*.** S
1b320 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  et the pointer-m
1b330 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1b340 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
1b350 61 67 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c  age pPage. Also,
1b360 20 69 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e   if.** pPage con
1b370 74 61 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74  tains cells that
1b380 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1b390 6f 77 20 70 61 67 65 73 2c 20 73 65 74 20 74 68  ow pages, set th
1b3a0 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70  e pointer.** map
1b3b0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65   entries for the
1b3c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
1b3d0 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  as well..*/.stat
1b3e0 69 63 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50  ic int setChildP
1b3f0 74 72 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a  trmaps(MemPage *
1b400 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
1b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b430 43 6f 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65  Counter variable
1b440 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b   */.  int nCell;
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b460 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b470 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70  er of cells in p
1b480 61 67 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69  age pPage */.  i
1b490 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1b4c0 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
1b4d0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
1b4e0 3b 0a 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69  ;.  u8 isInitOri
1b4f0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
1b500 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  t;.  Pgno pgno =
1b510 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20   pPage->pgno;.. 
1b520 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1b530 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1b540 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1b550 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e  ;.  rc = btreeIn
1b560 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
1b570 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b580 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
1b590 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
1b5a0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
1b5b0 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
1b5c0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1b5d0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
1b5e0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
1b5f0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
1b600 0a 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f  ..    ptrmapPutO
1b610 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
1b620 65 6c 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20  ell, &rc);..    
1b630 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
1b640 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63   ){.      Pgno c
1b650 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62  hildPgno = get4b
1b660 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20  yte(pCell);.    
1b670 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1b680 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d   childPgno, PTRM
1b690 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20  AP_BTREE, pgno, 
1b6a0 26 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  &rc);.    }.  }.
1b6b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1b6c0 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  eaf ){.    Pgno 
1b6d0 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
1b6e0 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
1b6f0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
1b700 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72  set+8]);.    ptr
1b710 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
1b720 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
1b730 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b  REE, pgno, &rc);
1b740 0a 20 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f  .  }..set_child_
1b750 70 74 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70  ptrmaps_out:.  p
1b760 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69  Page->isInit = i
1b770 73 49 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74  sInitOrig;.  ret
1b780 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b790 20 53 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50   Somewhere on pP
1b7a0 61 67 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  age is a pointer
1b7b0 20 74 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20   to page iFrom. 
1b7c0 20 4d 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69   Modify this poi
1b7d0 6e 74 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20  nter so.** that 
1b7e0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f  it points to iTo
1b7f0 2e 20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70  . Parameter eTyp
1b800 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  e describes the 
1b810 74 79 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20  type of pointer 
1b820 74 6f 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65  to.** be modifie
1b830 64 2c 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a  d, as  follows:.
1b840 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52  **.** PTRMAP_BTR
1b850 45 45 3a 20 20 20 20 20 70 50 61 67 65 20 69 73  EE:     pPage is
1b860 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1b870 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1b880 73 20 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a  s at a child .**
1b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b8a0 20 20 20 70 61 67 65 20 6f 66 20 70 50 61 67 65     page of pPage
1b8b0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
1b8c0 56 45 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20  VERFLOW1: pPage 
1b8d0 69 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e  is a btree-page.
1b8e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1b8f0 6e 74 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c  nts at an overfl
1b900 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ow.**           
1b910 20 20 20 20 20 20 20 20 70 61 67 65 20 70 6f 69          page poi
1b920 6e 74 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f  nted to by one o
1b930 66 20 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70  f the cells on p
1b940 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  Page..**.** PTRM
1b950 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50  AP_OVERFLOW2: pP
1b960 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1b970 6f 77 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ow-page. The poi
1b980 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74  nter points at t
1b990 68 65 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20  he next.**      
1b9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 76 65               ove
1b9b0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
1b9c0 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e list..*/.stati
1b9d0 63 20 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65  c int modifyPage
1b9e0 50 6f 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20  Pointer(MemPage 
1b9f0 2a 70 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72  *pPage, Pgno iFr
1ba00 6f 6d 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38  om, Pgno iTo, u8
1ba10 20 65 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72   eType){.  asser
1ba20 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ba30 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
1ba40 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
1ba50 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
1ba60 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
1ba70 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
1ba80 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
1ba90 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29  RMAP_OVERFLOW2 )
1baa0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69  {.    /* The poi
1bab0 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20 74  nter is always t
1bac0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1bad0 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e 20   of the page in 
1bae0 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
1baf0 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65 28     if( get4byte(
1bb00 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69  pPage->aData)!=i
1bb10 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65  From ){.      re
1bb20 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1bb30 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1bb40 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50 61      put4byte(pPa
1bb50 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b  ge->aData, iTo);
1bb60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38  .  }else{.    u8
1bb70 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50   isInitOrig = pP
1bb80 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20  age->isInit;.   
1bb90 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
1bba0 6e 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72  nCell;.    int r
1bbb0 63 3b 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72  c;..    rc = btr
1bbc0 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
1bbd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1bbe0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e  return rc;.    n
1bbf0 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
1bc00 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ell;..    for(i=
1bc10 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
1bc20 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
1bc30 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
1bc40 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66  ge, i);.      if
1bc50 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1bc60 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20  OVERFLOW1 ){.   
1bc70 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
1bc80 66 6f 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  fo;.        pPag
1bc90 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50  e->xParseCell(pP
1bca0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
1bcb0 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
1bcc0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f  info.nLocal<info
1bcd0 2e 6e 50 61 79 6c 6f 61 64 0a 20 20 20 20 20 20  .nPayload.      
1bce0 20 20 20 26 26 20 70 43 65 6c 6c 2b 69 6e 66 6f     && pCell+info
1bcf0 2e 6e 53 69 7a 65 2d 31 3c 3d 70 50 61 67 65 2d  .nSize-1<=pPage-
1bd00 3e 61 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61  >aData+pPage->ma
1bd10 73 6b 50 61 67 65 0a 20 20 20 20 20 20 20 20 20  skPage.         
1bd20 26 26 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79  && iFrom==get4by
1bd30 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  te(pCell+info.nS
1bd40 69 7a 65 2d 34 29 0a 20 20 20 20 20 20 20 20 29  ize-4).        )
1bd50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  {.          put4
1bd60 62 79 74 65 28 70 43 65 6c 6c 2b 69 6e 66 6f 2e  byte(pCell+info.
1bd70 6e 53 69 7a 65 2d 34 2c 20 69 54 6f 29 3b 0a 20  nSize-4, iTo);. 
1bd80 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bd90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bda0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1bdb0 66 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  f( get4byte(pCel
1bdc0 6c 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  l)==iFrom ){.   
1bdd0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1bde0 70 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20  pCell, iTo);.   
1bdf0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1be00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1be10 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1be20 20 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20   i==nCell ){.   
1be30 20 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54     if( eType!=PT
1be40 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20  RMAP_BTREE || . 
1be50 20 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74           get4byt
1be60 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1be70 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1be80 2b 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  +8])!=iFrom ){. 
1be90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1bea0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1beb0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
1bec0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65   put4byte(&pPage
1bed0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1bee0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f  drOffset+8], iTo
1bef0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
1bf00 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73  age->isInit = is
1bf10 49 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20  InitOrig;.  }.  
1bf20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bf30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
1bf40 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
1bf50 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20  se page pDbPage 
1bf60 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65  to location iFre
1bf70 65 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a  ePage in the .**
1bf80 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70   database. The p
1bf90 44 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65  DbPage reference
1bfa0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a   remains valid..
1bfb0 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d  **.** The isComm
1bfc0 69 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65  it flag indicate
1bfd0 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
1bfe0 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d  no need to remem
1bff0 62 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  ber that.** the 
1c000 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
1c010 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
1c020 6f 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67  ore database pag
1c030 65 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20  e pDbPage->pgno 
1c040 0a 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74  .** can be writt
1c050 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65  en to. The calle
1c060 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72  r has already pr
1c070 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72  omised not to wr
1c080 69 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70  ite to that.** p
1c090 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
1c0a0 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28  nt relocatePage(
1c0b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1c0c0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1c0d0 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  tree */.  MemPag
1c0e0 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20  e *pDbPage,     
1c0f0 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20     /* Open page 
1c100 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20  to move */.  u8 
1c110 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  eType,          
1c120 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
1c130 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72   map 'type' entr
1c140 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
1c150 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65  .  Pgno iPtrPage
1c160 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
1c170 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65  ointer map 'page
1c180 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70  -no' entry for p
1c190 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
1c1a0 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20   iFreePage,     
1c1b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61       /* The loca
1c1c0 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62  tion to move pDb
1c1d0 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  Page to */.  int
1c1e0 20 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20   isCommit       
1c1f0 20 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69        /* isCommi
1c200 74 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f  t flag passed to
1c210 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
1c220 65 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65  epage */.){.  Me
1c230 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b  mPage *pPtrPage;
1c240 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
1c250 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  hat contains a p
1c260 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67  ointer to pDbPag
1c270 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50  e */.  Pgno iDbP
1c280 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70  age = pDbPage->p
1c290 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  gno;.  Pager *pP
1c2a0 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1c2b0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1c2c0 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
1c2d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1c2e0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
1c2f0 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a  P_OVERFLOW1 || .
1c300 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52        eType==PTR
1c310 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79  MAP_BTREE || eTy
1c320 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1c330 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  AGE );.  assert(
1c340 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1c350 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
1c360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62  );.  assert( pDb
1c370 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29  Page->pBt==pBt )
1c380 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67  ;..  /* Move pag
1c390 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69  e iDbPage from i
1c3a0 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ts current locat
1c3b0 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62  ion to page numb
1c3c0 65 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a  er iFreePage */.
1c3d0 20 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41    TRACE(("AUTOVA
1c3e0 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20  CUUM: Moving %d 
1c3f0 74 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20  to free page %d 
1c400 28 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70  (ptr page %d typ
1c410 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20  e %d)\n", .     
1c420 20 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50   iDbPage, iFreeP
1c430 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65  age, iPtrPage, e
1c440 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73  Type));.  rc = s
1c450 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
1c460 61 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50  age(pPager, pDbP
1c470 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46  age->pDbPage, iF
1c480 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69  reePage, isCommi
1c490 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
1c4a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1c4b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1c4c0 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20  pDbPage->pgno = 
1c4d0 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a  iFreePage;..  /*
1c4e0 20 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20   If pDbPage was 
1c4f0 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68  a btree-page, th
1c500 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63  en it may have c
1c510 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f  hild pages and/o
1c520 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61  r cells.  ** tha
1c530 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66  t point to overf
1c540 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70  low pages. The p
1c550 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69  ointer map entri
1c560 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  es for all these
1c570 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64  .  ** pages need
1c580 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a   to be changed..
1c590 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62    **.  ** If pDb
1c5a0 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66  Page is an overf
1c5b0 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74  low page, then t
1c5c0 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73  he first 4 bytes
1c5d0 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a   may store a.  *
1c5e0 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  * pointer to a s
1c5f0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
1c600 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73  ow page. If this
1c610 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
1c620 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e  en.  ** the poin
1c630 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f  ter map needs to
1c640 20 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20   be updated for 
1c650 74 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f  the subsequent o
1c660 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20  verflow page..  
1c670 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  */.  if( eType==
1c680 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20  PTRMAP_BTREE || 
1c690 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f  eType==PTRMAP_RO
1c6a0 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
1c6b0 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
1c6c0 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ps(pDbPage);.   
1c6d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c6e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c6f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1c700 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e  else{.    Pgno n
1c710 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  extOvfl = get4by
1c720 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74  te(pDbPage->aDat
1c730 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74  a);.    if( next
1c740 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20  Ovfl!=0 ){.     
1c750 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
1c760 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
1c770 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
1c780 65 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  ePage, &rc);.   
1c790 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c7a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c7b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1c7c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1c7d0 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62  /* Fix the datab
1c7e0 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70  ase pointer on p
1c7f0 61 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61  age iPtrPage tha
1c800 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62  t pointed at iDb
1c810 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61  Page so.  ** tha
1c820 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69  t it points at i
1c830 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66  FreePage. Also f
1c840 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ix the pointer m
1c850 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a  ap entry for.  *
1c860 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f  * iPtrPage..  */
1c870 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54  .  if( eType!=PT
1c880 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1c890 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
1c8a0 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
1c8b0 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
1c8c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1c8d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c8e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c8f0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
1c900 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1c910 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
1c920 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
1c930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c940 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1c950 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
1c960 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c970 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
1c980 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
1c990 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
1c9a0 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
1c9b0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
1c9c0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
1c9d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1c9e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d  OK ){.      ptrm
1c9f0 61 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65  apPut(pBt, iFree
1ca00 50 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74  Page, eType, iPt
1ca10 72 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20  rPage, &rc);.   
1ca20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1ca30 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
1ca40 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
1ca50 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
1ca60 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
1ca70 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
1ca80 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
1ca90 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
1caa0 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
1cab0 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
1cac0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
1cad0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
1cae0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
1caf0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
1cb00 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  urn.** SQLITE_OK
1cb10 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1cb20 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
1cb30 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f   therefore no po
1cb40 69 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69  int in .** calli
1cb50 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1cb60 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
1cb70 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c  SQLITE_DONE. Or,
1cb80 20 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a   if an error .**
1cb90 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1cba0 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1cbb0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72   code..**.** Mor
1cbc0 65 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20  e specifically, 
1cbd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  this function at
1cbe0 74 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67  tempts to re-org
1cbf0 61 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61  anize the databa
1cc00 73 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74  se so .** that t
1cc10 68 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20  he last page of 
1cc20 74 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74  the file current
1cc30 6c 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20  ly in use is no 
1cc40 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
1cc50 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e  *.** Parameter n
1cc60 46 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Fin is the numbe
1cc70 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
1cc80 74 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f  this database wo
1cc90 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77  uld contain.** w
1cca0 65 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ere this functio
1ccb0 6e 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69  n called until i
1ccc0 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1ccd0 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _DONE..**.** If 
1cce0 74 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61  the bCommit para
1ccf0 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72  meter is non-zer
1cd00 6f 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  o, this function
1cd10 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68   assumes that th
1cd20 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c  e .** caller wil
1cd30 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
1cd40 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
1cd50 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73  until it returns
1cd60 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a   SQLITE_DONE .**
1cd70 20 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43   or an error. bC
1cd80 6f 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20  ommit is passed 
1cd90 74 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f  true for an auto
1cda0 2d 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69  -vacuum-on-commi
1cdb0 74 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c  t .** operation,
1cdc0 20 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e   or false for an
1cdd0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1cde0 75 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uum..*/.static i
1cdf0 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  nt incrVacuumSte
1ce00 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  p(BtShared *pBt,
1ce10 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f   Pgno nFin, Pgno
1ce20 20 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43   iLastPg, int bC
1ce30 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e  ommit){.  Pgno n
1ce40 46 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20  FreeList;       
1ce50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ce60 20 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20   pages still on 
1ce70 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f  the free-list */
1ce80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1ce90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1cea0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1ceb0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
1cec0 28 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29  ( iLastPg>nFin )
1ced0 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50  ;..  if( !PTRMAP
1cee0 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61  _ISPAGE(pBt, iLa
1cef0 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67  stPg) && iLastPg
1cf00 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
1cf10 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
1cf20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
1cf30 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
1cf40 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
1cf50 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1cf60 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1cf70 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
1cf80 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  st==0 ){.      r
1cf90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1cfa0 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
1cfb0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
1cfc0 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
1cfd0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
1cfe0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1cff0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1d000 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1d010 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
1d020 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
1d030 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d040 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1d050 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
1d060 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1d070 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1d080 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1d090 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
1d0a0 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
1d0b0 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
1d0c0 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
1d0d0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
1d0e0 20 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d        ** if bCom
1d0f0 6d 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  mit is non-zero.
1d100 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
1d110 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c  he free-list wil
1d120 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  l be.        ** 
1d130 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
1d140 6f 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  o after this fun
1d150 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73  ction returns, s
1d160 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20  o it doesn't .  
1d170 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20        ** matter 
1d180 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74  if it still cont
1d190 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67  ains some garbag
1d1a0 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20  e entries..     
1d1b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
1d1c0 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20  no iFreePg;.    
1d1d0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
1d1e0 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
1d1f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
1d200 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
1d210 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c  Pg, &iFreePg, iL
1d220 61 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45  astPg, BTALLOC_E
1d230 58 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69  XACT);.        i
1d240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d260 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1d270 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1d280 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
1d290 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
1d2a0 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
1d2b0 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
1d2c0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
1d2d0 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
1d2e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1d2f0 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
1d300 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
1d310 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
1d320 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20  age *pLastPg;.  
1d330 20 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42      u8 eMode = B
1d340 54 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a  TALLOC_ANY;   /*
1d350 20 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20   Mode parameter 
1d360 66 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  for allocateBtre
1d370 65 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20  ePage() */.     
1d380 20 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b   Pgno iNear = 0;
1d390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65             /* ne
1d3a0 61 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66  arby parameter f
1d3b0 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1d3c0 50 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20  Page() */..     
1d3d0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61   rc = btreeGetPa
1d3e0 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  ge(pBt, iLastPg,
1d3f0 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20   &pLastPg, 0);. 
1d400 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d410 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d420 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1d430 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
1d440 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72  f bCommit is zer
1d450 6f 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e  o, this loop run
1d460 73 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61  s exactly once a
1d470 6e 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a  nd page pLastPg.
1d480 20 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70        ** is swap
1d490 70 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72  ped with the fir
1d4a0 73 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c  st free page pul
1d4b0 6c 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65  led off the free
1d4c0 20 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a   list..      **.
1d4d0 20 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20        ** On the 
1d4e0 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62  other hand, if b
1d4f0 43 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65  Commit is greate
1d500 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  r than zero, the
1d510 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20  n keep.      ** 
1d520 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20  looping until a 
1d530 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65  free-page locate
1d540 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72  d within the fir
1d550 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20  st nFin pages.  
1d560 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69      ** of the fi
1d570 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20  le is found..   
1d580 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
1d590 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20  bCommit==0 ){.  
1d5a0 20 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54        eMode = BT
1d5b0 41 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20  ALLOC_LE;.      
1d5c0 20 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a    iNear = nFin;.
1d5d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f        }.      do
1d5e0 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
1d5f0 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
1d600 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
1d610 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
1d620 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
1d630 65 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64  ePg, iNear, eMod
1d640 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
1d650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d660 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
1d670 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b  sePage(pLastPg);
1d680 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d690 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
1d6a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1d6b0 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20  age(pFreePg);.  
1d6c0 20 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d      }while( bCom
1d6d0 6d 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e  mit && iFreePg>n
1d6e0 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73  Fin );.      ass
1d6f0 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61  ert( iFreePg<iLa
1d700 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20  stPg );.      . 
1d710 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
1d720 74 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73  tePage(pBt, pLas
1d730 74 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72  tPg, eType, iPtr
1d740 50 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62  Page, iFreePg, b
1d750 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72  Commit);.      r
1d760 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74  eleasePage(pLast
1d770 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
1d780 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d790 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d7a0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1d7b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d  .  }..  if( bCom
1d7c0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f  mit==0 ){.    do
1d7d0 20 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67   {.      iLastPg
1d7e0 2d 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  --;.    }while( 
1d7f0 69 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47  iLastPg==PENDING
1d800 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1d810 7c 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  || PTRMAP_ISPAGE
1d820 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29  (pBt, iLastPg) )
1d830 3b 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72  ;.    pBt->bDoTr
1d840 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1d850 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61  pBt->nPage = iLa
1d860 73 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  stPg;.  }.  retu
1d870 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1d880 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62  ./*.** The datab
1d890 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ase opened by th
1d8a0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1d8b0 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
1d8c0 75 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e  um database.** n
1d8d0 4f 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69  Orig pages in si
1d8e0 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46  ze containing nF
1d8f0 72 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20  ree free pages. 
1d900 52 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63  Return the expec
1d910 74 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20  ted .** size of 
1d920 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
1d930 70 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  pages following 
1d940 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f  an auto-vacuum o
1d950 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
1d960 74 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62  tic Pgno finalDb
1d970 53 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70  Size(BtShared *p
1d980 42 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20  Bt, Pgno nOrig, 
1d990 50 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69  Pgno nFree){.  i
1d9a0 6e 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20  nt nEntry;      
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d9c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
1d9d0 69 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61  ies on one ptrma
1d9e0 70 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  p page */.  Pgno
1d9f0 20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20   nPtrmap;       
1da00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1da10 75 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20  umber of PtrMap 
1da20 70 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65  pages to be free
1da30 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e  d */.  Pgno nFin
1da40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da50 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1da60 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e   value */..  nEn
1da70 74 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  try = pBt->usabl
1da80 65 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d  eSize/5;.  nPtrm
1da90 61 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69  ap = (nFree-nOri
1daa0 67 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  g+PTRMAP_PAGENO(
1dab0 70 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74  pBt, nOrig)+nEnt
1dac0 72 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46  ry)/nEntry;.  nF
1dad0 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
1dae0 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
1daf0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
1db00 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1db10 20 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47   && nFin<PENDING
1db20 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1db30 29 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20  ){.    nFin--;. 
1db40 20 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d   }.  while( PTRM
1db50 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e  AP_ISPAGE(pBt, n
1db60 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45  Fin) || nFin==PE
1db70 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1db80 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e  pBt) ){.    nFin
1db90 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  --;.  }..  retur
1dba0 6e 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n nFin;.}../*.**
1dbb0 20 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   A write-transac
1dbc0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65  tion must be ope
1dbd0 6e 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  ned before calli
1dbe0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1dbf0 2e 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73  ..** It performs
1dc00 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f   a single unit o
1dc10 66 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61  f work towards a
1dc20 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  n incremental va
1dc30 63 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cuum..**.** If t
1dc40 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  he incremental v
1dc50 61 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65  acuum is finishe
1dc60 64 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e  d after this fun
1dc70 63 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a  ction has run,.*
1dc80 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  * SQLITE_DONE is
1dc90 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74   returned. If it
1dca0 20 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64   is not finished
1dcb0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
1dcc0 63 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49  ccurred,.** SQLI
1dcd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1dce0 64 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20  d. Otherwise an 
1dcf0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
1dd00 65 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  e. .*/.int sqlit
1dd10 65 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75  e3BtreeIncrVacuu
1dd20 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  m(Btree *p){.  i
1dd30 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
1dd40 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1dd50 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
1dd60 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65  Enter(p);.  asse
1dd70 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
1dd80 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
1dd90 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
1dda0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
1ddb0 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
1ddc0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1ddd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1dde0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50  ;.  }else{.    P
1ddf0 67 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65  gno nOrig = btre
1de00 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1de10 0a 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20  .    Pgno nFree 
1de20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1de30 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1de40 36 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46  6]);.    Pgno nF
1de50 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65  in = finalDbSize
1de60 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72  (pBt, nOrig, nFr
1de70 65 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f  ee);..    if( nO
1de80 72 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20  rig<nFin ){.    
1de90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1dea0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1deb0 7d 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e  }else if( nFree>
1dec0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1ded0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1dee0 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Bt, 0, 0);.     
1def0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1df00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  OK ){.        in
1df10 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
1df20 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
1df30 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72         rc = incr
1df40 56 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20  VacuumStep(pBt, 
1df50 6e 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b  nFin, nOrig, 0);
1df60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1df70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1df80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1df90 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1dfa0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1dfb0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1dfc0 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1dfd0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32  >pPage1->aData[2
1dfe0 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b  8], pBt->nPage);
1dff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1e000 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
1e010 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
1e020 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
1e030 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1e040 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e050 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1e060 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
1e070 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1e080 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
1e090 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
1e0a0 63 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e  committed for an
1e0b0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
1e0c0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
1e0d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1e0e0 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
1e0f0 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
1e100 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1e110 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
1e120 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
1e130 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
1e140 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
1e150 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
1e160 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
1e170 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
1e180 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
1e190 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
1e1a0 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
1e1b0 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
1e1c0 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
1e1d0 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
1e1e0 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
1e1f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e200 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1e210 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
1e220 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
1e230 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
1e240 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
1e250 29 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20  ); )..  assert( 
1e260 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e270 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1e280 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
1e290 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1e2a0 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
1e2b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
1e2c0 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
1e2d0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
1e2e0 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20  no nFin;        
1e2f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1e300 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1e310 61 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d  after autovacuum
1e320 69 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  ing */.    Pgno 
1e330 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a  nFree;        /*
1e340 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
1e350 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
1e360 20 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20   initially */.  
1e370 20 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20    Pgno iFree;   
1e380 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74       /* The next
1e390 20 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65   page to be free
1e3a0 64 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f  d */.    Pgno nO
1e3b0 72 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  rig;        /* D
1e3c0 61 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66  atabase size bef
1e3d0 6f 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a  ore freeing */..
1e3e0 20 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65      nOrig = btre
1e3f0 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b  ePagecount(pBt);
1e400 0a 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f  .    if( PTRMAP_
1e410 49 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69  ISPAGE(pBt, nOri
1e420 67 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e  g) || nOrig==PEN
1e430 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e440 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  Bt) ){.      /* 
1e450 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
1e460 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  le to create a d
1e470 61 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63  atabase for whic
1e480 68 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65  h the final page
1e490 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74  .      ** is eit
1e4a0 68 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61  her a pointer-ma
1e4b0 70 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65  p page or the pe
1e4c0 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e  nding-byte page.
1e4d0 20 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a   If one.      **
1e4e0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1e4f0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
1e500 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
1e510 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72    */.      retur
1e520 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1e530 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
1e540 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79    nFree = get4by
1e550 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1e560 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1e570 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53   nFin = finalDbS
1e580 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20  ize(pBt, nOrig, 
1e590 6e 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20  nFree);.    if( 
1e5a0 6e 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74  nFin>nOrig ) ret
1e5b0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1e5c0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28  PT_BKPT;.    if(
1e5d0 20 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20   nFin<nOrig ){. 
1e5e0 20 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c       rc = saveAl
1e5f0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
1e600 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66   0);.    }.    f
1e610 6f 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20  or(iFree=nOrig; 
1e620 69 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63  iFree>nFin && rc
1e630 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72  ==SQLITE_OK; iFr
1e640 65 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20  ee--){.      rc 
1e650 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1e660 28 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65  (pBt, nFin, iFre
1e670 65 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  e, 1);.    }.   
1e680 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
1e690 5f 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c  _DONE || rc==SQL
1e6a0 49 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65  ITE_OK) && nFree
1e6b0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  >0 ){.      rc =
1e6c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1e6d0 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
1e6e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e6f0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e700 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
1e710 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34  , 0);.      put4
1e720 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
1e730 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
1e740 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e750 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e760 44 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b  Data[28], nFin);
1e770 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54  .      pBt->bDoT
1e780 72 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20  runcate = 1;.   
1e790 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20     pBt->nPage = 
1e7a0 6e 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nFin;.    }.    
1e7b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1e7c0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e7d0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1e7e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1e7f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52   }..  assert( nR
1e800 65 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef>=sqlite3Pager
1e810 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1e820 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
1e830 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e  .}..#else /* ifn
1e840 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e850 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20  AUTOVACUUM */.# 
1e860 64 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50  define setChildP
1e870 74 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45  trmaps(x) SQLITE
1e880 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  _OK.#endif../*.*
1e890 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
1e8a0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
1e8b0 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
1e8c0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
1e8d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
1e8e0 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
1e8f0 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
1e900 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
1e910 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
1e920 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
1e930 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
1e940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
1e950 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
1e960 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
1e970 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
1e980 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
1e990 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
1e9a0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
1e9b0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
1e9c0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
1e9d0 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
1e9e0 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
1e9f0 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
1ea00 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
1ea10 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
1ea20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
1ea30 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
1ea40 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
1ea50 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
1ea60 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1ea70 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
1ea80 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
1ea90 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
1eaa0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
1eab0 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
1eac0 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
1ead0 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
1eae0 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
1eaf0 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
1eb00 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
1eb10 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
1eb20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1eb30 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f  mitPhaseTwo() fo
1eb40 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
1eb50 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
1eb60 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
1eb70 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
1eb80 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
1eb90 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1eba0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
1ebb0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
1ebc0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
1ebd0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1ebe0 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
1ebf0 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
1ec00 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
1ec10 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1ec20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1ec30 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1ec40 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
1ec50 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
1ec60 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
1ec70 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
1ec80 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
1ec90 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
1eca0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1ecb0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1ecc0 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
1ecd0 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
1ece0 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
1ecf0 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
1ed00 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
1ed10 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
1ed20 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
1ed30 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
1ed40 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
1ed50 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
1ed60 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
1ed70 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
1ed80 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
1ed90 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
1eda0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
1edb0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
1edc0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1edd0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
1ede0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
1edf0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
1ee00 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
1ee10 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
1ee20 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ee30 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
1ee40 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
1ee50 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
1ee60 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1ee70 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1ee80 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65  Enter(p);.#ifnde
1ee90 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1eea0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1eeb0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
1eec0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
1eed0 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28  utoVacuumCommit(
1eee0 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
1eef0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1ef00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1ef10 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1ef20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1ef30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1ef40 20 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f      if( pBt->bDo
1ef50 54 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20  Truncate ){.    
1ef60 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72    sqlite3PagerTr
1ef70 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d  uncateImage(pBt-
1ef80 3e 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50  >pPager, pBt->nP
1ef90 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
1efa0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
1efb0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1efc0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
1efd0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
1efe0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
1eff0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
1f000 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1f010 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1f020 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f  on is called fro
1f030 6d 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d  m both BtreeComm
1f040 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64  itPhaseTwo() and
1f050 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
1f060 0a 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c  .** at the concl
1f070 75 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73  usion of a trans
1f080 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
1f090 63 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54  c void btreeEndT
1f0a0 72 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65  ransaction(Btree
1f0b0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
1f0c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1f0d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f0e0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
1f0f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1f100 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23  dsMutex(p) );..#
1f110 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f120 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f130 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1f140 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69   = 0;.#endif.  i
1f150 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52  f( p->inTrans>TR
1f160 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e  ANS_NONE && db->
1f170 6e 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20  nVdbeRead>1 ){. 
1f180 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1f190 72 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20  re other active 
1f1a0 73 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20  statements that 
1f1b0 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
1f1c0 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68  atabase.    ** h
1f1d0 61 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65  andle, downgrade
1f1e0 20 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   to a read-only 
1f1f0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
1f200 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
1f210 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69  s.    ** may sti
1f220 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72  ll be reading fr
1f230 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  om the database.
1f240 20 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61    */.    downgra
1f250 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65  deAllSharedCache
1f260 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20  TableLocks(p);. 
1f270 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1f280 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65  TRANS_READ;.  }e
1f290 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  lse{.    /* If t
1f2a0 68 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e  he handle had an
1f2b0 79 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61  y kind of transa
1f2c0 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72  ction open, decr
1f2d0 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a  ement the .    *
1f2e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
1f2f0 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
1f300 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
1f310 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1f320 74 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65  t .    ** reache
1f330 73 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61  s 0, set the sha
1f340 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1f350 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
1f360 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
1f370 28 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  ().    ** call b
1f380 65 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b  elow will unlock
1f390 20 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a   the pager.  */.
1f3a0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
1f3b0 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
1f3c0 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c  {.      clearAll
1f3d0 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
1f3e0 4c 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20  Locks(p);.      
1f3f0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
1f400 6e 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30  n--;.      if( 0
1f410 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
1f420 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ion ){.        p
1f430 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
1f440 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
1f450 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f460 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75     /* Set the cu
1f470 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
1f480 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  n state to TRANS
1f490 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b  _NONE and unlock
1f4a0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67   the .    ** pag
1f4b0 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
1f4c0 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
1f4d0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1f4e0 61 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20  ansaction.  */. 
1f4f0 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
1f500 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
1f510 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
1f520 73 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20  sed(pBt);.  }.. 
1f530 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1f540 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  p);.}../*.** Com
1f550 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
1f560 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
1f570 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
1f580 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
1f590 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
1f5a0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
1f5b0 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
1f5c0 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
1f5d0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1f5e0 65 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  e() routine does
1f5f0 20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65   the first phase
1f600 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62   and should.** b
1f610 65 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20  e invoked prior 
1f620 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  to calling this 
1f630 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71  routine.  The sq
1f640 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
1f650 50 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f  PhaseOne().** ro
1f660 75 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68  utine did all th
1f670 65 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e  e work of writin
1f680 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  g information ou
1f690 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c  t to disk and fl
1f6a0 75 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f  ushing the.** co
1f6b0 6e 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74  ntents so that t
1f6c0 68 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20  hey are written 
1f6d0 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c  onto the disk pl
1f6e0 61 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73  atter.  All this
1f6f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20  .** routine has 
1f700 74 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20  to do is delete 
1f710 6f 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  or truncate or z
1f720 65 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69  ero the header i
1f730 6e 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c  n the.** the rol
1f740 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77  lback journal (w
1f750 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20  hich causes the 
1f760 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63  transaction to c
1f770 6f 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72  ommit) and.** dr
1f780 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
1f790 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20  Normally, if an 
1f7a0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1f7b0 6c 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  le the pager lay
1f7c0 65 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67  er is attempting
1f7d0 20 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65   to .** finalize
1f7e0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
1f7f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
1f800 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1f810 72 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  rns an error and
1f820 0a 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61  .** the upper la
1f830 79 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74  yer will attempt
1f840 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77   a rollback. How
1f850 65 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63  ever, if the sec
1f860 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20  ond argument.** 
1f870 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e  is non-zero then
1f880 20 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61   this b-tree tra
1f890 6e 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74  nsaction is part
1f8a0 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65   of a multi-file
1f8b0 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
1f8c0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
1f8d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1f8e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1f8f0 20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28   committed .** (
1f900 62 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61  by deleting a ma
1f910 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1f920 65 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65  e) and the calle
1f930 72 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68  r will ignore th
1f940 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73  is .** functions
1f950 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f   return code. So
1f960 2c 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  , even if an err
1f970 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
1f980 20 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a   pager layer,.**
1f990 20 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65   reset the b-tre
1f9a0 65 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e  e objects intern
1f9b0 61 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69  al state to indi
1f9c0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72  cate that the wr
1f9d0 69 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ite.** transacti
1f9e0 6f 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73  on has been clos
1f9f0 65 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74  ed. This is quit
1fa00 65 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70  e safe, as the p
1fa10 61 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a  ager will have.*
1fa20 2a 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74  * transitioned t
1fa30 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
1fa40 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  e..**.** This wi
1fa50 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
1fa60 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
1fa70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fa80 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
1fa90 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
1faa0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
1fab0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
1fac0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
1fad0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
1fae0 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20  seTwo(Btree *p, 
1faf0 69 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a  int bCleanup){..
1fb00 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1fb10 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72  ==TRANS_NONE ) r
1fb20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1fb30 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1fb40 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1fb50 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1fb60 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1fb70 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
1fb80 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
1fb90 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
1fba0 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
1fbb0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
1fbc0 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
1fbd0 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
1fbe0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
1fbf0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1fc00 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
1fc10 20 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65   rc;.    BtShare
1fc20 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
1fc30 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1fc40 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
1fc50 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
1fc60 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1fc70 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
1fc80 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1fc90 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1fca0 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
1fcb0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
1fcc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43  =SQLITE_OK && bC
1fcd0 6c 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20  leanup==0 ){.   
1fce0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
1fcf0 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72  eave(p);.      r
1fd00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1fd10 20 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73      p->iDataVers
1fd20 69 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65  ion--;  /* Compe
1fd30 6e 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72  nsate for pPager
1fd40 2d 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b  ->iDataVersion++
1fd50 3b 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e  ; */.    pBt->in
1fd60 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
1fd70 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74  ANS_READ;.    bt
1fd80 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
1fd90 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  nt(pBt);.  }..  
1fda0 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74  btreeEndTransact
1fdb0 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ion(p);.  sqlite
1fdc0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
1fdd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fde0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
1fdf0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
1fe00 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
1fe10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1fe20 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
1fe30 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
1fe40 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1fe50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1fe60 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
1fe70 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
1fe80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1fe90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fea0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1feb0 54 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20  Two(p, 0);.  }. 
1fec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1fed0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1fee0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1fef0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1ff00 68 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53  he state to CURS
1ff10 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65  OR_FAULT and the
1ff20 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74   error.** code t
1ff30 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76  o errCode for ev
1ff40 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e  ery cursor on an
1ff50 79 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  y BtShared that 
1ff60 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
1ff70 6e 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65  nces.  Or if the
1ff80 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
1ff90 69 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65  is set to 1, the
1ffa0 6e 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77  n only.** trip w
1ffb0 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64  rite cursors and
1ffc0 20 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73   leave read curs
1ffd0 6f 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ors unchanged..*
1ffe0 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f  *.** Every curso
1fff0 72 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  r is a candidate
20000 20 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20   to be tripped, 
20010 69 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72  including cursor
20020 73 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67  s.** that belong
20030 20 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61   to other databa
20040 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
20050 68 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65  hat happen to be
20060 0a 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20  .** sharing the 
20070 63 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65  cache with pBtre
20080 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
20090 75 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65  utine gets calle
200a0 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63  d when a rollbac
200b0 6b 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65  k occurs. If the
200c0 20 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c   writeOnly.** fl
200d0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
200e0 20 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73   only write-curs
200f0 6f 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70  ors need be trip
20100 70 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a  ped - read-only.
20110 2a 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20  ** cursors save 
20120 74 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f  their current po
20130 73 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20  sitions so that 
20140 74 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75  they may continu
20150 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  e .** following 
20160 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72  the rollback. Or
20170 2c 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69  , if writeOnly i
20180 73 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72  s false, all cur
20190 73 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69  sors are .** tri
201a0 70 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c  pped. In general
201b0 2c 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66  , writeOnly is f
201c0 61 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e  alse if the tran
201d0 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a  saction being.**
201e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64   rolled back mod
201f0 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
20200 73 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68  se schema. In th
20210 69 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72  is case b-tree r
20220 6f 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79  oot.** pages may
20230 20 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c   be moved or del
20240 65 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  eted from the da
20250 74 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65  tabase altogethe
20260 72 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20  r, making.** it 
20270 75 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20  unsafe for read 
20280 63 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69  cursors to conti
20290 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nue..**.** If th
202a0 65 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67  e writeOnly flag
202b0 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20   is true and an 
202c0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
202d0 65 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73  ered while .** s
202e0 61 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aving the curren
202f0 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20  t position of a 
20300 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
20310 2c 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a  , all cursors, .
20320 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c  ** including all
20330 20 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72   read-cursors ar
20340 65 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a  e tripped..**.**
20350 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
20360 74 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73  turned if succes
20370 73 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65  sful, or if an e
20380 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
20390 65 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75  e.** saving a cu
203a0 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61  rsor position, a
203b0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
203c0 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ode..*/.int sqli
203d0 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
203e0 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42  ursors(Btree *pB
203f0 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64  tree, int errCod
20400 65 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79  e, int writeOnly
20410 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
20420 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
20430 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
20440 74 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30  t( (writeOnly==0
20450 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31   || writeOnly==1
20460 29 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46  ) && BTCF_WriteF
20470 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20  lag==1 );.  if( 
20480 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71  pBtree ){.    sq
20490 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
204a0 70 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72  pBtree);.    for
204b0 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
204c0 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
204d0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
204e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20  nt i;.      if( 
204f0 77 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d  writeOnly && (p-
20500 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
20510 5f 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29  _WriteFlag)==0 )
20520 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
20530 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
20540 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
20550 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
20560 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
20570 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72   rc = saveCursor
20580 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20  Position(p);.   
20590 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
205a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
205b0 20 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71          (void)sq
205c0 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
205d0 6c 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c  lCursors(pBtree,
205e0 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   rc, 0);.       
205f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20610 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
20620 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
20630 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
20640 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53  );.        p->eS
20650 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41  tate = CURSOR_FA
20660 55 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  ULT;.        p->
20670 73 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f  skipNext = errCo
20680 64 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  de;.      }.    
20690 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d    for(i=0; i<=p-
206a0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
206b0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
206c0 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b  e(p->apPage[i]);
206d0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61  .        p->apPa
206e0 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ge[i] = 0;.     
206f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
20700 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20710 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
20720 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20730 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74  * Rollback the t
20740 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72  ransaction in pr
20750 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  ogress..**.** If
20760 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
20770 20 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20   SQLITE_OK then 
20780 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20  cursors will be 
20790 69 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69  invalidated (tri
207a0 70 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77  pped)..** Only w
207b0 72 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65  rite cursors are
207c0 20 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74   tripped if writ
207d0 65 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75  eOnly is true bu
207e0 74 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72  t all cursors ar
207f0 65 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20  e.** tripped if 
20800 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c  writeOnly is fal
20810 73 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74  se.  Any attempt
20820 20 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69   to use.** a tri
20830 70 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c  pped cursor will
20840 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72   result in an er
20850 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ror..**.** This 
20860 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
20870 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
20880 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20890 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
208a0 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
208b0 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
208c0 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
208d0 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
208e0 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63  ite3BtreeRollbac
208f0 6b 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  k(Btree *p, int 
20900 74 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72  tripCode, int wr
20910 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20  iteOnly){.  int 
20920 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
20930 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
20940 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
20950 0a 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74  ..  assert( writ
20960 65 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74  eOnly==1 || writ
20970 65 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73  eOnly==0 );.  as
20980 73 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d  sert( tripCode==
20990 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
209a0 4c 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64  LBACK || tripCod
209b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
209c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
209d0 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72  ter(p);.  if( tr
209e0 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  ipCode==SQLITE_O
209f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72  K ){.    rc = tr
20a00 69 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c  ipCode = saveAll
20a10 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
20a20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
20a30 20 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a   writeOnly = 0;.
20a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
20a50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
20a60 0a 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20  .  if( tripCode 
20a70 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d  ){.    int rc2 =
20a80 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
20a90 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74  pAllCursors(p, t
20aa0 72 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e  ripCode, writeOn
20ab0 6c 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ly);.    assert(
20ac0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
20ad0 7c 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  | (writeOnly==0 
20ae0 26 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  && rc2==SQLITE_O
20af0 4b 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  K) );.    if( rc
20b00 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  2!=SQLITE_OK ) r
20b10 63 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62  c = rc2;.  }.  b
20b20 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
20b30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
20b40 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
20b50 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
20b60 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52  ..    assert( TR
20b70 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e  ANS_WRITE==pBt->
20b80 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b  inTransaction );
20b90 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74  .    rc2 = sqlit
20ba0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20bb0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
20bc0 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
20bd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
20be0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20   = rc2;.    }.. 
20bf0 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61     /* The rollba
20c00 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74  ck may have dest
20c10 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31  royed the pPage1
20c20 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20  ->aData value.  
20c30 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62  So.    ** call b
20c40 74 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e  treeGetPage() on
20c50 20 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f   page 1 again to
20c60 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
20c70 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
20c80 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
20c90 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72  . */.    if( btr
20ca0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31  eeGetPage(pBt, 1
20cb0 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53  , &pPage1, 0)==S
20cc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20cd0 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65    int nPage = ge
20ce0 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70  t4byte(28+(u8*)p
20cf0 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20  Page1->aData);. 
20d00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
20d10 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
20d20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20   if( nPage==0 ) 
20d30 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
20d40 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
20d50 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
20d60 20 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d    testcase( pBt-
20d70 3e 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b  >nPage!=nPage );
20d80 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
20d90 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
20da0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
20db0 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
20dc0 61 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c  assert( countVal
20dd0 69 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31  idCursors(pBt, 1
20de0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
20df0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
20e00 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
20e10 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f   btreeClearHasCo
20e20 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a  ntent(pBt);.  }.
20e30 0a 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73  .  btreeEndTrans
20e40 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c  action(p);.  sql
20e50 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
20e60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
20e70 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61  }../*.** Start a
20e80 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   statement subtr
20e90 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73  ansaction. The s
20ea0 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
20eb0 6e 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n be rolled.** b
20ec0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
20ed0 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72  y of the main tr
20ee0 61 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d  ansaction. You m
20ef0 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
20f00 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f  saction .** befo
20f10 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
20f20 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68  btransaction. Th
20f30 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
20f40 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
20f50 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74  tically .** if t
20f60 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
20f70 69 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72  ion commits or r
20f80 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  olls back..**.**
20f90 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
20fa0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
20fb0 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
20fc0 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
20fd0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
20fe0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
20ff0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
21000 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
21010 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
21020 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
21030 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
21040 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
21050 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
21060 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
21070 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
21080 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
21090 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
210a0 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
210b0 20 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   A statement sub
210c0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  -transaction is 
210d0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61  implemented as a
210e0 6e 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65  n anonymous save
210f0 70 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61  point. The.** va
21100 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
21110 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
21120 65 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20  er is the total 
21130 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f  number of savepo
21140 69 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69  ints,.** includi
21150 6e 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79  ng the new anony
21160 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20  mous savepoint, 
21170 6f 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72  open on the B-Tr
21180 65 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72  ee. i.e. if ther
21190 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
211a0 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
211b0 64 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65  d no other state
211c0 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e  ment-transaction
211d0 73 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74  s open,.** iStat
211e0 65 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73  ement is 1. This
211f0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
21200 6f 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65  oint can be rele
21210 61 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  ased or rolled b
21220 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65  ack.** using the
21230 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
21240 65 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f  epoint() functio
21250 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
21260 33 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28  3BtreeBeginStmt(
21270 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53  Btree *p, int iS
21280 74 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74  tatement){.  int
21290 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
212a0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
212b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
212c0 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
212d0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
212e0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73  NS_WRITE );.  as
212f0 73 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46  sert( (pBt->btsF
21300 6c 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f  lags & BTS_READ_
21310 4f 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ONLY)==0 );.  as
21320 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
21330 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
21340 69 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62  iStatement>p->db
21350 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a  ->nSavepoint );.
21360 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
21370 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
21380 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f  ANS_WRITE );.  /
21390 2a 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c  * At the pager l
213a0 65 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e  evel, a statemen
213b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
213c0 20 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74   a savepoint wit
213d0 68 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20  h.  ** an index 
213e0 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c  greater than all
213f0 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61   savepoints crea
21400 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75  ted explicitly u
21410 73 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74  sing.  ** SQL st
21420 61 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20  atements. It is 
21430 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c  illegal to open,
21440 20 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c   release or roll
21450 62 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75  back any.  ** su
21460 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68  ch savepoints wh
21470 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ile the statemen
21480 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61  t transaction sa
21490 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76  vepoint is activ
214a0 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  e..  */.  rc = s
214b0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53  qlite3PagerOpenS
214c0 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50  avepoint(pBt->pP
214d0 61 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74  ager, iStatement
214e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
214f0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
21500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21510 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
21520 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
21530 63 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c  ction, op, is al
21540 77 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52  ways SAVEPOINT_R
21550 4f 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41  OLLBACK.** or SA
21560 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
21570 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65   This function e
21580 69 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f  ither releases o
21590 72 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65  r rolls back the
215a0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64  .** savepoint id
215b0 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
215c0 6d 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74  meter iSavepoint
215d0 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74  , depending on t
215e0 68 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20  he value .** of 
215f0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c  op..**.** Normal
21600 6c 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69  ly, iSavepoint i
21610 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
21620 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e  r equal to zero.
21630 20 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20   However, if op 
21640 69 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  is.** SAVEPOINT_
21650 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69  ROLLBACK, then i
21660 53 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c  Savepoint may al
21670 73 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69  so be -1. In thi
21680 73 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63  s case the .** c
21690 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65  ontents of the e
216a0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
216b0 6e 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63  n are rolled bac
216c0 6b 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65  k. This is diffe
216d0 72 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e  rent.** from a n
216e0 6f 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f  ormal transactio
216f0 6e 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e  n rollback, as n
21700 6f 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65  o locks are rele
21710 61 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20  ased and the.** 
21720 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61  transaction rema
21730 69 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74  ins open..*/.int
21740 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
21750 65 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c  epoint(Btree *p,
21760 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61   int op, int iSa
21770 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20  vepoint){.  int 
21780 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
21790 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e    if( p && p->in
217a0 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
217b0 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72  TE ){.    BtShar
217c0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
217d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70  ;.    assert( op
217e0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
217f0 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
21800 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
21810 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61  .    assert( iSa
21820 76 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69  vepoint>=0 || (i
21830 53 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26  Savepoint==-1 &&
21840 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52   op==SAVEPOINT_R
21850 4f 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20  OLLBACK) );.    
21860 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
21870 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  r(p);.    rc = s
21880 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
21890 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  oint(pBt->pPager
218a0 2c 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74  , op, iSavepoint
218b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
218c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
218d0 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
218e0 3c 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  <0 && (pBt->btsF
218f0 6c 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49  lags & BTS_INITI
21900 41 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29  ALLY_EMPTY)!=0 )
21910 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  {.        pBt->n
21920 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
21930 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77  }.      rc = new
21940 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20  Database(pBt);. 
21950 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20       pBt->nPage 
21960 3d 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20  = get4byte(28 + 
21970 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
21980 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ta);..      /* T
21990 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
219a0 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74   was written int
219b0 6f 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20  o the offset 28 
219c0 6f 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20  of the header.  
219d0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
219e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
219f0 74 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20  ted, so we know 
21a00 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61  that the value a
21a10 74 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a  t offset.      *
21a20 2a 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e  * 28 is nonzero.
21a30 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
21a40 28 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29  ( pBt->nPage>0 )
21a50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
21a60 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21a70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
21a80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
21a90 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
21aa0 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
21ab0 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
21ac0 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
21ad0 65 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c  e. If a read-onl
21ae0 79 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75  y cursor is requ
21af0 65 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73  ested, it is ass
21b00 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
21b10 20 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20   caller already 
21b20 68 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72  has at least a r
21b30 65 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63  ead-only transac
21b40 74 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20  tion open.** on 
21b50 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72  the database alr
21b60 65 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65  eady. If a write
21b70 2d 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65  -cursor is reque
21b80 73 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  sted, then.** th
21b90 65 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75  e caller is assu
21ba0 6d 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f  med to have an o
21bb0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
21bc0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ction..**.** If 
21bd0 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
21be0 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
21bf0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
21c00 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
21c10 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
21c20 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
21c30 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
21c40 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
21c50 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
21c60 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
21c70 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
21c80 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
21c90 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
21ca0 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
21cb0 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
21cc0 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
21cd0 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
21ce0 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
21cf0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
21d00 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
21d10 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
21d20 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21d30 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
21d40 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
21d50 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
21d60 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
21d70 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
21d80 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
21d90 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
21da0 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
21db0 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
21dc0 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
21dd0 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
21de0 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
21df0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
21e00 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
21e10 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
21e20 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
21e30 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
21e40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
21e50 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
21e60 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
21e70 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
21e80 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
21e90 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
21ea0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
21eb0 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
21ec0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
21ed0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
21ee0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
21ef0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
21f00 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
21f10 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
21f20 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
21f30 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
21f40 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
21f50 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
21f60 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
21f70 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
21f80 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
21f90 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
21fa0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
21fb0 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
21fc0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
21fd0 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
21fe0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
21ff0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
22000 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
22010 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
22020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22040 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
22050 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
22080 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
22090 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
220a0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220c0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
220d0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
220e0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
220f0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
22100 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
22110 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
22120 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
22130 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
22140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22150 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
22160 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
22170 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
22180 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
22190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
221a0 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
221b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75  handle */.  BtCu
221c0 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20  rsor *pX;       
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76     /* Looping ov
221f0 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72  er other all cur
22200 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sors */..  asser
22210 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
22220 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
22230 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22240 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  ==0 .       || w
22250 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43  rFlag==BTREE_WRC
22260 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  SR .       || wr
22270 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43  Flag==(BTREE_WRC
22280 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  SR|BTREE_FORDELE
22290 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  TE) .  );..  /* 
222a0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
222b0 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
222c0 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
222d0 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
222e0 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
222f0 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
22300 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
22310 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
22320 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
22330 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
22340 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
22350 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
22360 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
22370 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
22380 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
22390 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
223a0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
223b0 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
223c0 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32  fo!=0, (wrFlag?2
223d0 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  :1)) );.  assert
223e0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
223f0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
22400 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
22410 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
22420 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
22430 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
22440 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
22450 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
22460 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
22470 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
22480 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
22490 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
224a0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
224b0 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
224c0 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
224d0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
224e0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28  ( wrFlag==0 || (
224f0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
22500 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
22510 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c  0 );..  if( wrFl
22520 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
22530 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
22540 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
22550 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
22560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22570 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61  M;.  }.  if( iTa
22580 62 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50  ble==1 && btreeP
22590 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30  agecount(pBt)==0
225a0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
225b0 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  wrFlag==0 );.   
225c0 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d   iTable = 0;.  }
225d0 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
225e0 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
225f0 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
22600 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
22610 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
22620 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e  ariables and lin
22630 6b 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74  k the cursor int
22640 6f 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c  o the BtShared l
22650 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d  ist.  */.  pCur-
22660 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e  >pgnoRoot = (Pgn
22670 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72  o)iTable;.  pCur
22680 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20  ->iPage = -1;.  
22690 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  pCur->pKeyInfo =
226a0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75   pKeyInfo;.  pCu
226b0 72 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20  r->pBtree = p;. 
226c0 20 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74   pCur->pBt = pBt
226d0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
226e0 67 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54  gs = wrFlag ? BT
226f0 43 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30  CF_WriteFlag : 0
22700 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67  ;.  pCur->curPag
22710 65 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  erFlags = wrFlag
22720 20 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54   ? 0 : PAGER_GET
22730 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20  _READONLY;.  /* 
22740 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
22750 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
22760 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
22770 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
22780 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a  h.  ** cursors *
22790 6d 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42  must* have the B
227a0 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61  TCF_Multiple fla
227b0 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28  g set. */.  for(
227c0 70 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  pX=pBt->pCursor;
227d0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
227e0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e  t){.    if( pX->
227f0 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29  pgnoRoot==(Pgno)
22800 69 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  iTable ){.      
22810 70 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20  pX->curFlags |= 
22820 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
22830 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
22840 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74  ags |= BTCF_Mult
22850 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iple;.    }.  }.
22860 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20    pCur->pNext = 
22870 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
22880 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
22890 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  Cur;.  pCur->eSt
228a0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
228b0 41 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53  ALID;.  return S
228c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
228d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
228e0 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22910 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a    /* The btree *
22920 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  /.  int iTable, 
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20  /* Root page of 
22960 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  table to open */
22970 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20  .  int wrFlag,  
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
229a0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
229b0 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
229c0 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
229d0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
229e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
229f0 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70  rst arg to xComp
22a00 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72  are() */.  BtCur
22a10 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
22a40 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20  new cursor here 
22a50 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
22a60 20 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29    if( iTable<1 )
22a70 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
22a80 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22a90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
22aa0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
22ab0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
22ac0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
22ad0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
22ae0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20  nfo, pCur);.    
22af0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
22b00 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
22b10 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22b20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
22b30 6f 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62  of a BtCursor ob
22b40 6a 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a  ject in bytes..*
22b50 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66  *.** This interf
22b60 61 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73  aces is needed s
22b70 6f 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20  o that users of 
22b80 63 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61  cursors can prea
22b90 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69  llocate.** suffi
22ba0 63 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f  cient storage to
22bb0 20 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20   hold a cursor. 
22bc0 20 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62   The BtCursor ob
22bd0 6a 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a  ject is opaque.*
22be0 2a 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68  * to users so th
22bf0 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65  ey cannot do the
22c00 20 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65   sizeof() themse
22c10 6c 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74  lves - they must
22c20 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f   call.** this ro
22c30 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  utine..*/.int sq
22c40 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
22c50 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65  Size(void){.  re
22c60 74 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65  turn ROUND8(size
22c70 6f 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d  of(BtCursor));.}
22c80 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
22c90 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  ze memory that w
22ca0 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64  ill be converted
22cb0 20 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72   into a BtCursor
22cc0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
22cd0 68 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61  he simple approa
22ce0 63 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65  ch here would be
22cf0 20 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65   to memset() the
22d00 20 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a   entire object.*
22d10 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20  * to zero.  But 
22d20 69 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61  it turns out tha
22d30 74 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61  t the apPage[] a
22d40 6e 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79  nd aiIdx[] array
22d50 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64  s.** do not need
22d60 20 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e   to be zeroed an
22d70 64 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65  d they are large
22d80 2c 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65  , so we can save
22d90 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e   a lot.** of run
22da0 2d 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e  -time by skippin
22db0 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  g the initializa
22dc0 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c  tion of those el
22dd0 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  ements..*/.void 
22de0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
22df0 6f 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20  orZero(BtCursor 
22e00 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  *p){.  memset(p,
22e10 20 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43   0, offsetof(BtC
22e20 75 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a  ursor, iPage));.
22e30 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
22e40 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65   cursor.  The re
22e50 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
22e60 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
22e70 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e  released.** when
22e80 20 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72   the last cursor
22e90 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69   is closed..*/.i
22ea0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
22eb0 6c 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72  loseCursor(BtCur
22ec0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74  sor *pCur){.  Bt
22ed0 72 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43  ree *pBtree = pC
22ee0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66  ur->pBtree;.  if
22ef0 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20  ( pBtree ){.    
22f00 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61  int i;.    BtSha
22f10 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
22f20 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
22f30 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
22f40 65 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ee);.    sqlite3
22f50 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72  BtreeClearCursor
22f60 28 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65  (pCur);.    asse
22f70 72 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  rt( pBt->pCursor
22f80 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
22f90 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75  Bt->pCursor==pCu
22fa0 72 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  r ){.      pBt->
22fb0 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
22fc0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
22fd0 7b 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72  {.      BtCursor
22fe0 20 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70   *pPrev = pBt->p
22ff0 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f  Cursor;.      do
23000 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
23010 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72  rev->pNext==pCur
23020 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
23030 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
23040 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  r->pNext;.      
23050 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
23060 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72     }.        pPr
23070 65 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78  ev = pPrev->pNex
23080 74 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  t;.      }while(
23090 20 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29   ALWAYS(pPrev) )
230a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
230b0 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50  i=0; i<=pCur->iP
230c0 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  age; i++){.     
230d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75   releasePage(pCu
230e0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20  r->apPage[i]);. 
230f0 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42     }.    unlockB
23100 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
23110 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
23120 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  ree(pCur->aOverf
23130 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  low);.    /* sql
23140 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b  ite3_free(pCur);
23150 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
23160 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
23170 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
23180 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
23190 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68  .** Make sure th
231a0 65 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65  e BtCursor* give
231b0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
231c0 74 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a  t has a valid.**
231d0 20 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73   BtCursor.info s
231e0 74 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74  tructure.  If it
231f0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
23200 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62  valid, call.** b
23210 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
23220 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a  to fill it in..*
23230 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  *.** BtCursor.in
23240 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66  fo is a cache of
23250 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
23260 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
23270 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74  cell..** Using t
23280 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65  his cache reduce
23290 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
232a0 63 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61  calls to btreePa
232b0 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69  rseCell()..*/.#i
232c0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73  fndef NDEBUG.  s
232d0 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
232e0 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
232f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43  or *pCur){.    C
23300 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
23310 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
23320 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d  ur->iPage;.    m
23330 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20  emset(&info, 0, 
23340 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20  sizeof(info));. 
23350 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c     btreeParseCel
23360 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  l(pCur->apPage[i
23370 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49  Page], pCur->aiI
23380 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f  dx[iPage], &info
23390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43  );.    assert( C
233a0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d  ORRUPT_DB || mem
233b0 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72  cmp(&info, &pCur
233c0 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69  ->info, sizeof(i
233d0 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a  nfo))==0 );.  }.
233e0 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20  #else.  #define 
233f0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78  assertCellInfo(x
23400 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
23410 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
23420 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f  void getCellInfo
23430 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
23440 7b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  {.  if( pCur->in
23450 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20  fo.nSize==0 ){. 
23460 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70     int iPage = p
23470 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20  Cur->iPage;.    
23480 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
23490 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  = BTCF_ValidNKey
234a0 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
234b0 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
234c0 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61  e[iPage],pCur->a
234d0 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75  iIdx[iPage],&pCu
234e0 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73  r->info);.  }els
234f0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c  e{.    assertCel
23500 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d  lInfo(pCur);.  }
23510 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
23520 55 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20  UG  /* The next 
23530 72 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c  routine used onl
23540 79 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28  y within assert(
23550 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
23560 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
23570 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42  e if the given B
23580 74 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64  tCursor is valid
23590 2e 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f  .  A valid curso
235a0 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74  r is one.** that
235b0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
235c0 69 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20  inting to a row 
235d0 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29  in a (non-empty)
235e0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20   table..** This 
235f0 69 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f  is a verificatio
23600 6e 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  n routine is use
23610 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
23620 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
23630 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
23640 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
23650 6c 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  lid(BtCursor *pC
23660 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43  ur){.  return pC
23670 75 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61  ur && pCur->eSta
23680 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
23690 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44  ;.}.#endif /* ND
236a0 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  EBUG */../*.** S
236b0 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
236c0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66   size of the buf
236d0 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  fer needed to ho
236e0 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a  ld the value of.
236f0 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74  ** the key for t
23700 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
23710 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
23720 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
23730 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65  .** to a valid e
23740 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20  ntry, *pSize is 
23750 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a  set to 0. .**.**
23760 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74   For a table wit
23770 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61  h the INTKEY fla
23780 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74  g set, this rout
23790 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
237a0 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e  key.** itself, n
237b0 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ot the number of
237c0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65   bytes in the ke
237d0 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  y..**.** The cal
237e0 6c 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f  ler must positio
237f0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69  n the cursor pri
23800 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74  or to invoking t
23810 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20  his routine..** 
23820 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23830 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49   cannot fail.  I
23840 74 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73  t always returns
23850 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f   SQLITE_OK.  .*/
23860 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
23870 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f  eKeySize(BtCurso
23880 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53  r *pCur, i64 *pS
23890 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
238a0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
238b0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
238c0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
238d0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
238e0 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
238f0 70 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20  pCur);.  *pSize 
23900 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65  = pCur->info.nKe
23910 79 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  y;.  return SQLI
23920 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
23930 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
23940 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
23950 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  s of data in the
23960 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75   entry the.** cu
23970 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  rsor currently p
23980 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20  oints to..**.** 
23990 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20  The caller must 
239a0 67 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74  guarantee that t
239b0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
239c0 6e 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e  nting to a non-N
239d0 55 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74  ULL.** valid ent
239e0 72 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ry.  In other wo
239f0 72 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  rds, the calling
23a00 20 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20   procedure must 
23a10 67 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61  guarantee.** tha
23a20 74 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73  t the cursor has
23a30 20 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d   Cursor.eState==
23a40 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a  CURSOR_VALID..**
23a50 0a 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e  .** Failure is n
23a60 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68  ot possible.  Th
23a70 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
23a80 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
23a90 45 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68  E_OK..** It migh
23aa0 74 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62  t just as well b
23ab0 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72  e a procedure (r
23ac0 65 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62  eturning void) b
23ad0 75 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a  ut we continue.*
23ae0 2a 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69  * to return an i
23af0 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f  nteger result co
23b00 64 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61  de for historica
23b10 6c 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e  l reasons..*/.in
23b20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
23b30 74 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20  taSize(BtCursor 
23b40 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a  *pCur, u32 *pSiz
23b50 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  e){.  assert( cu
23b60 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
23b70 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
23b80 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
23b90 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
23ba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
23bb0 2d 3e 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20  ->iPage>=0 );.  
23bc0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
23bd0 61 67 65 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58  age<BTCURSOR_MAX
23be0 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
23bf0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
23c00 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69  [pCur->iPage]->i
23c10 6e 74 4b 65 79 4c 65 61 66 3d 3d 31 20 29 3b 0a  ntKeyLeaf==1 );.
23c20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
23c30 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20  ur);.  *pSize = 
23c40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c  pCur->info.nPayl
23c50 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oad;.  return SQ
23c60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
23c70 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67 65  * Given the page
23c80 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76   number of an ov
23c90 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74  erflow page in t
23ca0 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61 72  he database (par
23cb0 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c  ameter.** ovfl),
23cc0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66   this function f
23cd0 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e 75  inds the page nu
23ce0 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74  mber of the next
23cf0 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a   page in the .**
23d00 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
23d10 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
23d20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20  If possible, it 
23d30 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61  uses the auto-va
23d40 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d  cuum.** pointer-
23d50 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61 64  map data instead
23d60 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65 20   of reading the 
23d70 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
23d80 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a  ovfl to do so. .
23d90 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
23da0 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69  r occurs an SQLi
23db0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
23dc0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
23dd0 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  wise:.**.** The 
23de0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
23df0 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77  he next overflow
23e00 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e   page in the lin
23e10 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20  ked list is .** 
23e20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e  written to *pPgn
23e30 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f  oNext. If page o
23e40 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20  vfl is the last 
23e50 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b  page in its link
23e60 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50  ed .** list, *pP
23e70 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74  gnoNext is set t
23e80 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49  o zero. .**.** I
23e90 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20  f ppPage is not 
23ea0 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65  NULL, and a refe
23eb0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d  rence to the Mem
23ec0 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72  Page object corr
23ed0 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
23ee0 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66  page number pOvf
23ef0 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20  l was obtained, 
23f00 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20  then *ppPage is 
23f10 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
23f20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63  that.** referenc
23f30 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73  e. It is the res
23f40 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
23f50 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c  he caller to cal
23f60 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a  l releasePage().
23f70 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f  ** on *ppPage to
23f80 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72 65   free the refere
23f90 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72  nce. In no refer
23fa0 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65  ence was obtaine
23fb0 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  d (because.** th
23fc0 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61  e pointer-map wa
23fd0 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e  s used to obtain
23fe0 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a   the value for *
23ff0 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e  pPgnoNext), then
24000 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73  .** *ppPage is s
24010 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  et to zero..*/.s
24020 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65  tatic int getOve
24030 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53  rflowPage(.  BtS
24040 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
24050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24070 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20  /.  Pgno ovfl,  
24080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24090 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65 72   /* Current over
240a0 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
240b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a   */.  MemPage **
240c0 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  ppPage,         
240d0 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61     /* OUT: MemPa
240e0 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20 62  ge handle (may b
240f0 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e  e NULL) */.  Pgn
24100 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20  o *pPgnoNext    
24110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
24120 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  : Next overflow 
24130 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29  page number */.)
24140 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20  {.  Pgno next = 
24150 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
24160 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  age = 0;.  int r
24170 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
24180 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
24190 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
241a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
241b0 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b  sert(pPgnoNext);
241c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
241d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
241e0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
241f0 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
24200 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
24210 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
24220 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
24230 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
24240 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
24250 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
24260 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
24270 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
24280 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
24290 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
242a0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
242b0 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
242c0 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
242d0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
242e0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
242f0 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
24300 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
24310 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
24320 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
24330 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
24340 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
24350 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
24360 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
24370 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
24380 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
24390 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
243a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
243b0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
243c0 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
243d0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74 72   if( iGuess<=btr
243e0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
243f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
24400 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
24410 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
24420 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
24430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
24440 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
24450 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f  VERFLOW2 && pgno
24460 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20  ==ovfl ){.      
24470 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73 3b    next = iGuess;
24480 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24490 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20  LITE_DONE;.     
244a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
244b0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  dif..  assert( n
244c0 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51  ext==0 || rc==SQ
244d0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
244e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
244f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74 72   ){.    rc = btr
24500 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
24510 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70 70  vfl, &pPage, (pp
24520 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45 52  Page==0) ? PAGER
24530 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
24540 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
24550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
24560 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20   pPage==0 );.   
24570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74  OK ){.      next
24590 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67   = get4byte(pPag
245a0 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d  e->aData);.    }
245b0 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65  .  }..  *pPgnoNe
245c0 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28  xt = next;.  if(
245d0 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a   ppPage ){.    *
245e0 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a  ppPage = pPage;.
245f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c    }else{.    rel
24600 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
24610 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72  .  }.  return (r
24620 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f  c==SQLITE_DONE ?
24630 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29   SQLITE_OK : rc)
24640 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
24650 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66  data from a buff
24660 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72  er to a page, or
24670 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20   from a page to 
24680 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  a buffer..**.** 
24690 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f  pPayload is a po
246a0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74  inter to data st
246b0 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65  ored on database
246c0 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a   page pDbPage..*
246d0 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f  * If argument eO
246e0 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  p is false, then
246f0 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20   nByte bytes of 
24700 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a  data are copied.
24710 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64  ** from pPayload
24720 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
24730 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75  ointed at by pBu
24740 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75  f. If eOp is tru
24750 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74  e,.** then sqlit
24760 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69  e3PagerWrite() i
24770 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50  s called on pDbP
24780 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79  age and nByte by
24790 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61  tes.** of data a
247a0 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74  re copied from t
247b0 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74  he buffer pBuf t
247c0 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a  o pPayload..**.*
247d0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
247e0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
247f0 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e  ss, otherwise an
24800 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
24810 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50  static int copyP
24820 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a  ayload(.  void *
24830 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20  pPayload,       
24840 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
24850 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20  o page data */. 
24860 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
24870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
24880 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20  inter to buffer 
24890 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
248b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
248c0 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69  s to copy */.  i
248d0 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20  nt eOp,         
248e0 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e           /* 0 ->
248f0 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c   copy from page,
24900 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61   1 -> copy to pa
24910 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ge */.  DbPage *
24920 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20  pDbPage         
24930 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
24940 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f  ning pPayload */
24950 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b  .){.  if( eOp ){
24960 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
24970 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f  a from buffer to
24980 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f   page (a write o
24990 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
249a0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
249b0 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50  3PagerWrite(pDbP
249c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
249d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
249e0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
249f0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
24a00 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c  (pPayload, pBuf,
24a10 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65   nByte);.  }else
24a20 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
24a30 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20  ta from page to 
24a40 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f  buffer (a read o
24a50 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20  peration) */.   
24a60 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50   memcpy(pBuf, pP
24a70 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a  ayload, nByte);.
24a80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
24a90 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
24aa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
24ab0 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f  s used to read o
24ac0 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c  r overwrite payl
24ad0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  oad information.
24ae0 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79  ** for the entry
24af0 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63   that the pCur c
24b00 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
24b10 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a  g to. The eOp.**
24b20 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
24b30 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c  erpreted as foll
24b40 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20  ows:.**.**   0: 
24b50 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  The operation is
24b60 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61 74   a read. Populat
24b70 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
24b80 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68  ache..**   1: Th
24b90 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
24ba0 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74 65   write. Populate
24bb0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61   the overflow ca
24bc0 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65  che..**   2: The
24bd0 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
24be0 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70  read. Do not pop
24bf0 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
24c00 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  ow cache..**.** 
24c10 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22  A total of "amt"
24c20 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64 20   bytes are read 
24c30 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e  or written begin
24c40 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22  ning at "offset"
24c50 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61  ..** Data is rea
24c60 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  d to or from the
24c70 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
24c80 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  .** The content 
24c90 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77 72  being read or wr
24ca0 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70 65  itten might appe
24cb0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
24cc0 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61  age.** or be sca
24cd0 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75  ttered out on mu
24ce0 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20  ltiple overflow 
24cf0 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pages..**.** If 
24d00 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
24d10 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
24d20 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
24d30 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ow pages and the
24d40 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e 74  .** eOp argument
24d50 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73 20   is not 2, this 
24d60 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c  function may all
24d70 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
24d80 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70  and lazily .** p
24d90 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76 65  opulates the ove
24da0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
24db0 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43  cache array (BtC
24dc0 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29  ursor.aOverflow)
24dd0 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  . .** Subsequent
24de0 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 20   calls use this 
24df0 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65  cache to make se
24e00 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70  eking to the sup
24e10 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a  plied offset .**
24e20 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e   more efficient.
24e30 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f  .**.** Once an o
24e40 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
24e50 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
24e60 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d   allocated, it m
24e70 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ay be.** invalid
24e80 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68  ated if some oth
24e90 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73  er cursor writes
24ea0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62   to the same tab
24eb0 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65  le, or if.** the
24ec0 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64   cursor is moved
24ed0 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
24ee0 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c  row. Additionall
24ef0 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75  y, in auto-vacuu
24f00 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66  m.** mode, the f
24f10 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20  ollowing events 
24f20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61  may invalidate a
24f30 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
24f40 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  list cache..**.*
24f50 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65  *   * An increme
24f60 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20  ntal vacuum,.** 
24f70 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20    * A commit in 
24f80 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c  auto_vacuum="ful
24f90 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20  l" mode,.**   * 
24fa0 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65  Creating a table
24fb0 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f   (may require mo
24fc0 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77  ving an overflow
24fd0 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69   page)..*/.stati
24fe0 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c  c int accessPayl
24ff0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
25000 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
25010 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
25020 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
25030 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66  from */.  u32 of
25040 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f  fset,          /
25050 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20  * Begin reading 
25060 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61  this far into pa
25070 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61  yload */.  u32 a
25080 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  mt,             
25090 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e  /* Read this man
250a0 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73  y bytes */.  uns
250b0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66  igned char *pBuf
250c0 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62  , /* Write the b
250d0 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62  ytes into this b
250e0 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  uffer */ .  int 
250f0 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
25100 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
25110 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
25120 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
25130 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
25140 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
25150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
25160 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65  t iIdx = 0;.  Me
25170 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
25180 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
25190 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72  ->iPage]; /* Btr
251a0 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65  ee page of curre
251b0 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74  nt entry */.  Bt
251c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
251d0 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20  ur->pBt;        
251e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
251f0 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62  ee this cursor b
25200 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66  elongs to */.#if
25210 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
25220 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
25230 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25240 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61 72  * const pBufStar
25250 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74 20  t = pBuf;.  int 
25260 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  bEnd;           
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
25290 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64 20   reading to end 
252a0 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69  of data */.#endi
252b0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
252c0 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
252d0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
252e0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
252f0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
25300 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
25310 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
25320 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
25330 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
25340 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
25350 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d  Op!=2 || offset=
25360 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61  =0 );    /* Alwa
25370 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62 65  ys start from be
25380 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d  ginning for eOp=
25390 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c  =2 */..  getCell
253a0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50  Info(pCur);.  aP
253b0 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69  ayload = pCur->i
253c0 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69  nfo.pPayload;.#i
253d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
253e0 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
253f0 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65 74  .  bEnd = offset
25400 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f  +amt==pCur->info
25410 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69  .nPayload;.#endi
25420 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  f.  assert( offs
25430 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e  et+amt <= pCur->
25440 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b  info.nPayload );
25450 0a 0a 20 20 69 66 28 20 26 61 50 61 79 6c 6f 61  ..  if( &aPayloa
25460 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d[pCur->info.nLo
25470 63 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61  cal] > &pPage->a
25480 44 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65  Data[pBt->usable
25490 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20  Size] ){.    /* 
254a0 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
254b0 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
254c0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
254d0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
254e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
254f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25500 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
25510 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
25520 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
25530 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
25540 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
25550 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
25560 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
25570 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
25580 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
25590 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
255a0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
255b0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
255c0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
255d0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
255e0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
255f0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
25600 2c 20 61 2c 20 28 65 4f 70 20 26 20 30 78 30 31  , a, (eOp & 0x01
25610 29 2c 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ), pPage->pDbPag
25620 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d  e);.    offset =
25630 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20   0;.    pBuf += 
25640 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b  a;.    amt -= a;
25650 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66  .  }else{.    of
25660 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e  fset -= pCur->in
25670 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a  fo.nLocal;.  }..
25680 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25690 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
256a0 0a 20 20 20 20 63 6f 6e 73 74 20 75 33 32 20 6f  .    const u32 o
256b0 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
256c0 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
256d0 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
256e0 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
256f0 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
25700 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
25710 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
25720 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
25730 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20  fo.nLocal]);..  
25740 20 20 2f 2a 20 49 66 20 74 68 65 20 42 74 43 75    /* If the BtCu
25750 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d  rsor.aOverflow[]
25760 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
25770 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
25780 65 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a  e it now..    **
25790 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
257a0 61 6c 6c 6f 63 61 74 65 20 61 4f 76 65 72 66 6c  allocate aOverfl
257b0 6f 77 5b 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e  ow[] for eOp==2.
257c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
257d0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
257e0 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
257f0 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65   one entry for e
25800 61 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ach overflow pag
25810 65 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20  e.    ** in the 
25820 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
25830 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
25840 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  of the first ove
25850 72 66 6c 6f 77 20 70 61 67 65 20 69 73 0a 20 20  rflow page is.  
25860 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
25870 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63  Overflow[0], etc
25880 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69  . A value of 0 i
25890 6e 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b  n the aOverflow[
258a0 5d 20 61 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d  ] array.    ** m
258b0 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
258c0 6f 77 6e 22 20 28 74 68 65 20 63 61 63 68 65 20  own" (the cache 
258d0 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61  is lazily popula
258e0 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ted)..    */.   
258f0 20 69 66 28 20 65 4f 70 21 3d 32 20 26 26 20 28   if( eOp!=2 && (
25900 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25910 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
25920 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
25930 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
25940 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
25950 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
25960 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
25970 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Size;.      if( 
25980 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66  nOvfl>pCur->nOvf
25990 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  lAlloc ){.      
259a0 20 20 50 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28    Pgno *aNew = (
259b0 50 67 6e 6f 2a 29 73 71 6c 69 74 65 33 52 65 61  Pgno*)sqlite3Rea
259c0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 20 20  lloc(.          
259d0 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f    pCur->aOverflo
259e0 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f  w, nOvfl*2*sizeo
259f0 66 28 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  f(Pgno).        
25a00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
25a10 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  New==0 ){.      
25a20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25a30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
25a40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25a50 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63  pCur->nOvflAlloc
25a60 20 3d 20 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20   = nOvfl*2;.    
25a70 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
25a80 72 66 6c 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20  rflow = aNew;.  
25a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
25aa0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
25ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25ac0 20 20 20 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e     memset(pCur->
25ad0 61 4f 76 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f  aOverflow, 0, nO
25ae0 76 66 6c 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29  vfl*sizeof(Pgno)
25af0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
25b00 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
25b10 46 5f 56 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20  F_ValidOvfl;.   
25b20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25b30 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66 6c  /* If the overfl
25b40 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
25b50 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  he has been allo
25b60 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20 20  cated and the.  
25b70 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74    ** entry for t
25b80 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72 65  he first require
25b90 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  d overflow page 
25ba0 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20  is valid, skip. 
25bb0 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74     ** directly t
25bc0 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  o it..    */.   
25bd0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
25be0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
25bf0 64 4f 76 66 6c 29 21 3d 30 0a 20 20 20 20 20 26  dOvfl)!=0.     &
25c00 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
25c10 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a  w[offset/ovflSiz
25c20 65 5d 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e].    ){.      
25c30 69 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f  iIdx = (offset/o
25c40 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  vflSize);.      
25c50 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
25c60 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
25c70 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d  ;.      offset =
25c80 20 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a   (offset%ovflSiz
25c90 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  e);.    }..    f
25ca0 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45  or( ; rc==SQLITE
25cb0 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20  _OK && amt>0 && 
25cc0 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b  nextPage; iIdx++
25cd0 29 7b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  ){..      /* If 
25ce0 72 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61  required, popula
25cf0 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
25d00 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
25d10 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
25d20 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
25d30 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
25d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
25d50 73 65 72 74 28 20 70 43 75 72 2d 3e 61 4f 76 65  sert( pCur->aOve
25d60 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20  rflow[iIdx]==0. 
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
25d80 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
25d90 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
25da0 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
25db0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
25dc0 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
25dd0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
25de0 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
25df0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
25e00 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65  offset>=ovflSize
25e10 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
25e20 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74  he only reason t
25e30 6f 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65  o read this page
25e40 20 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68   is to obtain th
25e50 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
25e60 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
25e70 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
25e80 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  e overflow chain
25e90 2e 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20  . The page.     
25ea0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f     ** data is no
25eb0 74 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66  t required. So f
25ec0 69 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b  irst try to look
25ed0 75 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a  up the overflow.
25ee0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d          ** page-
25ef0 6c 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61  list cache, if a
25f00 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61  ny, then fall ba
25f10 63 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65  ck to the getOve
25f20 72 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20  rflowPage().    
25f30 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e      ** function.
25f40 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
25f50 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
25f60 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
25f70 20 61 72 72 61 79 20 6d 75 73 74 20 62 65 20 61   array must be a
25f80 6c 6c 6f 63 61 74 65 64 20 62 65 63 61 75 73 65  llocated because
25f90 20 65 4f 70 21 3d 32 0a 20 20 20 20 20 20 20 20   eOp!=2.        
25fa0 2a 2a 20 68 65 72 65 2e 20 20 49 66 20 65 4f 70  ** here.  If eOp
25fb0 3d 3d 32 2c 20 74 68 65 6e 20 6f 66 66 73 65 74  ==2, then offset
25fc0 3d 3d 30 20 61 6e 64 20 74 68 69 73 20 62 72 61  ==0 and this bra
25fd0 6e 63 68 20 69 73 20 6e 65 76 65 72 20 74 61 6b  nch is never tak
25fe0 65 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  en..        */. 
25ff0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65         assert( e
26000 4f 70 21 3d 32 20 29 3b 0a 20 20 20 20 20 20 20  Op!=2 );.       
26010 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 63   assert( pCur->c
26020 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26030 61 6c 69 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20  alidOvfl );.    
26040 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
26050 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42  ->pBtree->db==pB
26060 74 2d 3e 64 62 20 29 3b 0a 20 20 20 20 20 20 20  t->db );.       
26070 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
26080 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a  flow[iIdx+1] ){.
26090 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
260a0 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
260b0 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20  flow[iIdx+1];.  
260c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
260d0 20 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f         rc = getO
260e0 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c  verflowPage(pBt,
260f0 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e   nextPage, 0, &n
26100 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20  extPage);.      
26110 20 20 7d 0a 20 20 20 20 20 20 20 20 6f 66 66 73    }.        offs
26120 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
26130 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26140 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
26150 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
26160 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
26170 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
26180 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
26190 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
261a0 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
261b0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
261c0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
261d0 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c     */.#ifdef SQL
261e0 49 54 45 5f 44 49 52 45 43 54 5f 4f 56 45 52 46  ITE_DIRECT_OVERF
261f0 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20 20 20 20  LOW_READ.       
26200 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
26210 64 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  d;.#endif.      
26220 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
26230 20 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f         if( a + o
26240 66 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65  ffset > ovflSize
26250 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 20   ){.          a 
26260 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66  = ovflSize - off
26270 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  set;.        }..
26280 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
26290 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
262a0 41 44 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  AD.        /* If
262b0 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69   all the followi
262c0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20 20 20  ng are true:.   
262d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
262e0 2a 2a 20 20 20 31 29 20 74 68 69 73 20 69 73 20  **   1) this is 
262f0 61 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e  a read operation
26300 2c 20 61 6e 64 20 0a 20 20 20 20 20 20 20 20 2a  , and .        *
26310 2a 20 20 20 32 29 20 64 61 74 61 20 69 73 20 72  *   2) data is r
26320 65 71 75 69 72 65 64 20 66 72 6f 6d 20 74 68 65  equired from the
26330 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 6f   start of this o
26340 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e  verflow page, an
26350 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 33  d.        **   3
26360 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  ) the database i
26370 73 20 66 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61  s file-backed, a
26380 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  nd.        **   
26390 34 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6f  4) there is no o
263a0 70 65 6e 20 77 72 69 74 65 2d 74 72 61 6e 73 61  pen write-transa
263b0 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20  ction, and.     
263c0 20 20 20 2a 2a 20 20 20 35 29 20 74 68 65 20 64     **   5) the d
263d0 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 61  atabase is not a
263e0 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c 0a 20   WAL database,. 
263f0 20 20 20 20 20 20 20 2a 2a 20 20 20 36 29 20 61         **   6) a
26400 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
26410 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 72   page is being r
26420 65 61 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ead..        ** 
26430 20 20 37 29 20 61 74 20 6c 65 61 73 74 20 34 20    7) at least 4 
26440 62 79 74 65 73 20 68 61 76 65 20 61 6c 72 65 61  bytes have alrea
26450 64 79 20 62 65 65 6e 20 72 65 61 64 20 69 6e 74  dy been read int
26460 6f 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66  o the output buf
26470 66 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a  fer .        **.
26480 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
26490 64 61 74 61 20 63 61 6e 20 62 65 20 72 65 61 64  data can be read
264a0 20 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74   directly from t
264b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
264c0 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20   into the.      
264d0 20 20 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66    ** output buff
264e0 65 72 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68  er, bypassing th
264f0 65 20 70 61 67 65 2d 63 61 63 68 65 20 61 6c 74  e page-cache alt
26500 6f 67 65 74 68 65 72 2e 20 54 68 69 73 20 73 70  ogether. This sp
26510 65 65 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  eeds.        ** 
26520 75 70 20 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65  up loading large
26530 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 73 70   records that sp
26540 61 6e 20 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77  an many overflow
26550 20 70 61 67 65 73 2e 0a 20 20 20 20 20 20 20 20   pages..        
26560 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  */.        if( (
26570 65 4f 70 26 30 78 30 31 29 3d 3d 30 20 20 20 20  eOp&0x01)==0    
26580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265a0 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20    /* (1) */.    
265b0 20 20 20 20 20 26 26 20 6f 66 66 73 65 74 3d 3d       && offset==
265c0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32             /* (2
265f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26600 20 28 62 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66   (bEnd || a==ovf
26610 6c 53 69 7a 65 29 20 20 20 20 20 20 20 20 20 20  lSize)          
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26630 20 20 20 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20      /* (6) */.  
26640 20 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 69         && pBt->i
26650 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
26660 41 4e 53 5f 52 45 41 44 20 20 20 20 20 20 20 20  ANS_READ        
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26680 28 34 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (4) */.         
26690 26 26 20 28 66 64 20 3d 20 73 71 6c 69 74 65 33  && (fd = sqlite3
266a0 50 61 67 65 72 46 69 6c 65 28 70 42 74 2d 3e 70  PagerFile(pBt->p
266b0 50 61 67 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64  Pager))->pMethod
266c0 73 20 20 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a  s     /* (3) */.
266d0 20 20 20 20 20 20 20 20 20 26 26 20 70 42 74 2d           && pBt-
266e0 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 31  >pPage1->aData[1
266f0 39 5d 3d 3d 30 78 30 31 20 20 20 20 20 20 20 20  9]==0x01        
26700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26710 2a 20 28 35 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (5) */.       
26720 20 20 26 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d    && &pBuf[-4]>=
26730 70 42 75 66 53 74 61 72 74 20 20 20 20 20 20 20  pBufStart       
26740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26750 20 20 20 20 20 20 20 20 2f 2a 20 28 37 29 20 2a          /* (7) *
26760 2f 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  /.        ){.   
26770 20 20 20 20 20 20 20 75 38 20 61 53 61 76 65 5b         u8 aSave[
26780 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 75 38  4];.          u8
26790 20 2a 61 57 72 69 74 65 20 3d 20 26 70 42 75 66   *aWrite = &pBuf
267a0 5b 2d 34 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [-4];.          
267b0 61 73 73 65 72 74 28 20 61 57 72 69 74 65 3e 3d  assert( aWrite>=
267c0 70 42 75 66 53 74 61 72 74 20 29 3b 20 20 20 20  pBufStart );    
267d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267e0 20 20 20 20 20 2f 2a 20 68 65 6e 63 65 20 28 37       /* hence (7
267f0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  ) */.          m
26800 65 6d 63 70 79 28 61 53 61 76 65 2c 20 61 57 72  emcpy(aSave, aWr
26810 69 74 65 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ite, 4);.       
26820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
26830 73 52 65 61 64 28 66 64 2c 20 61 57 72 69 74 65  sRead(fd, aWrite
26840 2c 20 61 2b 34 2c 20 28 69 36 34 29 70 42 74 2d  , a+4, (i64)pBt-
26850 3e 70 61 67 65 53 69 7a 65 2a 28 6e 65 78 74 50  >pageSize*(nextP
26860 61 67 65 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  age-1));.       
26870 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
26880 74 34 62 79 74 65 28 61 57 72 69 74 65 29 3b 0a  t4byte(aWrite);.
26890 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
268a0 28 61 57 72 69 74 65 2c 20 61 53 61 76 65 2c 20  (aWrite, aSave, 
268b0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  4);.        }els
268c0 65 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  e.#endif..      
268d0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62    {.          Db
268e0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
268f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
26900 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
26910 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
26920 61 67 65 2c 20 26 70 44 62 50 61 67 65 2c 0a 20  age, &pDbPage,. 
26930 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 65               ((e
26940 4f 70 26 30 78 30 31 29 3d 3d 30 20 3f 20 50 41  Op&0x01)==0 ? PA
26950 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
26960 20 3a 20 30 29 0a 20 20 20 20 20 20 20 20 20 20   : 0).          
26970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
26980 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26990 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 50  {.            aP
269a0 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
269b0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
269c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
269d0 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
269e0 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29  t4byte(aPayload)
269f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
26a00 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26   = copyPayload(&
26a10 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b  aPayload[offset+
26a20 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 28 65 4f  4], pBuf, a, (eO
26a30 70 26 30 78 30 31 29 2c 20 70 44 62 50 61 67 65  p&0x01), pDbPage
26a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
26a50 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
26a60 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
26a70 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
26a80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
26a90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26aa0 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20   amt -= a;.     
26ab0 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20     pBuf += a;.  
26ac0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
26ad0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
26ae0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
26af0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26b00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
26b10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26b20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
26b30 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
26b40 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
26b50 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
26b60 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
26b70 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
26b80 6e 73 66 65 72 72 65 64 20 69 6e 74 6f 20 70 42  nsferred into pB
26b90 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73  uf[].  The trans
26ba0 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74  fer.** begins at
26bb0 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a   "offset"..**.**
26bc0 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
26bd0 20 65 6e 73 75 72 65 20 74 68 61 74 20 70 43 75   ensure that pCu
26be0 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  r is pointing to
26bf0 20 61 20 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20   a valid row.** 
26c00 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
26c10 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
26c20 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
26c30 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
26c40 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
26c50 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
26c60 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
26c70 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
26c80 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
26c90 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
26ca0 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
26cb0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
26cc0 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
26cd0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
26ce0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
26cf0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  f){.  assert( cu
26d00 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
26d10 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
26d20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
26d30 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
26d40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
26d50 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
26d60 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26d70 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
26d80 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
26d90 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
26da0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
26db0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
26dc0 20 20 72 65 74 75 72 6e 20 61 63 63 65 73 73 50    return accessP
26dd0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
26de0 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67  set, amt, (unsig
26df0 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20  ned char*)pBuf, 
26e00 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  0);.}../*.** Rea
26e10 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  d part of the da
26e20 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
26e30 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
26e40 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
26e50 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
26e60 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
26e70 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
26e80 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
26e90 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
26ea0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
26eb0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
26ec0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
26ed0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
26ee0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
26ef0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
26f00 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
26f10 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
26f20 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
26f30 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
26f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
26f50 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  a(BtCursor *pCur
26f60 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
26f70 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
26f80 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23  f){.  int rc;..#
26f90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
26fa0 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66  IT_INCRBLOB.  if
26fb0 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d   ( pCur->eState=
26fc0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
26fd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
26fe0 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a  LITE_ABORT;.  }.
26ff0 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
27000 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
27010 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
27020 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
27030 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
27040 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
27050 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
27060 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27070 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
27080 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
27090 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
270a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
270b0 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20  ur->iPage] );.  
270c0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
270d0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
270e0 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
270f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
27100 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
27110 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
27120 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
27130 20 70 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   pBuf, 0);.  }. 
27140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
27150 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
27160 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
27170 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
27180 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
27190 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
271a0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
271b0 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
271c0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
271d0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
271e0 6b 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72  key if index btr
271f0 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ees (pPage->intK
27200 65 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68  ey==0) and is th
27210 65 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61  e data for.** ta
27220 62 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67  ble btrees (pPag
27230 65 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54  e->intKey==1). T
27240 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
27250 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a  es of available.
27260 2a 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77  ** key/data is w
27270 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d  ritten into *pAm
27280 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
27290 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a   then the value.
272a0 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c  ** returned will
272b0 20 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20   not be a valid 
272c0 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
272d0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
272e0 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
272f0 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
27300 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
27310 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
27320 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
27330 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
27340 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
27350 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
27360 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
27370 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
27380 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
27390 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
273a0 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
273b0 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
273c0 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
273d0 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
273e0 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
273f0 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
27400 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
27410 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
27420 73 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65  semble.** the ke
27430 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
27440 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
27450 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
27460 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
27470 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
27480 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
27490 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
274a0 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
274b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
274c0 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
274d0 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
274e0 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
274f0 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
27500 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
27510 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76  /.static const v
27520 6f 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61  oid *fetchPayloa
27530 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
27540 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
27550 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
27560 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
27570 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d  om */.  u32 *pAm
27580 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t            /* 
27590 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
275a0 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
275b0 74 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  tes here */.){. 
275c0 20 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65   u32 amt;.  asse
275d0 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
275e0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26  Cur->iPage>=0 &&
275f0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
27600 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61  ur->iPage]);.  a
27610 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
27620 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
27630 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  D );.  assert( s
27640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
27650 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
27660 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
27670 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
27680 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
27690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
276a0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
276b0 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
276c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
276d0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ->nCell );.  ass
276e0 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
276f0 6e 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73  nSize>0 );.  ass
27700 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27710 70 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61  pPayload>pCur->a
27720 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27730 65 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52  e]->aData || COR
27740 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
27750 65 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ert( pCur->info.
27760 70 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61  pPayload<pCur->a
27770 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27780 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43  e]->aDataEnd ||C
27790 4f 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d  ORRUPT_DB);.  am
277a0 74 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e  t = (int)(pCur->
277b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
277c0 67 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20  ge]->aDataEnd - 
277d0 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c  pCur->info.pPayl
277e0 6f 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72  oad);.  if( pCur
277f0 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d  ->info.nLocal<am
27800 74 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e  t ) amt = pCur->
27810 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a  info.nLocal;.  *
27820 70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65  pAmt = amt;.  re
27830 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72  turn (void*)pCur
27840 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b  ->info.pPayload;
27850 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
27860 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
27870 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
27880 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
27890 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
278a0 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
278b0 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
278c0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
278d0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
278e0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
278f0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
27900 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
27910 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
27920 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
27930 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
27940 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
27950 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
27960 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
27970 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
27980 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
27990 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
279a0 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
279b0 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
279c0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
279d0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
279e0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
279f0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
27a00 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
27a10 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
27a20 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
27a30 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
27a40 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
27a50 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
27a60 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
27a70 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
27a80 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
27a90 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
27aa0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
27ab0 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
27ac0 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a 70 41  r *pCur, u32 *pA
27ad0 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 65  mt){.  return fe
27ae0 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
27af0 20 70 41 6d 74 29 3b 0a 7d 0a 63 6f 6e 73 74 20   pAmt);.}.const 
27b00 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72  void *sqlite3Btr
27b10 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43 75  eeDataFetch(BtCu
27b20 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
27b30 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
27b40 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
27b50 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
27b60 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
27b70 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
27b80 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
27b90 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
27ba0 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
27bb0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
27bc0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
27bd0 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
27be0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
27bf0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
27c00 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
27c10 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
27c20 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
27c30 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
27c40 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
27c50 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
27c60 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
27c70 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
27c80 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
27c90 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
27ca0 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
27cb0 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
27cc0 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
27cd0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
27ce0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27cf0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
27d00 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
27d10 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
27d20 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
27d30 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
27d40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27d50 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27d60 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
27d70 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
27d80 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
27d90 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
27da0 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
27db0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
27dc0 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
27dd0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
27de0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
27df0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
27e00 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   }.  pCur->info.
27e10 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
27e20 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
27e30 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
27e40 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
27e50 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
27e60 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
27e70 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30  pCur->iPage] = 0
27e80 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e  ;.  return getAn
27e90 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
27ea0 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61  ewPgno, &pCur->a
27eb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27ec0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
27ed0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
27ee0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
27ef0 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53  Flags);.}..#if S
27f00 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
27f10 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
27f20 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
27f30 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
27f40 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
27f50 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
27f60 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
27f70 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
27f80 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
27f90 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
27fa0 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
27fb0 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
27fc0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
27fd0 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
27fe0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
27ff0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
28000 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
28010 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
28020 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
28030 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
28040 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
28050 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
28060 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
28070 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
28080 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
28090 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
280a0 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
280b0 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
280c0 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280e0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
280f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
28100 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
28110 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
28120 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
28130 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
28140 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
28150 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
28160 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
28170 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
28180 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28190 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
281a0 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
281b0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
281c0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
281d0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
281e0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
281f0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
28200 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
28210 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
28220 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
28230 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
28240 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
28250 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
28260 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
28270 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
28280 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
28290 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
282a0 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
282b0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
282c0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
282d0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
282e0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
282f0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
28300 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
28310 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
28320 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28330 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
28340 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
28350 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28360 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28370 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28380 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28390 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
283a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
283b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
283c0 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
283d0 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
283e0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
283f0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
28400 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28410 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
28420 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28430 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
28440 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
28450 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28460 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
28470 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28480 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
28490 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
284a0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
284b0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
284c0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
284d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
284e0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
284f0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
28500 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
28510 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  ]);.}../*.** Mov
28520 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
28530 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
28540 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
28550 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
28560 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
28570 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
28580 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
28590 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
285a0 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
285b0 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
285c0 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
285d0 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
285e0 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
285f0 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
28600 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
28610 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
28620 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
28630 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
28640 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
28650 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
28660 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
28670 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
28680 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
28690 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
286a0 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
286b0 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
286c0 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
286d0 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
286e0 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
286f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
28700 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28710 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
28720 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
28730 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
28740 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
28750 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
28760 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
28770 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
28780 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
28790 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
287a0 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
287b0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
287c0 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
287d0 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
287e0 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
287f0 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
28800 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
28810 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
28820 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
28830 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
28840 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
28850 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
28860 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
28870 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
28880 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
28890 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
288a0 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
288b0 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
288c0 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
288d0 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
288e0 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
288f0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
28900 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
28910 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
28920 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
28930 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
28940 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
28950 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28960 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
28970 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
28980 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
28990 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
289a0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
289b0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
289c0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
289d0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
289e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
289f0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
28a00 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
28a10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
28a20 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
28a30 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
28a40 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
28a50 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
28a60 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
28a70 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
28a80 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
28a90 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
28aa0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
28ab0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
28ac0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
28ad0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
28ae0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
28af0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
28b00 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
28b10 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
28b20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43  ){.    while( pC
28b30 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a 20 20 20  ur->iPage ){.   
28b40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
28b50 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28b60 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  age]!=0 );.     
28b70 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
28b80 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ull(pCur->apPage
28b90 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 5d 29  [pCur->iPage--])
28ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
28bb0 69 66 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  if( pCur->pgnoRo
28bc0 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 43 75  ot==0 ){.    pCu
28bd0 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
28be0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
28bf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
28c10 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
28c20 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20  ge==(-1) );.    
28c30 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
28c40 61 67 65 28 70 43 75 72 2d 3e 70 42 74 72 65 65  age(pCur->pBtree
28c50 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  ->pBt, pCur->pgn
28c60 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70  oRoot, &pCur->ap
28c70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20  Page[0],.       
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 30 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67   0, pCur->curPag
28ca0 65 72 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66  erFlags);.    if
28cb0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
28cc0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  ){.      pCur->e
28cd0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
28ce0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72 65  NVALID;.      re
28cf0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
28d00 20 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d     pCur->iPage =
28d10 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75   0;.    pCur->cu
28d20 72 49 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e  rIntKey = pCur->
28d30 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
28d40 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d  y;.  }.  pRoot =
28d50 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
28d60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
28d70 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
28d80 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a  gnoRoot );..  /*
28d90 20 49 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e   If pCur->pKeyIn
28da0 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  fo is not NULL, 
28db0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
28dc0 74 68 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73  that opened this
28dd0 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70   cursor.  ** exp
28de0 65 63 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74  ected to open it
28df0 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74   on an index b-t
28e00 72 65 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ree. Otherwise, 
28e10 69 66 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20  if pKeyInfo is. 
28e20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61   ** NULL, the ca
28e30 6c 6c 65 72 20 65 78 70 65 63 74 73 20 61 20 74  ller expects a t
28e40 61 62 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20  able b-tree. If 
28e50 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
28e60 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72  case,.  ** retur
28e70 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  n an SQLITE_CORR
28e80 55 50 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a  UPT error. .  **
28e90 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65  .  ** Earlier ve
28ea0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
28eb0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
28ec0 69 73 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f  is test could no
28ed0 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74  t fail.  ** if t
28ee0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73  he root page was
28ef0 20 61 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20   already loaded 
28f00 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
28f10 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69  on was called (i
28f20 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72  .e..  ** if pCur
28f30 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74  ->iPage>=0). But
28f40 20 74 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20   this is not so 
28f50 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
28f60 69 73 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20  is corrupted .  
28f70 2a 2a 20 69 6e 20 73 75 63 68 20 61 20 77 61 79  ** in such a way
28f80 20 74 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74   that page pRoot
28f90 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20   is linked into 
28fa0 61 20 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20  a second b-tree 
28fb0 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20  table .  ** (or 
28fc0 74 68 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20  the freelist).  
28fd0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f  */.  assert( pRo
28fe0 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c  ot->intKey==1 ||
28ff0 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d   pRoot->intKey==
29000 30 20 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  0 );.  if( pRoot
29010 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28  ->isInit==0 || (
29020 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
29030 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65  0)!=pRoot->intKe
29040 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
29050 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
29060 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72  KPT;.  }..  pCur
29070 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a  ->aiIdx[0] = 0;.
29080 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
29090 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
290a0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
290b0 43 46 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56  CF_AtLast|BTCF_V
290c0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
290d0 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20 69 66 28  lidOvfl);..  if(
290e0 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 20   pRoot->nCell>0 
290f0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
29100 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
29110 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ID;.  }else if( 
29120 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a  !pRoot->leaf ){.
29130 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65      Pgno subpage
29140 3b 0a 20 20 20 20 69 66 28 20 70 52 6f 6f 74 2d  ;.    if( pRoot-
29150 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65 74 75 72  >pgno!=1 ) retur
29160 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
29170 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75 62 70 61  _BKPT;.    subpa
29180 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ge = get4byte(&p
29190 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f  Root->aData[pRoo
291a0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
291b0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
291c0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
291d0 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
291e0 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
291f0 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  bpage);.  }else{
29200 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
29210 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
29220 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ID;.  }.  return
29230 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f   rc;.}../*.** Mo
29240 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
29250 77 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d  wn to the left-m
29260 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62  ost leaf entry b
29270 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e  eneath the.** en
29280 74 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20  try to which it 
29290 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
292a0 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  nting..**.** The
292b0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
292c0 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
292d0 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79  the smallest key
292e0 20 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20   - the first.** 
292f0 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  in ascending ord
29300 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
29310 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  t moveToLeftmost
29320 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29330 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29340 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29350 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
29360 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
29370 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
29380 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29390 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
293a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
293b0 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ID );.  while( r
293c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
293d0 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  !(pPage = pCur->
293e0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
293f0 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  ge])->leaf ){.  
29400 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29410 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
29420 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  e]<pPage->nCell 
29430 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
29440 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
29450 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69 49  pPage, pCur->aiI
29460 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  dx[pCur->iPage])
29470 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  );.    rc = move
29480 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67  ToChild(pCur, pg
29490 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
294a0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
294b0 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
294c0 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68 74  own to the right
294d0 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72 79  -most leaf entry
294e0 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20   beneath the.** 
294f0 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69 74  page to which it
29500 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f   is currently po
29510 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20  inting.  Notice 
29520 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a 2a  the difference.*
29530 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f  * between moveTo
29540 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d  Leftmost() and m
29550 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29  oveToRightmost()
29560 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  .  moveToLeftmos
29570 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65  t().** finds the
29580 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79   left-most entry
29590 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65 6e   beneath the *en
295a0 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f 76  try* whereas mov
295b0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a  eToRightmost().*
295c0 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67 68  * finds the righ
295d0 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e  t-most entry ben
295e0 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a 2e  eath the *page*.
295f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68 74  .**.** The right
29600 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20 74  -most entry is t
29610 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
29620 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74 68  largest key - th
29630 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e  e last.** key in
29640 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
29650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
29660 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29670 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
29680 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
29690 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
296a0 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
296b0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Page = 0;..  ass
296c0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
296d0 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
296e0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
296f0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
29700 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
29710 28 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72  ( !(pPage = pCur
29720 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
29730 50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a  Page])->leaf ){.
29740 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
29750 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
29760 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
29770 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
29780 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
29790 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43  age] = pPage->nC
297a0 65 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ell;.    rc = mo
297b0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
297c0 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  pgno);.    if( r
297d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
297e0 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
297f0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
29800 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
29810 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29820 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b  info.nSize==0 );
29830 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72  .  assert( (pCur
29840 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
29850 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20  F_ValidNKey)==0 
29860 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
29870 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  TE_OK;.}../* Mov
29880 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
29890 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
298a0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52  in the table.  R
298b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a  eturn SQLITE_OK.
298c0 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ** on success.  
298d0 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69  Set *pRes to 0 i
298e0 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74  f the cursor act
298f0 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ually points to 
29900 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20  something.** or 
29910 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69  set *pRes to 1 i
29920 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
29930 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
29940 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42  ite3BtreeFirst(B
29950 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
29960 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
29970 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
29980 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
29990 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
299a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
299b0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
299c0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
299d0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
299e0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
299f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29a00 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  K ){.    if( pCu
29a10 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
29a20 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
29a30 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29a40 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
29a50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29a60 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29a70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
29a80 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
29a90 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
29aa0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
29ab0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
29ac0 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
29ad0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
29ae0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
29af0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
29b00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29b10 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
29b20 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
29b30 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
29b40 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
29b50 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
29b60 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
29b70 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
29b80 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
29b90 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
29ba0 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
29bb0 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
29bc0 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
29bd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
29be0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
29bf0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
29c00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
29c10 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
29c20 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
29c30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29c40 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29c50 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
29c60 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
29c70 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
29c80 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 73 20   already points 
29c90 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
29ca0 79 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  y, this is a no-
29cb0 6f 70 2e 20 2a 2f 0a 20 20 69 66 28 20 43 55 52  op. */.  if( CUR
29cc0 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d  SOR_VALID==pCur-
29cd0 3e 65 53 74 61 74 65 20 26 26 20 28 70 43 75 72  >eState && (pCur
29ce0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
29cf0 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 29 7b 0a  F_AtLast)!=0 ){.
29d00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29d10 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  BUG.    /* This 
29d20 62 6c 6f 63 6b 20 73 65 72 76 65 73 20 74 6f 20  block serves to 
29d30 61 73 73 65 72 74 28 29 20 74 68 61 74 20 74 68  assert() that th
29d40 65 20 63 75 72 73 6f 72 20 72 65 61 6c 6c 79 20  e cursor really 
29d50 64 6f 65 73 20 70 6f 69 6e 74 20 0a 20 20 20 20  does point .    
29d60 2a 2a 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ** to the last e
29d70 6e 74 72 79 20 69 6e 20 74 68 65 20 62 2d 74 72  ntry in the b-tr
29d80 65 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ee. */.    int i
29d90 69 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  i;.    for(ii=0;
29da0 20 69 69 3c 70 43 75 72 2d 3e 69 50 61 67 65 3b   ii<pCur->iPage;
29db0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73   ii++){.      as
29dc0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
29dd0 78 5b 69 69 5d 3d 3d 70 43 75 72 2d 3e 61 70 50  x[ii]==pCur->apP
29de0 61 67 65 5b 69 69 5d 2d 3e 6e 43 65 6c 6c 20 29  age[ii]->nCell )
29df0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29e00 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
29e10 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d 70 43  pCur->iPage]==pC
29e20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29e30 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 2d 31  >iPage]->nCell-1
29e40 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
29e50 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29e60 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 20  r->iPage]->leaf 
29e70 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  );.#endif.    re
29e80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29e90 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65    }..  rc = move
29ea0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
29eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
29ec0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
29ed0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
29ee0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
29ef0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29f00 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20  >pgnoRoot==0 || 
29f10 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29f20 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
29f30 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  ==0 );.      *pR
29f40 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  es = 1;.    }els
29f50 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
29f60 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29f70 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29f80 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
29f90 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54        rc = moveT
29fa0 6f 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29  oRightmost(pCur)
29fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
29fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29fd0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
29fe0 61 67 73 20 7c 3d 20 42 54 43 46 5f 41 74 4c 61  ags |= BTCF_AtLa
29ff0 73 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  st;.      }else{
2a000 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63  .        pCur->c
2a010 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
2a020 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20 7d  _AtLast;.      }
2a030 0a 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  .   .    }.  }. 
2a040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2a050 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
2a060 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
2a070 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20  nts to an entry 
2a080 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a  near the key .**
2a090 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 49   specified by pI
2a0a0 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65 79 2e  dxKey or intKey.
2a0b0 20 20 20 52 65 74 75 72 6e 20 61 20 73 75 63 63     Return a succ
2a0c0 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
2a0d0 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
2a0e0 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20 70 61  s, the intKey pa
2a0f0 72 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e  rameter is used.
2a100 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20 6d 75    pIdxKey .** mu
2a110 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72  st be NULL.  For
2a120 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 70   index tables, p
2a130 49 64 78 4b 65 79 20 69 73 20 75 73 65 64 20 61  IdxKey is used a
2a140 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69 73 20  nd intKey.** is 
2a150 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  ignored..**.** I
2a160 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
2a170 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
2a180 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
2a190 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
2a1a0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
2a1b0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
2a1c0 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
2a1d0 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
2a1e0 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
2a1f0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
2a200 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
2a210 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
2a220 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
2a230 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 69   key..**.** An i
2a240 6e 74 65 67 65 72 20 69 73 20 77 72 69 74 74 65  nteger is writte
2a250 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77 68 69  n into *pRes whi
2a260 63 68 20 69 73 20 74 68 65 20 72 65 73 75 6c 74  ch is the result
2a270 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69 6e 67   of.** comparing
2a280 20 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68   the key with th
2a290 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68  e entry to which
2a2a0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 0a   the cursor is .
2a2b0 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 54 68  ** pointing.  Th
2a2c0 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65  e meaning of the
2a2d0 20 69 6e 74 65 67 65 72 20 77 72 69 74 74 65 6e   integer written
2a2e0 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73 20 69   into.** *pRes i
2a2f0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
2a300 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
2a310 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
2a320 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2a330 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
2a340 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
2a350 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
2a360 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
2a370 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65 20 74  xKey or if the t
2a380 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a  able is empty.**
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3a0 20 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72    and the cursor
2a3b0 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65   is therefore le
2a3c0 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68  ft point to noth
2a3d0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ing..**.**     *
2a3e0 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20  pRes==0     The 
2a3f0 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70  cursor is left p
2a400 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e  ointing at an en
2a410 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20  try that.**     
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 61               exa
2a430 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69 6e 74  ctly matches int
2a440 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a  Key/pIdxKey..**.
2a450 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
2a460 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
2a470 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2a480 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
2a490 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
2a4a0 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
2a4b0 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b  han intKey/pIdxK
2a4c0 65 79 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e  ey..**.** For in
2a4d0 64 65 78 20 74 61 62 6c 65 73 2c 20 74 68 65 20  dex tables, the 
2a4e0 70 49 64 78 4b 65 79 2d 3e 65 71 53 65 65 6e 20  pIdxKey->eqSeen 
2a4f0 66 69 65 6c 64 20 69 73 20 73 65 74 20 74 6f 20  field is set to 
2a500 31 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 65 78  1 if there.** ex
2a510 69 73 74 73 20 61 6e 20 65 6e 74 72 79 20 69 6e  ists an entry in
2a520 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74 20   the table that 
2a530 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20  exactly matches 
2a540 70 49 64 78 4b 65 79 2e 20 20 0a 2a 2f 0a 69 6e  pIdxKey.  .*/.in
2a550 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
2a560 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
2a570 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2a580 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2a590 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
2a5a0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
2a5b0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
2a5c0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
2a5d0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
2a5e0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
2a5f0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2a600 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
2a610 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
2a620 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
2a630 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
2a640 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
2a650 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
2a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a670 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
2a680 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
2a690 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 52 65 63  .  int rc;.  Rec
2a6a0 6f 72 64 43 6f 6d 70 61 72 65 20 78 52 65 63 6f  ordCompare xReco
2a6b0 72 64 43 6f 6d 70 61 72 65 3b 0a 0a 20 20 61 73  rdCompare;..  as
2a6c0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2a6d0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2a6e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a6f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a700 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2a710 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
2a720 65 72 74 28 20 70 52 65 73 20 29 3b 0a 20 20 61  ert( pRes );.  a
2a730 73 73 65 72 74 28 20 28 70 49 64 78 4b 65 79 3d  ssert( (pIdxKey=
2a740 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 70 4b 65 79  =0)==(pCur->pKey
2a750 49 6e 66 6f 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  Info==0) );..  /
2a760 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20  * If the cursor 
2a770 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69 74  is already posit
2a780 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f 69  ioned at the poi
2a790 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  nt we are trying
2a7a0 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f  .  ** to move to
2a7b0 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
2a7c0 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  rn without doing
2a7d0 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69   any work */.  i
2a7e0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2a7f0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26 26  =CURSOR_VALID &&
2a800 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a810 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
2a820 79 29 21 3d 30 0a 20 20 20 26 26 20 70 43 75 72  y)!=0.   && pCur
2a830 2d 3e 63 75 72 49 6e 74 4b 65 79 20 0a 20 20 29  ->curIntKey .  )
2a840 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
2a850 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65  info.nKey==intKe
2a860 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2a870 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2a880 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2a890 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75    }.    if( (pCu
2a8a0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2a8b0 43 46 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26  CF_AtLast)!=0 &&
2a8c0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
2a8d0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2a8e0 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2a8f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2a900 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  _OK;.    }.  }..
2a910 20 20 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b    if( pIdxKey ){
2a920 0a 20 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70  .    xRecordComp
2a930 61 72 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  are = sqlite3Vdb
2a940 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64  eFindCompare(pId
2a950 78 4b 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b  xKey);.    pIdxK
2a960 65 79 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  ey->errCode = 0;
2a970 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
2a980 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63  xKey->default_rc
2a990 3d 3d 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c  ==1 .         ||
2a9a0 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c   pIdxKey->defaul
2a9b0 74 5f 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20  t_rc==0 .       
2a9c0 20 20 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65    || pIdxKey->de
2a9d0 66 61 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20  fault_rc==-1.   
2a9e0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
2a9f0 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20   xRecordCompare 
2aa00 3d 20 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73  = 0; /* All keys
2aa10 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f   are integers */
2aa20 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76  .  }..  rc = mov
2aa30 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
2aa40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
2aa50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
2aa60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
2aa70 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
2aa80 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2aa90 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65  iPage] );.  asse
2aaa0 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  rt( pCur->pgnoRo
2aab0 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61  ot==0 || pCur->a
2aac0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2aad0 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  e]->isInit );.  
2aae0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2aaf0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
2ab00 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70  ALID || pCur->ap
2ab10 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2ab20 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  ]->nCell>0 );.  
2ab30 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
2ab40 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
2ab50 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
2ab60 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
2ab70 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d  pCur->pgnoRoot==
2ab80 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67  0 || pCur->apPag
2ab90 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
2aba0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
2abb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2abc0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2abd0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d  pCur->apPage[0]-
2abe0 3e 69 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63  >intKey==pCur->c
2abf0 75 72 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73  urIntKey );.  as
2ac00 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49  sert( pCur->curI
2ac10 6e 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79  ntKey || pIdxKey
2ac20 20 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20   );.  for(;;){. 
2ac30 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c     int lwr, upr,
2ac40 20 69 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e   idx, c;.    Pgn
2ac50 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65  o chldPg;.    Me
2ac60 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70  mPage *pPage = p
2ac70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ac80 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38  ->iPage];.    u8
2ac90 20 2a 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20   *pCell;        
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2acc0 63 75 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20  current cell in 
2acd0 70 50 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  pPage */..    /*
2ace0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75   pPage->nCell mu
2acf0 73 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  st be greater th
2ad00 61 6e 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73  an zero. If this
2ad10 20 69 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67   is the root-pag
2ad20 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  e.    ** the cur
2ad30 73 6f 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62  sor would have b
2ad40 65 65 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76  een INVALID abov
2ad50 65 20 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b  e and this for(;
2ad60 3b 29 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e  ;) loop.    ** n
2ad70 6f 74 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20  ot run. If this 
2ad80 69 73 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d  is not the root-
2ad90 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d  page, then the m
2ada0 6f 76 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75  oveToChild() rou
2adb0 74 69 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c  tine.    ** woul
2adc0 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 64  d have already d
2add0 65 74 65 63 74 65 64 20 64 62 20 63 6f 72 72 75  etected db corru
2ade0 70 74 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79  ption. Similarly
2adf0 2c 20 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20  , pPage must.   
2ae00 20 2a 2a 20 62 65 20 74 68 65 20 72 69 67 68 74   ** be the right
2ae10 20 6b 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20   kind (index or 
2ae20 74 61 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65  table) of b-tree
2ae30 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65   page. Otherwise
2ae40 0a 20 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f  .    ** a moveTo
2ae50 43 68 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54  Child() or moveT
2ae60 6f 52 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75  oRoot() call wou
2ae70 6c 64 20 68 61 76 65 20 64 65 74 65 63 74 65 64  ld have detected
2ae80 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f   corruption.  */
2ae90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2aea0 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20  ge->nCell>0 );. 
2aeb0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2aec0 2d 3e 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b  ->intKey==(pIdxK
2aed0 65 79 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77  ey==0) );.    lw
2aee0 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
2aef0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
2af00 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 69 61  .    assert( bia
2af10 73 52 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61  sRight==0 || bia
2af20 73 52 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20  sRight==1 );.   
2af30 20 69 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62   idx = upr>>(1-b
2af40 69 61 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64  iasRight); /* id
2af50 78 20 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20  x = biasRight ? 
2af60 75 70 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f  upr : (lwr+upr)/
2af70 32 3b 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e  2; */.    pCur->
2af80 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2af90 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20  e] = (u16)idx;. 
2afa0 20 20 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f     if( xRecordCo
2afb0 6d 70 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20  mpare==0 ){.    
2afc0 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2afd0 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b     i64 nCellKey;
2afe0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2aff0 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2b000 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
2b010 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
2b020 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20  >intKeyLeaf ){. 
2b030 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
2b040 30 78 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b  0x80 <= *(pCell+
2b050 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  +) ){.          
2b060 20 20 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61    if( pCell>=pPa
2b070 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72  ge->aDataEnd ) r
2b080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
2b090 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2b0a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b0b0 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72 69  .        getVari
2b0c0 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29  nt(pCell, (u64*)
2b0d0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20  &nCellKey);.    
2b0e0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79      if( nCellKey
2b0f0 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  <intKey ){.     
2b100 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31       lwr = idx+1
2b110 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b120 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d  lwr>upr ){ c = -
2b130 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2b140 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
2b150 65 6c 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b  ellKey>intKey ){
2b160 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
2b170 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20   idx-1;.        
2b180 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
2b190 20 63 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20   c = +1; break; 
2b1a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
2b1b0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2b1c0 74 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74  t( nCellKey==int
2b1d0 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Key );.         
2b1e0 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20   pCur->curFlags 
2b1f0 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  |= BTCF_ValidNKe
2b200 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
2b210 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
2b220 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2b230 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2b240 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2b250 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20  16)idx;.        
2b260 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2b270 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
2b280 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20    lwr = idx;.   
2b290 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2b2a0 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3b  veto_next_layer;
2b2b0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2b2c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
2b2d0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2b2e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2b2f0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  _OK;.           
2b300 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2b310 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2b320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b330 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2b340 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2b350 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2b360 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2b370 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2b380 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2b390 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b 3b 29 7b  {.      for(;;){
2b3a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 65  .        int nCe
2b3b0 6c 6c 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20  ll;  /* Size of 
2b3c0 74 68 65 20 70 43 65 6c 6c 20 63 65 6c 6c 20 69  the pCell cell i
2b3d0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 20  n bytes */.     
2b3e0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2b3f0 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2b400 2c 20 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20  , idx);..       
2b410 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
2b420 73 75 70 70 6f 72 74 65 64 20 70 61 67 65 2d 73  supported page-s
2b430 69 7a 65 20 69 73 20 36 35 35 33 36 20 62 79 74  ize is 65536 byt
2b440 65 73 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  es. This means t
2b450 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  hat.        ** t
2b460 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
2b470 72 20 6f 66 20 72 65 63 6f 72 64 20 62 79 74 65  r of record byte
2b480 73 20 73 74 6f 72 65 64 20 6f 6e 20 61 6e 20 69  s stored on an i
2b490 6e 64 65 78 20 42 2d 54 72 65 65 0a 20 20 20 20  ndex B-Tree.    
2b4a0 20 20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 6c      ** page is l
2b4b0 65 73 73 20 74 68 61 6e 20 31 36 33 38 34 20 62  ess than 16384 b
2b4c0 79 74 65 73 20 61 6e 64 20 6d 61 79 20 62 65 20  ytes and may be 
2b4d0 73 74 6f 72 65 64 20 61 73 20 61 20 32 2d 62 79  stored as a 2-by
2b4e0 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 76 61  te.        ** va
2b4f0 72 69 6e 74 2e 20 54 68 69 73 20 69 6e 66 6f 72  rint. This infor
2b500 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  mation is used t
2b510 6f 20 61 74 74 65 6d 70 74 20 74 6f 20 61 76 6f  o attempt to avo
2b520 69 64 20 70 61 72 73 69 6e 67 20 0a 20 20 20 20  id parsing .    
2b530 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
2b540 65 20 63 65 6c 6c 20 62 79 20 63 68 65 63 6b 69  e cell by checki
2b550 6e 67 20 66 6f 72 20 74 68 65 20 63 61 73 65 73  ng for the cases
2b560 20 77 68 65 72 65 20 74 68 65 20 72 65 63 6f 72   where the recor
2b570 64 20 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a  d is .        **
2b580 20 73 74 6f 72 65 64 20 65 6e 74 69 72 65 6c 79   stored entirely
2b590 20 77 69 74 68 69 6e 20 74 68 65 20 62 2d 74 72   within the b-tr
2b5a0 65 65 20 70 61 67 65 20 62 79 20 69 6e 73 70 65  ee page by inspe
2b5b0 63 74 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  cting the first 
2b5c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 32 20 62 79  .        ** 2 by
2b5d0 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  tes of the cell.
2b5e0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b5f0 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 43 65 6c      nCell = pCel
2b600 6c 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[0];.        if
2b610 28 20 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  ( nCell<=pPage->
2b620 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20  max1bytePayload 
2b630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2b640 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e 73  This branch runs
2b650 20 69 66 20 74 68 65 20 72 65 63 6f 72 64 2d 73   if the record-s
2b660 69 7a 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ize field of the
2b670 20 63 65 6c 6c 20 69 73 20 61 0a 20 20 20 20 20   cell is a.     
2b680 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62       ** single b
2b690 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74  yte varint and t
2b6a0 68 65 20 72 65 63 6f 72 64 20 66 69 74 73 20 65  he record fits e
2b6b0 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2b6c0 61 69 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ain.          **
2b6d0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2b6e0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2b6f0 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2b700 6c 2b 31 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+1==pPage->aDat
2b710 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2b720 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2b730 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2b740 64 2a 29 26 70 43 65 6c 6c 5b 31 5d 2c 20 70 49  d*)&pCell[1], pI
2b750 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2b760 7d 65 6c 73 65 20 69 66 28 20 21 28 70 43 65 6c  }else if( !(pCel
2b770 6c 5b 31 5d 20 26 20 30 78 38 30 29 20 0a 20 20  l[1] & 0x80) .  
2b780 20 20 20 20 20 20 20 20 26 26 20 28 6e 43 65 6c          && (nCel
2b790 6c 20 3d 20 28 28 6e 43 65 6c 6c 26 30 78 37 66  l = ((nCell&0x7f
2b7a0 29 3c 3c 37 29 20 2b 20 70 43 65 6c 6c 5b 31 5d  )<<7) + pCell[1]
2b7b0 29 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  )<=pPage->maxLoc
2b7c0 61 6c 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  al.        ){.  
2b7d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2b7e0 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64  ecord-size field
2b7f0 20 69 73 20 61 20 32 20 62 79 74 65 20 76 61 72   is a 2 byte var
2b800 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2b810 72 64 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  rd .          **
2b820 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f   fits entirely o
2b830 6e 20 74 68 65 20 6d 61 69 6e 20 62 2d 74 72 65  n the main b-tre
2b840 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2b850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b860 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 32 3d 3d 70  pCell+nCell+2==p
2b870 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2b880 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2b890 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2b8a0 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2b8b0 65 6c 6c 5b 32 5d 2c 20 70 49 64 78 4b 65 79 29  ell[2], pIdxKey)
2b8c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2b8d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
2b8e0 65 20 72 65 63 6f 72 64 20 66 6c 6f 77 73 20 6f  e record flows o
2b8f0 76 65 72 20 6f 6e 74 6f 20 6f 6e 65 20 6f 72 20  ver onto one or 
2b900 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  more overflow pa
2b910 67 65 73 2e 20 49 6e 0a 20 20 20 20 20 20 20 20  ges. In.        
2b920 20 20 2a 2a 20 74 68 69 73 20 63 61 73 65 20 74    ** this case t
2b930 68 65 20 77 68 6f 6c 65 20 63 65 6c 6c 20 6e 65  he whole cell ne
2b940 65 64 73 20 74 6f 20 62 65 20 70 61 72 73 65 64  eds to be parsed
2b950 2c 20 61 20 62 75 66 66 65 72 20 61 6c 6c 6f 63  , a buffer alloc
2b960 61 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a  ated.          *
2b970 2a 20 61 6e 64 20 61 63 63 65 73 73 50 61 79 6c  * and accessPayl
2b980 6f 61 64 28 29 20 75 73 65 64 20 74 6f 20 72 65  oad() used to re
2b990 74 72 69 65 76 65 20 74 68 65 20 72 65 63 6f 72  trieve the recor
2b9a0 64 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  d into the.     
2b9b0 20 20 20 20 20 2a 2a 20 62 75 66 66 65 72 20 62       ** buffer b
2b9c0 65 66 6f 72 65 20 56 64 62 65 52 65 63 6f 72 64  efore VdbeRecord
2b9d0 43 6f 6d 70 61 72 65 28 29 20 63 61 6e 20 62 65  Compare() can be
2b9e0 20 63 61 6c 6c 65 64 2e 20 0a 20 20 20 20 20 20   called. .      
2b9f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 20      **.         
2ba00 20 2a 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72   ** If the recor
2ba10 64 20 69 73 20 63 6f 72 72 75 70 74 2c 20 74 68  d is corrupt, th
2ba20 65 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  e xRecordCompare
2ba30 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 61   routine may rea
2ba40 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75  d.          ** u
2ba50 70 20 74 6f 20 74 77 6f 20 76 61 72 69 6e 74 73  p to two varints
2ba60 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
2ba70 20 74 68 65 20 62 75 66 66 65 72 2e 20 41 6e 20   the buffer. An 
2ba80 65 78 74 72 61 20 31 38 20 0a 20 20 20 20 20 20  extra 18 .      
2ba90 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66 20      ** bytes of 
2baa0 70 61 64 64 69 6e 67 20 69 73 20 61 6c 6c 6f 63  padding is alloc
2bab0 61 74 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ated at the end 
2bac0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 69 6e  of the buffer in
2bad0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
2bae0 73 65 20 74 68 69 73 20 68 61 70 70 65 6e 73 2e  se this happens.
2baf0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 76    */.          v
2bb00 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20  oid *pCellKey;. 
2bb10 20 20 20 20 20 20 20 20 20 75 38 20 2a 20 63 6f           u8 * co
2bb20 6e 73 74 20 70 43 65 6c 6c 42 6f 64 79 20 3d 20  nst pCellBody = 
2bb30 70 43 65 6c 6c 20 2d 20 70 50 61 67 65 2d 3e 63  pCell - pPage->c
2bb40 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
2bb50 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e 78 50         pPage->xP
2bb60 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
2bb70 70 43 65 6c 6c 42 6f 64 79 2c 20 26 70 43 75 72  pCellBody, &pCur
2bb80 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20  ->info);.       
2bb90 20 20 20 6e 43 65 6c 6c 20 3d 20 28 69 6e 74 29     nCell = (int)
2bba0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
2bbb0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2bbc0 61 73 65 28 20 6e 43 65 6c 6c 3c 30 20 29 3b 20  ase( nCell<0 ); 
2bbd0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6b 65 79    /* True if key
2bbe0 20 73 69 7a 65 20 69 73 20 32 5e 33 32 20 6f 72   size is 2^32 or
2bbf0 20 6d 6f 72 65 20 2a 2f 0a 20 20 20 20 20 20 20   more */.       
2bc00 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65     testcase( nCe
2bc10 6c 6c 3d 3d 30 20 29 3b 20 20 2f 2a 20 49 6e 76  ll==0 );  /* Inv
2bc20 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20  alid key size:  
2bc30 30 78 38 30 20 30 78 38 30 20 30 78 30 30 20 2a  0x80 0x80 0x00 *
2bc40 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2bc50 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 31 20 29  case( nCell==1 )
2bc60 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2bc70 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2bc80 38 30 20 30 78 30 31 20 2a 2f 0a 20 20 20 20 20  80 0x01 */.     
2bc90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2bca0 43 65 6c 6c 3d 3d 32 20 29 3b 20 20 2f 2a 20 4d  Cell==2 );  /* M
2bcb0 69 6e 69 6d 75 6d 20 6c 65 67 61 6c 20 69 6e 64  inimum legal ind
2bcc0 65 78 20 6b 65 79 20 73 69 7a 65 20 2a 2f 0a 20  ex key size */. 
2bcd0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65           if( nCe
2bce0 6c 6c 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ll<2 ){.        
2bcf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bd00 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2bd10 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2bd20 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2bd30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bd40 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20 73      pCellKey = s
2bd50 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e 43  qlite3Malloc( nC
2bd60 65 6c 6c 2b 31 38 20 29 3b 0a 20 20 20 20 20 20  ell+18 );.      
2bd70 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65 79      if( pCellKey
2bd80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2bd90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2bda0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
2bdb0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2bdc0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20  nish;.          
2bdd0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  }.          pCur
2bde0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2bdf0 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2be00 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2be10 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
2be20 75 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75  ur, 0, nCell, (u
2be30 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43  nsigned char*)pC
2be40 65 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20  ellKey, 2);.    
2be50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2be60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2be70 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
2be80 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
2be90 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2bea0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2beb0 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52            c = xR
2bec0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65  ecordCompare(nCe
2bed0 6c 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ll, pCellKey, pI
2bee0 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2bef0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2bf00 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2bf10 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2bf20 72 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20  rt( .           
2bf30 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2bf40 64 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  de!=SQLITE_CORRU
2bf50 50 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20  PT || c==0).    
2bf60 20 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79       && (pIdxKey
2bf70 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
2bf80 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d  E_NOMEM || pCur-
2bf90 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c  >pBtree->db->mal
2bfa0 6c 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20  locFailed).     
2bfb0 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
2bfc0 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
2bfd0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2bfe0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2bff0 28 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c>0 ){.       
2c000 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
2c010 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2c020 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2c030 20 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20   c==0 );.       
2c040 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2c050 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2c060 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
2c070 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
2c080 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31  ur->iPage] = (u1
2c090 36 29 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  6)idx;.         
2c0a0 20 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72   if( pIdxKey->er
2c0b0 72 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c  rCode ) rc = SQL
2c0c0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
2c0d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65         goto move
2c0e0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
2c0f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2c100 20 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b   lwr>upr ) break
2c110 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2c120 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a  ( lwr+upr>=0 );.
2c130 20 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c          idx = (l
2c140 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20  wr+upr)>>1;  /* 
2c150 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
2c160 32 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  2 */.      }.   
2c170 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
2c180 77 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50  wr==upr+1 || (pP
2c190 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21  age->intKey && !
2c1a0 70 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a  pPage->leaf) );.
2c1b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2c1c0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20  e->isInit );.   
2c1d0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2c1e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2c1f0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2c200 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d  ur->iPage]<pCur-
2c210 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2c220 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  age]->nCell );. 
2c230 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2c240 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c250 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c260 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
2c270 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c280 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
2c290 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
2c2a0 0a 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79  .moveto_next_lay
2c2b0 65 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e  er:.    if( lwr>
2c2c0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2c2d0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2c2e0 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
2c2f0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
2c300 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
2c310 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2c320 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
2c330 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2c340 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lwr));.    }.   
2c350 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c360 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36  r->iPage] = (u16
2c370 29 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d  )lwr;.    rc = m
2c380 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2c390 20 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66   chldPg);.    if
2c3a0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
2c3b0 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
2c3c0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
2c3d0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
2c3e0 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
2c3f0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
2c400 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20  CF_ValidOvfl);. 
2c410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2c420 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
2c430 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
2c440 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
2c450 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
2c460 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
2c470 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
2c480 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
2c490 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
2c4a0 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
2c4b0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
2c4c0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
2c4d0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
2c4e0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
2c4f0 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
2c500 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
2c510 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
2c520 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
2c530 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
2c540 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
2c550 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2c560 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
2c570 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
2c580 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
2c590 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
2c5a0 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
2c5b0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
2c5c0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
2c5d0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
2c5e0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
2c5f0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
2c600 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
2c610 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
2c620 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
2c630 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
2c640 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
2c650 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
2c660 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
2c670 20 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74   next entry in t
2c680 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
2c690 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74  .** successful t
2c6a0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e  hen set *pRes=0.
2c6b0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a    If the cursor.
2c6c0 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70  ** was already p
2c6d0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c  ointing to the l
2c6e0 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
2c6f0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2c700 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2c710 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2c720 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2c730 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2c740 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2c750 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e  ite3BtreeNext().
2c760 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69    That routine i
2c770 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66  s optimized.** f
2c780 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  or the common ca
2c790 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63  se of merely inc
2c7a0 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65  rementing the ce
2c7b0 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72  ll counter BtCur
2c7c0 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20  sor.aiIdx.** to 
2c7d0 74 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e  the next cell on
2c7e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2c7f0 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2c800 20 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c   btreeNext() hel
2c810 70 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69  per.** routine i
2c820 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74  s called when it
2c830 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
2c840 20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65   move to a diffe
2c850 72 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20  rent page or.** 
2c860 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
2c870 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ursor..**.** The
2c880 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
2c890 6e 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73  n will set *pRes
2c8a0 20 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65   to 0 or 1.  The
2c8b0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2c8c0 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20  alue.** will be 
2c8d0 31 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  1 if the cursor 
2c8e0 62 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f  being stepped co
2c8f0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
2c900 53 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a  SQL index and.**
2c910 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
2c920 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
2c930 20 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74   skipped if that
2c940 20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62   SQL index had b
2c950 65 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20  een.** a unique 
2c960 69 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73  index.  Otherwis
2c970 65 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  e the caller wil
2c980 6c 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73  l have set *pRes
2c990 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72   to zero..** Zer
2c9a0 6f 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o is the common 
2c9b0 63 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20  case. The btree 
2c9c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
2c9d0 73 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68  s free to use th
2c9e0 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52  e.** initial *pR
2c9f0 65 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69  es value as a hi
2ca00 6e 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65  nt to improve pe
2ca10 72 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74  rformance, but t
2ca20 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51  he current.** SQ
2ca30 4c 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65  Lite btree imple
2ca40 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e  mentation does n
2ca50 6f 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74  ot. (Note that t
2ca60 68 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a  he comdb2 btree.
2ca70 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
2ca80 6e 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20  n does use this 
2ca90 68 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a  hint, however.).
2caa0 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
2cab0 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74  _NOINLINE int bt
2cac0 72 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72  reeNext(BtCursor
2cad0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2cae0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2caf0 69 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61  int idx;.  MemPa
2cb00 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
2cb10 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
2cb20 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
2cb30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2cb40 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2cb50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2cb60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2cb70 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d   assert( *pRes==
2cb80 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  0 );.  if( pCur-
2cb90 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2cba0 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73  VALID ){.    ass
2cbb0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2cbc0 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
2cbd0 64 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20  dOvfl)==0 );.   
2cbe0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
2cbf0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
2cc00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2cc10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2cc20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2cc30 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f   }.    if( CURSO
2cc40 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
2cc50 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20  >eState ){.     
2cc60 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
2cc70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cc80 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
2cc90 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2cca0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ccb0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ccc0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2ccd0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2cce0 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b  RSOR_SKIPNEXT );
2ccf0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74  .      pCur->eSt
2cd00 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c  ate = CURSOR_VAL
2cd10 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43  ID;.      if( pC
2cd20 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29  ur->skipNext>0 )
2cd30 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  {.        pCur->
2cd40 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  skipNext = 0;.  
2cd50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2cd60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2cd70 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70        pCur->skip
2cd80 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Next = 0;.    }.
2cd90 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2cda0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2cdb0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20  ->iPage];.  idx 
2cdc0 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b  = ++pCur->aiIdx[
2cdd0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2cde0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2cdf0 73 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  sInit );..  /* I
2ce00 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2ce10 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20  ile is corrupt, 
2ce20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
2ce30 6f 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  or the value of 
2ce40 69 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20  idx .  ** to be 
2ce50 69 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68  invalid here. Th
2ce60 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75  is can only occu
2ce70 72 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75  r if a second cu
2ce80 72 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20  rsor modifies.  
2ce90 2a 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c  ** the page whil
2cea0 65 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73  e cursor pCur is
2ceb0 20 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72   holding a refer
2cec0 65 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63  ence to it. Whic
2ced0 68 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20  h can.  ** only 
2cee0 68 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61  happen if the da
2cef0 74 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70  tabase is corrup
2cf00 74 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  t in such a way 
2cf10 61 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20  as to link the. 
2cf20 20 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f   ** page into mo
2cf30 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72  re than one b-tr
2cf40 65 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ee structure. */
2cf50 0a 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78  .  testcase( idx
2cf60 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
2cf70 0a 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61  ..  if( idx>=pPa
2cf80 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
2cf90 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
2cfa0 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
2cfb0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
2cfc0 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
2cfd0 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
2cfe0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2cff0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2d000 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2d010 72 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66  return moveToLef
2d020 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2d030 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
2d040 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
2d050 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  ==0 ){.        *
2d060 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2d070 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2d080 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2d090 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2d0a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2d0b0 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50   }.      moveToP
2d0c0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
2d0d0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
2d0e0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d0f0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
2d100 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
2d110 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
2d120 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
2d130 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2d140 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
2d150 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  n sqlite3BtreeNe
2d160 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2d170 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d190 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
2d1a0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  f( pPage->leaf )
2d1b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d1c0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
2d1d0 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65  .    return move
2d1e0 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
2d1f0 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69  ;.  }.}.int sqli
2d200 74 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43  te3BtreeNext(BtC
2d210 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2d220 20 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61   *pRes){.  MemPa
2d230 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73  ge *pPage;.  ass
2d240 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2d250 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2d260 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
2d270 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2d280 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65  *pRes==0 || *pRe
2d290 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  s==1 );.  assert
2d2a0 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
2d2b0 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  ==0 || pCur->eSt
2d2c0 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate!=CURSOR_VALI
2d2d0 44 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  D );.  pCur->inf
2d2e0 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
2d2f0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2d300 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   ~(BTCF_ValidNKe
2d310 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2d320 29 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  );.  *pRes = 0;.
2d330 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2d340 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d350 20 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e   ) return btreeN
2d360 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2d370 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
2d380 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2d390 61 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70  age];.  if( (++p
2d3a0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d3b0 3e 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d  >iPage])>=pPage-
2d3c0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43  >nCell ){.    pC
2d3d0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d3e0 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65  iPage]--;.    re
2d3f0 74 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70  turn btreeNext(p
2d400 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a  Cur, pRes);.  }.
2d410 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
2d420 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  f ){.    return 
2d430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
2d440 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d  se{.    return m
2d450 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43  oveToLeftmost(pC
2d460 75 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ur);.  }.}../*.*
2d470 2a 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f  * Step the curso
2d480 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f  r to the back to
2d490 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e   the previous en
2d4a0 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
2d4b0 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
2d4c0 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
2d4d0 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
2d4e0 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
2d4f0 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
2d500 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
2d510 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2d520 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2d530 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2d540 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2d550 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2d560 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2d570 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2d580 65 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54  eePrevious().  T
2d590 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f  hat routine is o
2d5a0 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20  ptimized.** for 
2d5b0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
2d5c0 6f 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d  of merely decrem
2d5d0 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  enting the cell 
2d5e0 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72  counter BtCursor
2d5f0 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65  .aiIdx.** to the
2d600 20 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f   previous cell o
2d610 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
2d620 67 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72  ge.  The (slower
2d630 29 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  ) btreePrevious(
2d640 29 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74  ).** helper rout
2d650 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
2d660 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  en it is necessa
2d670 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20  ry to move to a 
2d680 64 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a  different page.*
2d690 2a 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20  * or to restore 
2d6a0 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  the cursor..**.*
2d6b0 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
2d6c0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20  nction will set 
2d6d0 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e  *pRes to 0 or 1.
2d6e0 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70    The initial *p
2d6f0 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c  Res value.** wil
2d700 6c 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75  l be 1 if the cu
2d710 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70  rsor being stepp
2d720 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ed corresponds t
2d730 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61  o an SQL index a
2d740 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f  nd.** if this ro
2d750 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65  utine could have
2d760 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66   been skipped if
2d770 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20   that SQL index 
2d780 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e  had been.** a un
2d790 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68  ique index.  Oth
2d7a0 65 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65  erwise the calle
2d7b0 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20  r will have set 
2d7c0 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a  *pRes to zero..*
2d7d0 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f  * Zero is the co
2d7e0 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62  mmon case. The b
2d7f0 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2d800 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75  ion is free to u
2d810 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61  se the.** initia
2d820 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73  l *pRes value as
2d830 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f   a hint to impro
2d840 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20  ve performance, 
2d850 62 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  but the current.
2d860 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20  ** SQLite btree 
2d870 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
2d880 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74  oes not. (Note t
2d890 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62  hat the comdb2 b
2d8a0 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e  tree.** implemen
2d8b0 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20  tation does use 
2d8c0 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76  this hint, howev
2d8d0 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53  er.).*/.static S
2d8e0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
2d8f0 6e 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  nt btreePrevious
2d900 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2d910 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2d920 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2d930 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
2d940 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2d950 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2d960 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2d970 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2d980 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73  pRes==0 );.  ass
2d990 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2d9a0 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2d9b0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2d9c0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
2d9d0 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
2d9e0 73 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74  s & (BTCF_AtLast
2d9f0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c  |BTCF_ValidOvfl|
2da00 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29  BTCF_ValidNKey))
2da10 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2da20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2da30 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43  e==0 );.  if( pC
2da40 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2da50 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
2da60 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2da70 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2da80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2da90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2daa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2dab0 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2dac0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2dad0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2dae0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2daf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2db00 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2db10 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2db20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2db30 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2db40 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2db50 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2db60 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2db70 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2db80 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2db90 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2dba0 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b  r->skipNext<0 ){
2dbb0 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2dbc0 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2dbd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2dbe0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2dbf0 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2dc00 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2dc10 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2dc20 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2dc30 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
2dc40 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
2dc50 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
2dc60 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e  ->leaf ){.    in
2dc70 74 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69  t idx = pCur->ai
2dc80 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2dc90 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54  ;.    rc = moveT
2dca0 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74  oChild(pCur, get
2dcb0 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
2dcc0 50 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20  Page, idx)));.  
2dcd0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
2dce0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d  n rc;.    rc = m
2dcf0 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70  oveToRightmost(p
2dd00 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2dd10 20 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e     while( pCur->
2dd20 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2dd30 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e]==0 ){.      i
2dd40 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
2dd50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
2dd60 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2dd70 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2dd80 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20      *pRes = 1;. 
2dd90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2dda0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
2ddb0 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72  .      moveToPar
2ddc0 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ent(pCur);.    }
2ddd0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2dde0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
2ddf0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2de00 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20  (pCur->curFlags 
2de10 26 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  & (BTCF_ValidNKe
2de20 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c  y|BTCF_ValidOvfl
2de30 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43  ))==0 );..    pC
2de40 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2de50 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50  iPage]--;.    pP
2de60 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2de70 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2de80 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2de90 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2dea0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
2deb0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2dec0 65 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20  ePrevious(pCur, 
2ded0 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2dee0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2def0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2df00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2df10 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2df20 65 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73  ePrevious(BtCurs
2df30 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
2df40 52 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Res){.  assert( 
2df50 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2df60 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2df70 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b  sert( pRes!=0 );
2df80 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73  .  assert( *pRes
2df90 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20  ==0 || *pRes==1 
2dfa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2dfb0 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c  r->skipNext==0 |
2dfc0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  | pCur->eState!=
2dfd0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
2dfe0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70    *pRes = 0;.  p
2dff0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2e000 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42   ~(BTCF_AtLast|B
2e010 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54  TCF_ValidOvfl|BT
2e020 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20  CF_ValidNKey);. 
2e030 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
2e040 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  e = 0;.  if( pCu
2e050 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2e060 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43  R_VALID.   || pC
2e070 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2e080 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20  iPage]==0.   || 
2e090 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2e0a0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d  r->iPage]->leaf=
2e0b0 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2e0c0 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73  rn btreePrevious
2e0d0 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20  (pCur, pRes);.  
2e0e0 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
2e0f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a  pCur->iPage]--;.
2e100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2e110 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
2e120 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
2e130 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e140 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
2e150 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
2e160 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
2e170 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
2e180 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
2e190 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
2e1a0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2e1b0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
2e1c0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
2e1d0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
2e1e0 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
2e1f0 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
2e200 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
2e210 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
2e220 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
2e230 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
2e240 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
2e250 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
2e260 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2e270 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
2e280 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
2e290 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
2e2a0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
2e2b0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
2e2c0 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76  o NULL in the ev
2e2d0 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e  ent of an error.
2e2e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e  .**.** If the "n
2e2f0 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72  earby" parameter
2e300 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20   is not 0, then 
2e310 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  an effort is mad
2e320 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
2e330 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
2e340 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2e350 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
2e360 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
2e370 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
2e380 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
2e390 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
2e3a0 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
2e3b0 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
2e3c0 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
2e3d0 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
2e3e0 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
2e3f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64  *.** If the eMod
2e400 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42  e parameter is B
2e410 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2e420 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65   the nearby page
2e430 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68   exists.** anywh
2e440 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2e450 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
2e460 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
2e470 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a  e returned.  If.
2e480 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  ** eMode is BTAL
2e490 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20  LOC_LT then the 
2e4a0 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69  page returned wi
2e4b0 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ll be less than 
2e4c0 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e  or equal.** to n
2e4d0 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63  earby if any suc
2e4e0 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20  h page exists.  
2e4f0 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c  If eMode is BTAL
2e500 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65  LOC_ANY then the
2e510 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73  re.** are no res
2e520 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69  trictions on whi
2e530 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72  ch page is retur
2e540 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
2e550 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
2e560 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
2e570 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f   *pBt,         /
2e580 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
2e590 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
2e5a0 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65  e,      /* Store
2e5b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2e5c0 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2e5d0 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70  ere */.  Pgno *p
2e5e0 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Pgno,           
2e5f0 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67  /* Store the pag
2e600 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f  e number here */
2e610 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20  .  Pgno nearby, 
2e620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61            /* Sea
2e630 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e  rch for a page n
2e640 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ear this one */.
2e650 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20    u8 eMode      
2e660 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c           /* BTAL
2e670 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c  LOC_EXACT, BTALL
2e680 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f  OC_LT, or BTALLO
2e690 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65  C_ANY */.){.  Me
2e6a0 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
2e6b0 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e   int rc;.  u32 n
2e6c0 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
2e6d0 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
2e6e0 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33  freelist */.  u3
2e6f0 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  2 k;     /* Numb
2e700 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
2e710 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
2e720 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
2e730 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
2e740 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
2e750 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20  PrevTrunk = 0;. 
2e760 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20   Pgno mxPage;   
2e770 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
2e780 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
2e790 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
2e7a0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2e7b0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
2e7c0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  ) );.  assert( e
2e7d0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e  Mode==BTALLOC_AN
2e7e0 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26  Y || (nearby>0 &
2e7f0 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42  & IfNotOmitAV(pB
2e800 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20  t->autoVacuum)) 
2e810 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42  );.  pPage1 = pB
2e820 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50  t->pPage1;.  mxP
2e830 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63  age = btreePagec
2e840 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20  ount(pBt);.  /* 
2e850 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2e860 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34  5119-02637 The 4
2e870 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2e880 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2e890 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65  et 36.  ** store
2e8a0 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74  s stores the tot
2e8b0 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
2e8c0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
2e8d0 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74  st. */.  n = get
2e8e0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
2e8f0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73  Data[36]);.  tes
2e900 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65  tcase( n==mxPage
2e910 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d  -1 );.  if( n>=m
2e920 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  xPage ){.    ret
2e930 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2e940 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
2e950 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a  f( n>0 ){.    /*
2e960 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73   There are pages
2e970 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2e980 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20  .  Reuse one of 
2e990 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a  those pages. */.
2e9a0 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b      Pgno iTrunk;
2e9b0 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69  .    u8 searchLi
2e9c0 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68  st = 0; /* If th
2e9d0 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74  e free-list must
2e9e0 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72   be searched for
2e9f0 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20   'nearby' */.   
2ea00 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30   u32 nSearch = 0
2ea10 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20  ;   /* Count of 
2ea20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  the number of se
2ea30 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f  arch attempts */
2ea40 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20  .    .    /* If 
2ea50 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2ea60 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79  XACT and a query
2ea70 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   of the pointer-
2ea80 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73  map.    ** shows
2ea90 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27   that the page '
2eaa0 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77  nearby' is somew
2eab0 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2eac0 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20  -list, then.    
2ead0 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69  ** the entire-li
2eae0 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63  st will be searc
2eaf0 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67  hed for that pag
2eb00 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65  e..    */.#ifnde
2eb10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2eb20 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
2eb30 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2eb40 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69  EXACT ){.      i
2eb50 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67  f( nearby<=mxPag
2eb60 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  e ){.        u8 
2eb70 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61  eType;.        a
2eb80 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20  ssert( nearby>0 
2eb90 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2eba0 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
2ebb0 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  um );.        rc
2ebc0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
2ebd0 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65  , nearby, &eType
2ebe0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
2ebf0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
2ec00 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54  ;.        if( eT
2ec10 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2ec20 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2ec30 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31    searchList = 1
2ec40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ec50 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2ec60 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2ec70 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61  _LE ){.      sea
2ec80 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20  rchList = 1;.   
2ec90 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2eca0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
2ecb0 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20  free-list count 
2ecc0 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b  by 1. Set iTrunk
2ecd0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
2ece0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73   the.    ** firs
2ecf0 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  t free-list trun
2ed00 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75  k page. iPrevTru
2ed10 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  nk is initially 
2ed20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  1..    */.    rc
2ed30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2ed40 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
2ed50 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
2ed60 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ed70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2ed80 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
2ed90 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68  n-1);..    /* Th
2eda0 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68  e code within th
2edb0 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f  is loop is run o
2edc0 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20  nly once if the 
2edd0 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72  'searchList' var
2ede0 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20  iable.    ** is 
2edf0 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77  not true. Otherw
2ee00 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63  ise, it runs onc
2ee10 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b  e for each trunk
2ee20 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20  -page on the.   
2ee30 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e   ** free-list un
2ee40 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65  til the page 'ne
2ee50 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64  arby' is located
2ee60 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43   (eMode==BTALLOC
2ee70 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f  _EXACT).    ** o
2ee80 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c  r until a page l
2ee90 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79  ess than 'nearby
2eea0 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d  ' is located (eM
2eeb0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29  ode==BTALLOC_LT)
2eec0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b  .    */.    do {
2eed0 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e  .      pPrevTrun
2eee0 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  k = pTrunk;.    
2eef0 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b    if( pPrevTrunk
2ef00 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
2ef10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31  VIDENCE-OF: R-01
2ef20 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69  506-11053 The fi
2ef30 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61  rst integer on a
2ef40 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20   freelist trunk 
2ef50 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
2ef60 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  is the page numb
2ef70 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66  er of the next f
2ef80 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2ef90 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f  ge in the list o
2efa0 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72  r.        ** zer
2efb0 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  o if this is the
2efc0 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74   last freelist t
2efd0 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20  runk page. */.  
2efe0 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67        iTrunk = g
2eff0 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72  et4byte(&pPrevTr
2f000 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  unk->aData[0]);.
2f010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f020 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
2f030 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37  -OF: R-59841-137
2f040 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  98 The 4-byte bi
2f050 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2f060 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20   at offset 32.  
2f070 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20        ** stores 
2f080 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
2f090 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
2f0a0 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  e of the freelis
2f0b0 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20  t, or zero if.  
2f0c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65        ** the fre
2f0d0 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20  elist is empty. 
2f0e0 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e  */.        iTrun
2f0f0 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  k = get4byte(&pP
2f100 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
2f110 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f120 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b  testcase( iTrunk
2f130 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20  ==mxPage );.    
2f140 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50    if( iTrunk>mxP
2f150 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b  age || nSearch++
2f160 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20   > n ){.        
2f170 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2f180 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2f190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
2f1a0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
2f1b0 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  edPage(pBt, iTru
2f1c0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
2f1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f1e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2f1f0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
2f200 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f210 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2f220 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
2f230 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a  t( pTrunk!=0 );.
2f240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
2f250 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29  runk->aData!=0 )
2f260 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  ;.      /* EVIDE
2f270 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d  NCE-OF: R-13523-
2f280 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64  04394 The second
2f290 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72   integer on a fr
2f2a0 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f2b0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68  e.      ** is th
2f2c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  e number of leaf
2f2d0 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74   page pointers t
2f2e0 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20  o follow. */.   
2f2f0 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28     k = get4byte(
2f300 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
2f310 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d  ]);.      if( k=
2f320 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73  =0 && !searchLis
2f330 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
2f340 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f  The trunk has no
2f350 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20   leaves and the 
2f360 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e  list is not bein
2f370 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20  g searched. .   
2f380 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61       ** So extra
2f390 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  ct the trunk pag
2f3a0 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65  e itself and use
2f3b0 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79   it as the newly
2f3c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c   .        ** all
2f3d0 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20  ocated page */. 
2f3e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2f3f0 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a  PrevTrunk==0 );.
2f400 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2f410 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f420 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
2f430 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
2f440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
2f450 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f460 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  age;.        }. 
2f470 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20         *pPgno = 
2f480 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  iTrunk;.        
2f490 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2f4a0 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2f4b0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f4c0 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2f4d0 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2f4e0 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a      pTrunk = 0;.
2f4f0 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2f500 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75  ALLOCATE: %d tru
2f510 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67  nk - %d free pag
2f520 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67  es left\n", *pPg
2f530 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20  no, n-1));.     
2f540 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33   }else if( k>(u3
2f550 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  2)(pBt->usableSi
2f560 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20  ze/4 - 2) ){.   
2f570 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66       /* Value of
2f580 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   k is out of ran
2f590 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f  ge.  Database co
2f5a0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
2f5b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2f5c0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
2f5d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f5e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69  llocate_page;.#i
2f5f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f600 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
2f610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61     }else if( sea
2f620 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
2f630 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d       && (nearby=
2f640 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75  =iTrunk || (iTru
2f650 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f  nk<nearby && eMo
2f660 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29  de==BTALLOC_LE))
2f670 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
2f680 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
2f690 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
2f6a0 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
2f6b0 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
2f6c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
2f6d0 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
2f6e0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
2f6f0 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
2f700 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2f710 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
2f720 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67  ;.        *ppPag
2f730 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20  e = pTrunk;.    
2f740 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
2f750 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
2f760 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2f770 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
2f780 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
2f790 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2f7a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2f7b0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2f7c0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
2f7d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2f7e0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
2f7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f800 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e  memcpy(&pPage1->
2f810 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75  aData[32], &pTru
2f820 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f830 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
2f840 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
2f850 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f860 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
2f870 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
2f880 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2f890 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f8a0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2f8b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
2f8c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2f8d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
2f8e0 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
2f8f0 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
2f900 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
2f910 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f920 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f930 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
2f940 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
2f950 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
2f960 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
2f970 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
2f980 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
2f990 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
2f9a0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
2f9b0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
2f9c0 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
2f9d0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
2f9e0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2f9f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
2fa00 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
2fa10 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
2fa20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
2fa30 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
2fa40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
2fa50 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20  NewTrunk>mxPage 
2fa60 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ){ .            
2fa70 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
2fa80 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
2fa90 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2faa0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2fab0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fac0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e      testcase( iN
2fad0 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20  ewTrunk==mxPage 
2fae0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2faf0 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  = btreeGetUnused
2fb00 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72  Page(pBt, iNewTr
2fb10 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c  unk, &pNewTrunk,
2fb20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
2fb30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fb40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2fb50 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fb60 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2fb70 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
2fb80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2fb90 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e  rite(pNewTrunk->
2fba0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2fbb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2fbc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2fbd0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fbe0 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20  (pNewTrunk);.   
2fbf0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fc00 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fc10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fc20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70         memcpy(&p
2fc30 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2fc40 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  0], &pTrunk->aDa
2fc50 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
2fc60 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2fc70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  NewTrunk->aData[
2fc80 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
2fc90 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2fca0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c  Trunk->aData[8],
2fcb0 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b   &pTrunk->aData[
2fcc0 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20  12], (k-1)*4);. 
2fcd0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
2fce0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
2fcf0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2fd00 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20  pPrevTrunk ){.  
2fd10 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2fd20 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2fd30 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31  writeable(pPage1
2fd40 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
2fd50 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
2fd60 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
2fd70 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  a[32], iNewTrunk
2fd80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2fd90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2fda0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fdb0 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2fdc0 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fdd0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
2fde0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2fdf0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
2fe00 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
2fe10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2fe20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72     put4byte(&pPr
2fe30 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2fe40 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ], iNewTrunk);. 
2fe50 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2fe60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72     }.        pTr
2fe70 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
2fe80 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
2fe90 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
2fea0 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
2feb0 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
2fec0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ));.#endif.     
2fed0 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29   }else if( k>0 )
2fee0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
2fef0 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
2ff00 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
2ff10 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73        u32 closes
2ff20 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
2ff30 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
2ff40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
2ff50 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
2ff60 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ata;.        if(
2ff70 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20   nearby>0 ){.   
2ff80 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20         u32 i;.  
2ff90 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
2ffa0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
2ffb0 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2ffc0 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20  C_LE ){.        
2ffd0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b      for(i=0; i<k
2ffe0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2fff0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
30000 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
30010 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  i*4]);.         
30020 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d       if( iPage<=
30030 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20  nearby ){.      
30040 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
30050 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
30060 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
30070 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30080 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30090 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
300a0 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73           int dis
300b0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  t;.            d
300c0 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73  ist = sqlite3Abs
300d0 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26  Int32(get4byte(&
300e0 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72  aData[8]) - near
300f0 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  by);.           
30100 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69   for(i=1; i<k; i
30110 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
30120 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
30130 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34  te3AbsInt32(get4
30140 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a  byte(&aData[8+i*
30150 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20  4]) - nearby);. 
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
30170 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20   d2<dist ){.    
30180 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73              clos
30190 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  est = i;.       
301a0 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
301b0 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
301c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
301d0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
301e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
301f0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30200 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20   0;.        }.. 
30210 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
30220 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30230 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20  +closest*4]);.  
30240 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
30250 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
30260 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61  .        if( iPa
30270 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  ge>mxPage ){.   
30280 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
30290 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
302a0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
302b0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
302c0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
302d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
302e0 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
302f0 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61          if( !sea
30300 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20  rchList .       
30310 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61    || (iPage==nea
30320 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65  rby || (iPage<ne
30330 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42  arby && eMode==B
30340 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20  TALLOC_LE)) .   
30350 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
30360 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b    int noContent;
30370 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e  .          *pPgn
30380 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20  o = iPage;.     
30390 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
303a0 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
303b0 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
303c0 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
303d0 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
303e0 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
303f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
30400 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
30410 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
30420 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
30430 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30440 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
30450 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
30460 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
30470 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61   rc ) goto end_a
30480 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
30490 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
304a0 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20  est<k-1 ){.     
304b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61         memcpy(&a
304c0 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34  Data[8+closest*4
304d0 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d  ], &aData[4+k*4]
304e0 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
304f0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34  }.          put4
30500 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20  byte(&aData[4], 
30510 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-1);.          
30520 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
30530 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
30540 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41  pBt, *pPgno)? PA
30550 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
30560 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20  T : 0;.         
30570 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
30580 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70  usedPage(pBt, *p
30590 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f  Pgno, ppPage, no
305a0 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20  Content);.      
305b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
305c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
305d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
305e0 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70  3PagerWrite((*pp
305f0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
30600 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
30610 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30620 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
30630 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
30640 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
30650 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
30660 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
30670 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30680 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
30690 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
306a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
306b0 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
306c0 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65  unk);.      pPre
306d0 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  vTrunk = 0;.    
306e0 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69  }while( searchLi
306f0 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st );.  }else{. 
30700 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
30710 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  no pages on the 
30720 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70  freelist, so app
30730 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74  end a new page t
30740 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  o the.    ** dat
30750 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20  abase image..   
30760 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61   **.    ** Norma
30770 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61  lly, new pages a
30780 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
30790 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65   block can be re
307a0 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65  quested from the
307b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61  .    ** pager la
307c0 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
307d0 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
307e0 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74  et. This prevent
307f0 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  s the pager.    
30800 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74  ** from trying t
30810 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73  o read the pages
30820 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69   content from di
30830 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20  sk. However, if 
30840 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65  the.    ** curre
30850 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  nt transaction h
30860 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f  as already run o
30870 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65  ne or more incre
30880 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20  mental-vacuum.  
30890 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e    ** steps, then
308a0 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65   the page we are
308b0 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61   about to alloca
308c0 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63  te may contain c
308d0 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68  ontent.    ** th
308e0 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69  at is required i
308f0 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
30900 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68   rollback. In th
30910 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20  is case, do.    
30920 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e  ** not set the n
30930 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20  o-content flag. 
30940 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20  This causes the 
30950 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e  pager to load an
30960 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  d journal.    **
30970 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
30980 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65  e content before
30990 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e   overwriting it.
309a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
309b0 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
309c0 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75  er will not actu
309d0 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20  ally attempt to 
309e0 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  load or journal 
309f0 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20  .    ** content 
30a00 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61  for any page tha
30a10 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69  t really does li
30a20 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
30a30 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
30a40 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69     ** file on di
30a50 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63  sk. So the effec
30a60 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20  ts of disabling 
30a70 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f  the no-content o
30a80 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20  ptimization.    
30a90 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66  ** here are conf
30aa0 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61  ined to those pa
30ab0 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74  ges that lie bet
30ac0 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20  ween the end of 
30ad0 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
30ae0 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68  ase image and th
30af0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
30b00 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
30b10 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f  */.    int bNoCo
30b20 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f  ntent = (0==IfNo
30b30 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
30b40 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45  Truncate))? PAGE
30b50 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a  R_GET_NOCONTENT:
30b60 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
30b70 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30b80 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
30b90 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
30ba0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30bb0 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a    pBt->nPage++;.
30bc0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61      if( pBt->nPa
30bd0 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ge==PENDING_BYTE
30be0 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74  _PAGE(pBt) ) pBt
30bf0 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e  ->nPage++;..#ifn
30c00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30c10 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
30c20 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
30c30 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50  um && PTRMAP_ISP
30c40 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50  AGE(pBt, pBt->nP
30c50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  age) ){.      /*
30c60 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
30c70 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
30c80 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
30c90 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
30ca0 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
30cb0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
30cc0 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
30cd0 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
30ce0 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
30cf0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
30d00 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
30d10 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
30d20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
30d30 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
30d40 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20     MemPage *pPg 
30d50 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
30d60 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
30d70 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
30d80 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61   (pointer-map pa
30d90 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61  ge)\n", pBt->nPa
30da0 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ge));.      asse
30db0 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  rt( pBt->nPage!=
30dc0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
30dd0 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
30de0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30df0 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74  sedPage(pBt, pBt
30e00 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62  ->nPage, &pPg, b
30e10 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20  NoContent);.    
30e20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
30e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
30e40 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30e50 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61  Write(pPg->pDbPa
30e60 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
30e70 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20  easePage(pPg);. 
30e80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30e90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
30ea0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67  .      pBt->nPag
30eb0 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
30ec0 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49  Bt->nPage==PENDI
30ed0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
30ee0 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b  ) ){ pBt->nPage+
30ef0 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  +; }.    }.#endi
30f00 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32  f.    put4byte(2
30f10 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50  8 + (u8*)pBt->pP
30f20 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74  age1->aData, pBt
30f30 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70  ->nPage);.    *p
30f40 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67  Pgno = pBt->nPag
30f50 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  e;..    assert( 
30f60 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
30f70 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
30f80 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
30f90 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42  GetUnusedPage(pB
30fa0 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67  t, *pPgno, ppPag
30fb0 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  e, bNoContent);.
30fc0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
30fd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  urn rc;.    rc =
30fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
30ff0 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44  te((*ppPage)->pD
31000 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
31010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
31020 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
31030 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20  ge(*ppPage);.   
31040 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
31050 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
31060 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
31070 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c  rom end of file\
31080 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20  n", *pPgno));.  
31090 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50  }..  assert( *pP
310a0 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
310b0 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a  E_PAGE(pBt) );..
310c0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
310d0 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  e:.  releasePage
310e0 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65  (pTrunk);.  rele
310f0 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
31100 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  nk);.  assert( r
31110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
31120 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
31130 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
31140 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20  e)->pDbPage)<=1 
31150 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
31160 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a  =SQLITE_OK || (*
31170 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
31180 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
31190 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
311a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
311b0 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50  d to add page iP
311c0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
311d0 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69  ase file free-li
311e0 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73  st. .** It is as
311f0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70  sumed that the p
31200 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
31210 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65  dy a part of the
31220 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a   free-list..**.*
31230 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73  * The value pass
31240 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
31250 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
31260 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70  s function is op
31270 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68  tional..** If th
31280 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73  e caller happens
31290 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74   to have a point
312a0 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
312b0 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72  e object .** cor
312c0 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61  responding to pa
312d0 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20  ge iPage handy, 
312e0 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61  it may pass it a
312f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c  s the second val
31300 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ue. .** Otherwis
31310 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e  e, it may pass N
31320 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ULL..**.** If a 
31330 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d  pointer to a Mem
31340 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70  Page object is p
31350 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
31360 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
31370 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
31380 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65  ount is not alte
31390 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
313a0 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
313b0 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74  int freePage2(Bt
313c0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d  Shared *pBt, Mem
313d0 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20  Page *pMemPage, 
313e0 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d  Pgno iPage){.  M
313f0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
31400 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
31410 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20     /* Free-list 
31420 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20  trunk page */.  
31430 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b  Pgno iTrunk = 0;
31440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31450 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
31460 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20  er of free-list 
31470 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20  trunk page */ . 
31480 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
31490 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20   = pBt->pPage1; 
314a0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65       /* Local re
314b0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
314c0 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  1 */.  MemPage *
314d0 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
314e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
314f0 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20  ge being freed. 
31500 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a  May be NULL. */.
31510 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31530 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
31540 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  Code */.  int nF
31550 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ree;            
31560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31570 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
31580 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65  of pages on free
31590 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  -list */..  asse
315a0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
315b0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
315c0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
315d0 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50  CORRUPT_DB || iP
315e0 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72  age>1 );.  asser
315f0 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20  t( !pMemPage || 
31600 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d  pMemPage->pgno==
31610 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20  iPage );..  if( 
31620 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e  iPage<2 ) return
31630 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
31640 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d  BKPT;.  if( pMem
31650 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67  Page ){.    pPag
31660 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20  e = pMemPage;.  
31670 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65    sqlite3PagerRe
31680 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  f(pPage->pDbPage
31690 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
316a0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
316b0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61  eLookup(pBt, iPa
316c0 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ge);.  }..  /* I
316d0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ncrement the fre
316e0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20  e page count on 
316f0 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d  pPage1 */.  rc =
31700 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
31710 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61  te(pPage1->pDbPa
31720 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
31730 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
31740 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74  t;.  nFree = get
31750 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31760 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74  Data[36]);.  put
31770 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31780 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b  Data[36], nFree+
31790 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e  1);..  if( pBt->
317a0 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
317b0 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a  ECURE_DELETE ){.
317c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65      /* If the se
317d0 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69  cure_delete opti
317e0 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  on is enabled, t
317f0 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79  hen.    ** alway
31800 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74  s fully overwrit
31810 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d  e deleted inform
31820 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73  ation with zeros
31830 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
31840 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63   (!pPage && ((rc
31850 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
31860 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
31870 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20  ge, 0))!=0) ).  
31880 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20     ||           
31890 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50   ((rc = sqlite3P
318a0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
318b0 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20  >pDbPage))!=0). 
318c0 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f     ){.      goto
318d0 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
318e0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
318f0 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c  pPage->aData, 0,
31900 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67   pPage->pBt->pag
31910 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  eSize);.  }..  /
31920 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
31930 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
31940 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
31950 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
31960 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
31970 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
31980 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
31990 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
319a0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
319b0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
319c0 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52  iPage, PTRMAP_FR
319d0 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b  EEPAGE, 0, &rc);
319e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
319f0 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
31a00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
31a10 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
31a20 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
31a30 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
31a40 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
31a50 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
31a60 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
31a70 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
31a80 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
31a90 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
31aa0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
31ab0 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
31ac0 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
31ad0 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
31ae0 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
31af0 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
31b00 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
31b10 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
31b20 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
31b30 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
31b40 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
31b50 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
31b60 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
31b70 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
31b80 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
31b90 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
31ba0 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
31bb0 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
31bc0 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20      u32 nLeaf;  
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31be0 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
31bf0 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
31c00 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
31c10 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
31c20 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
31c30 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
31c40 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
31c50 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70  (pBt, iTrunk, &p
31c60 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69  Trunk, 0);.    i
31c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31c80 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66   ){.      goto f
31c90 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  reepage_out;.   
31ca0 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20   }..    nLeaf = 
31cb0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
31cc0 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
31cd0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
31ce0 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20  ableSize>32 );. 
31cf0 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28     if( nLeaf > (
31d00 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53  u32)pBt->usableS
31d10 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20  ize/4 - 2 ){.   
31d20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31d30 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
31d40 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
31d50 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
31d60 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32  if( nLeaf < (u32
31d70 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  )pBt->usableSize
31d80 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20  /4 - 8 ){.      
31d90 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  /* In this case 
31da0 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e  there is room on
31db0 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   the trunk page 
31dc0 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61  to insert the pa
31dd0 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e  ge.      ** bein
31de0 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77  g freed as a new
31df0 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a   leaf..      **.
31e00 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68        ** Note th
31e10 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67  at the trunk pag
31e20 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e is not really 
31e30 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f  full until it co
31e40 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20  ntains.      ** 
31e50 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
31e60 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73   entries, not us
31e70 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
31e80 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76  ntries as we hav
31e90 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64  e.      ** coded
31ea0 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20  .  But due to a 
31eb0 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20  coding error in 
31ec0 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69  versions of SQLi
31ed0 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20  te prior to.    
31ee0 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61    ** 3.6.0, data
31ef0 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c  bases with freel
31f00 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20  ist trunk pages 
31f10 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61  holding more tha
31f20 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c  n.      ** usabl
31f30 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72  eSize/4 - 8 entr
31f40 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f  ies will be repo
31f50 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e  rted as corrupt.
31f60 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20    In order.     
31f70 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20   ** to maintain 
31f80 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
31f90 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64  ibility with old
31fa0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
31fb0 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20  QLite,.      ** 
31fc0 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65  we will continue
31fd0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
31fe0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
31ff0 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
32000 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
32010 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
32020 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
32030 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
32040 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
32050 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
32060 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
32070 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
32080 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
32090 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
320a0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
320b0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
320c0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
320d0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
320e0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
320f0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39  VIDENCE-OF: R-19
32100 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65  920-11576 Howeve
32110 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e  r, newer version
32120 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c  s of SQLite stil
32130 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64  l.      ** avoid
32140 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20   using the last 
32150 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74  six entries in t
32160 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  he freelist trun
32170 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a  k page array in.
32180 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74        ** order t
32190 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
321a0 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65  es created by ne
321b0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
321c0 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20  SQLite can be.  
321d0 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f      ** read by o
321e0 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
321f0 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a   SQLite..      *
32200 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
32210 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
32220 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
32230 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
32240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32250 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
32260 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
32270 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20  nLeaf+1);.      
32280 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
32290 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61  nk->aData[8+nLea
322a0 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  f*4], iPage);.  
322b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
322c0 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67  && (pBt->btsFlag
322d0 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
322e0 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
322f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
32300 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61  gerDontWrite(pPa
32310 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
32320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32330 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
32340 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
32350 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
32360 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
32370 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
32380 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
32390 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
323a0 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
323b0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
323c0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
323d0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
323e0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
323f0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
32400 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
32410 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
32420 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
32430 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
32440 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
32450 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
32460 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
32470 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
32480 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
32490 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
324a0 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
324b0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
324c0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
324d0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
324e0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
324f0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
32500 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
32510 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
32520 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
32530 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
32540 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53  f( pPage==0 && S
32550 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
32560 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
32570 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  , iPage, &pPage,
32580 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f   0)) ){.    goto
32590 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
325a0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
325b0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
325c0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  e->pDbPage);.  i
325d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
325e0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65   ){.    goto fre
325f0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
32600 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
32610 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b  >aData, iTrunk);
32620 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
32630 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29  ge->aData[4], 0)
32640 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
32650 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
32660 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45   iPage);.  TRACE
32670 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
32680 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20   new trunk page 
32690 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c  replacing %d\n",
326a0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54   pPage->pgno, iT
326b0 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67  runk));..freepag
326c0 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61  e_out:.  if( pPa
326d0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d  ge ){.    pPage-
326e0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d  >isInit = 0;.  }
326f0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
32700 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65  Page);.  release
32710 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
32720 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61  return rc;.}.sta
32730 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67  tic void freePag
32740 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
32750 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69  , int *pRC){.  i
32760 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54  f( (*pRC)==SQLIT
32770 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43  E_OK ){.    *pRC
32780 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61   = freePage2(pPa
32790 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20  ge->pBt, pPage, 
327a0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
327b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
327c0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
327d0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
327e0 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c  th the given Cel
327f0 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  l.  Write the.**
32800 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65   local Cell size
32810 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20   (the number of 
32820 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69  bytes on the ori
32830 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74  ginal page, omit
32840 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77  ting.** overflow
32850 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a  ) into *pnSize..
32860 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
32870 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61  earCell(.  MemPa
32880 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20  ge *pPage,      
32890 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
328a0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
328b0 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e Cell */.  unsi
328c0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
328d0 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  ,    /* First by
328e0 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a  te of the Cell *
328f0 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20  /.  u16 *pnSize 
32900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32910 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f  Write the size o
32920 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20  f the Cell here 
32930 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
32940 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
32950 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
32960 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
32970 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
32980 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75    int nOvfl;.  u
32990 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  32 ovflPageSize;
329a0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
329b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
329c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
329d0 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50  ) );.  pPage->xP
329e0 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
329f0 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
32a00 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e   *pnSize = info.
32a10 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66  nSize;.  if( inf
32a20 6f 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66 6f 2e 6e  o.nLocal==info.n
32a30 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72  Payload ){.    r
32a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
32a50 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77    /* No overflow
32a60 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77   pages. Return w
32a70 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79  ithout doing any
32a80 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
32a90 66 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53  f( pCell+info.nS
32aa0 69 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61  ize-1 > pPage->a
32ab0 44 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b  Data+pPage->mask
32ac0 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
32ad0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
32ae0 54 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c  T_BKPT;  /* Cell
32af0 20 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e   extends past en
32b00 64 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d  d of page */.  }
32b10 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65  .  ovflPgno = ge
32b20 74 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 69  t4byte(pCell + i
32b30 6e 66 6f 2e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a  nfo.nSize - 4);.
32b40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
32b50 73 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b  sableSize > 4 );
32b60 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20  .  ovflPageSize 
32b70 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
32b80 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d  e - 4;.  nOvfl =
32b90 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
32ba0 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20  - info.nLocal + 
32bb0 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31  ovflPageSize - 1
32bc0 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  )/ovflPageSize;.
32bd0 20 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e    assert( nOvfl>
32be0 30 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55  0 || .    (CORRU
32bf0 50 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e  PT_DB && (info.n
32c00 50 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61  Payload + ovflPa
32c10 67 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65  geSize)<ovflPage
32c20 53 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69  Size).  );.  whi
32c30 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
32c40 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
32c50 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
32c60 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
32c70 66 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c  f( ovflPgno<2 ||
32c80 20 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50   ovflPgno>btreeP
32c90 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
32ca0 0a 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e  .      /* 0 is n
32cb0 6f 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20  ot a legal page 
32cc0 6e 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20  number and page 
32cd0 31 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a  1 cannot be an .
32ce0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
32cf0 77 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72  w page. Therefor
32d00 65 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20  e if ovflPgno<2 
32d10 6f 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  or past the end 
32d20 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
32d30 20 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61   file the databa
32d40 73 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  se must be corru
32d50 70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  pt. */.      ret
32d60 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
32d70 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
32d80 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a     if( nOvfl ){.
32d90 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76        rc = getOv
32da0 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
32db0 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
32dc0 2c 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20  , &iNext);.     
32dd0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
32de0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
32df0 69 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28  if( ( pOvfl || (
32e00 28 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61  (pOvfl = btreePa
32e10 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76  geLookup(pBt, ov
32e20 66 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20  flPgno))!=0) ). 
32e30 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61      && sqlite3Pa
32e40 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
32e50 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21  pOvfl->pDbPage)!
32e60 3d 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =1.    ){.      
32e70 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72  /* There is no r
32e80 65 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72  eason any cursor
32e90 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20   should have an 
32ea0 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
32eb0 72 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20  rence .      ** 
32ec0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
32ed0 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
32ee0 20 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20   a cell that is 
32ef0 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70  being deleted/up
32f00 64 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  dated..      ** 
32f10 53 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73  So if there exis
32f20 74 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  ts more than one
32f30 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
32f40 69 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74  is page, then it
32f50 20 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20   .      ** must 
32f60 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e  not really be an
32f70 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61   overflow page a
32f80 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
32f90 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e  must be corrupt.
32fa0 20 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73   .      ** It is
32fb0 20 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65   helpful to dete
32fc0 63 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63  ct this before c
32fd0 61 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32  alling freePage2
32fe0 28 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a  (), as .      **
32ff0 20 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79   freePage2() may
33000 20 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63   zero the page c
33010 6f 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72  ontents if secur
33020 65 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73  e-delete mode is
33030 0a 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65  .      ** enable
33040 64 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72  d. If this 'over
33050 66 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65  flow' page happe
33060 6e 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20  ns to be a page 
33070 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
33080 2a 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72  * caller is iter
33090 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72  ating through or
330a0 20 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f   using in some o
330b0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20  ther way, this. 
330c0 20 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70       ** can be p
330d0 72 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20  roblematic..    
330e0 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
330f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33100 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
33110 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
33120 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c  age2(pBt, pOvfl,
33130 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20   ovflPgno);.    
33140 7d 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c  }..    if( pOvfl
33150 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
33160 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66  3PagerUnref(pOvf
33170 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  l->pDbPage);.   
33180 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20   }.    if( rc ) 
33190 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f  return rc;.    o
331a0 76 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b  vflPgno = iNext;
331b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
331c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
331d0 2a 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74  * Create the byt
331e0 65 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20  e sequence used 
331f0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63  to represent a c
33200 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67  ell on page pPag
33210 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74  e.** and write t
33220 68 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63  hat byte sequenc
33230 65 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20  e into pCell[]. 
33240 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   Overflow pages 
33250 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
33260 20 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61   and filled in a
33270 73 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68  s necessary.  Th
33280 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64  e calling proced
33290 75 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e  ure.** is respon
332a0 73 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67  sible for making
332b0 20 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74   sure sufficient
332c0 20 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20   space has been 
332d0 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72  allocated.** for
332e0 20 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20   pCell[]..**.** 
332f0 4e 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20  Note that pCell 
33300 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  does not necessa
33310 72 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74  ry need to point
33320 20 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61   to the pPage->a
33330 44 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70  Data.** area.  p
33340 43 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74  Cell might point
33350 20 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61   to some tempora
33360 72 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65  ry storage.  The
33370 20 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65   cell will.** be
33380 20 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20   constructed in 
33390 74 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61  this temporary a
333a0 72 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20  rea then copied 
333b0 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
333c0 61 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73  a.** later..*/.s
333d0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
333e0 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20  Cell(.  MemPage 
333f0 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  *pPage,         
33400 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
33410 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
33420 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
33430 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
33440 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ell,          /*
33450 20 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f   Complete text o
33460 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  f the cell */.  
33470 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
33480 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f  , i64 nKey,    /
33490 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63  * The key */.  c
334a0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
334b0 2c 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a  ,int nData,   /*
334c0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69   The data */.  i
334d0 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20  nt nZero,       
334e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
334f0 20 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65   Extra zero byte
33500 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70  s to append to p
33510 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  Data */.  int *p
33520 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  nSize           
33530 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
33540 65 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65  e cell size here
33550 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61   */.){.  int nPa
33560 79 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75  yload;.  const u
33570 38 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e  8 *pSrc;.  int n
33580 53 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e  Src, n, rc;.  in
33590 74 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d  t spaceLeft;.  M
335a0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
335b0 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  0;.  MemPage *pT
335c0 6f 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20  oRelease = 0;.  
335d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
335e0 50 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65  Prior;.  unsigne
335f0 64 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64  d char *pPayload
33600 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
33610 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
33620 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
33630 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64  = 0;.  int nHead
33640 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
33650 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
33660 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
33670 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50  tex) );..  /* pP
33680 61 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  age is not neces
33690 73 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65  sarily writeable
336a0 20 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67   since pCell mig
336b0 68 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a  ht be auxiliary.
336c0 20 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63    ** buffer spac
336d0 65 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61  e that is separa
336e0 74 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67  te from the pPag
336f0 65 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f  e buffer area */
33700 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c  .  assert( pCell
33710 3c 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c  <pPage->aData ||
33720 20 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e   pCell>=&pPage->
33730 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
33740 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
33750 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
33760 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
33770 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
33780 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
33790 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48   header. */.  nH
337a0 65 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63  eader = pPage->c
337b0 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
337c0 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20  Payload = nData 
337d0 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70  + nZero;.  if( p
337e0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
337f0 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
33800 2b 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26  += putVarint32(&
33810 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33820 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
33830 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
33840 6e 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20  nData==0 );.    
33850 61 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30  assert( nZero==0
33860 20 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65   );.  }.  nHeade
33870 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
33880 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33890 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20  *(u64*)&nKey);. 
338a0 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74   .  /* Fill in t
338b0 68 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20  he payload size 
338c0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
338d0 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53  intKey ){.    pS
338e0 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  rc = pData;.    
338f0 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20  nSrc = nData;.  
33900 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d    nData = 0;.  }
33910 65 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72  else{ .    asser
33920 74 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66  t( nKey<=0x7ffff
33930 66 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20 29  fff && pKey!=0 )
33940 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  ;.    nPayload =
33950 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20   (int)nKey;.    
33960 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20  pSrc = pKey;.   
33970 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65   nSrc = (int)nKe
33980 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  y;.  }.  if( nPa
33990 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61  yload<=pPage->ma
339a0 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20  xLocal ){.    n 
339b0 3d 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79  = nHeader + nPay
339c0 6c 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61  load;.    testca
339d0 73 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20  se( n==3 );.    
339e0 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29  testcase( n==4 )
339f0 3b 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20  ;.    if( n<4 ) 
33a00 6e 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69  n = 4;.    *pnSi
33a10 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63  ze = n;.    spac
33a20 65 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64  eLeft = nPayload
33a30 3b 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70  ;.    pPrior = p
33a40 43 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cell;.  }else{. 
33a50 20 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67     int mn = pPag
33a60 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20  e->minLocal;.   
33a70 20 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c   n = mn + (nPayl
33a80 6f 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61  oad - mn) % (pPa
33a90 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
33aa0 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
33ab0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
33ac0 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20  ->maxLocal );.  
33ad0 20 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70    testcase( n==p
33ae0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31  Page->maxLocal+1
33af0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20   );.    if( n > 
33b00 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
33b10 29 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70  ) n = mn;.    sp
33b20 61 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20  aceLeft = n;.   
33b30 20 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e   *pnSize = n + n
33b40 48 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20  Header + 4;.    
33b50 70 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b  pPrior = &pCell[
33b60 6e 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a  nHeader+n];.  }.
33b70 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43    pPayload = &pC
33b80 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20  ell[nHeader];.. 
33b90 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
33ba0 74 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75  t variables shou
33bb0 6c 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c  ld be set as fol
33bc0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
33bd0 20 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20    nPayload      
33be0 20 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f       Total paylo
33bf0 61 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ad size in bytes
33c00 0a 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64  .  **   pPayload
33c10 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
33c20 20 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64   writing payload
33c30 20 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61   here.  **   spa
33c40 63 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20  ceLeft          
33c50 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  Space available 
33c60 61 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66  at pPayload.  If
33c70 20 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c   nPayload>spaceL
33c80 65 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20  eft,.  **       
33c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
33ca0 68 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e  hat means conten
33cb0 74 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74  t must spill int
33cc0 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
33cd0 2e 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65  ..  **   *pnSize
33ce0 20 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65              Size
33cf0 20 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65   of the local ce
33d00 6c 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  ll (not counting
33d10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29   overflow pages)
33d20 0a 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20  .  **   pPrior  
33d30 20 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65             Where
33d40 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67   to write the pg
33d50 6e 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  no of the first 
33d60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20  overflow page.  
33d70 2a 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61  **.  ** Use a ca
33d80 6c 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65  ll to btreeParse
33d90 43 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72  CellPtr() to ver
33da0 69 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c  ify that the val
33db0 75 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  ues above.  ** w
33dc0 65 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72  ere computed cor
33dd0 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66  rectly..  */.#if
33de0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
33df0 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69  {.    CellInfo i
33e00 6e 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  nfo;.    pPage->
33e10 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65  xParseCell(pPage
33e20 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
33e30 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65  .    assert( nHe
33e40 61 64 65 72 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  ader=(int)(info.
33e50 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
33e60 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
33e70 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
33e80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
33e90 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
33ea0 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
33eb0 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
33ec0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
33ed0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
33ee0 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
33ef0 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
33f00 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
33f10 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
33f20 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
33f30 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
33f40 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
33f50 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
33f60 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33f70 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
33f80 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
33f90 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
33fa0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
33fb0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
33fc0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
33fd0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
33fe0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
33ff0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
34000 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
34010 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
34020 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
34030 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
34040 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
34050 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
34060 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
34070 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
34080 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
34090 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
340a0 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
340b0 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
340c0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
340d0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
340e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
340f0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
34100 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
34110 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
34120 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
34130 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
34140 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
34150 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
34160 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
34170 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
34180 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
34190 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
341a0 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
341b0 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
341c0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
341d0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
341e0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
341f0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
34200 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
34210 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
34220 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
34230 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
34240 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
34250 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
34260 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
34270 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
34280 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
34290 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
342a0 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
342b0 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
342c0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
342d0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
342e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
342f0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34300 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
34310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34320 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
34330 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
34340 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
34350 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
34360 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
34370 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
34380 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
34390 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
343a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
343b0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
343c0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
343d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
343e0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
343f0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
34400 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
34410 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
34420 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
34430 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
34440 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
34450 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
34460 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
34470 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
34480 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
34490 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
344a0 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
344b0 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
344c0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
344d0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
344e0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
344f0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
34500 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
34510 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
34520 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
34530 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
34540 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
34550 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
34560 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
34570 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
34580 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
34590 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
345a0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
345b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
345c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
345d0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
345e0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
345f0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
34600 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
34610 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
34620 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
34630 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
34640 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
34650 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
34660 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
34670 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34680 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
34690 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
346a0 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
346b0 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
346c0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
346d0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
346e0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
346f0 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
34700 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
34710 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
34720 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
34730 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
34740 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
34750 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
34760 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
34770 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
34780 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
34790 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
347a0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
347b0 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
347c0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
347d0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
347e0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
347f0 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
34800 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
34810 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
34820 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
34830 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
34840 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
34850 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
34860 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
34870 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
34880 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
34890 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
348a0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
348b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
348c0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
348d0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
348e0 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
348f0 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
34900 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
34910 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
34920 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
34930 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
34940 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34950 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
34960 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
34970 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
34980 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
34990 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
349a0 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
349b0 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
349c0 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
349d0 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
349e0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
349f0 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
34a00 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
34a10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
34a20 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
34a30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34a40 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
34a50 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
34a60 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
34a70 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
34a80 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
34a90 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
34aa0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
34ab0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
34ac0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
34ad0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
34ae0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
34af0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
34b00 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34b10 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
34b20 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
34b30 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
34b40 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
34b50 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
34b60 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
34b70 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
34b80 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
34b90 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
34ba0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
34bb0 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
34bc0 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
34bd0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
34be0 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
34bf0 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
34c00 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
34c10 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
34c20 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
34c30 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
34c40 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
34c50 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
34c60 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
34c70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
34c80 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
34c90 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
34ca0 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
34cb0 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
34cc0 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
34cd0 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
34ce0 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
34cf0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
34d00 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
34d10 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
34d20 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
34d30 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
34d40 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
34d50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
34d60 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34d70 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
34d80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
34d90 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
34da0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
34db0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
34dc0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
34dd0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
34de0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
34df0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
34e00 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
34e10 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
34e20 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
34e30 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
34e40 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
34e50 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
34e60 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
34e70 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
34e80 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
34e90 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
34ea0 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
34eb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34ec0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
34ed0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
34ee0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
34ef0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
34f00 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
34f10 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
34f20 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
34f30 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
34f40 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
34f50 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
34f60 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
34f70 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
34f80 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
34f90 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
34fa0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
34fb0 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
34fc0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
34fd0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
34fe0 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
34ff0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
35000 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
35010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35020 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
35030 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
35040 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
35050 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
35060 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
35070 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
35080 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
35090 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
350a0 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
350b0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
350c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
350d0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
350e0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
350f0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
35100 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
35110 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
35120 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
35130 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
35140 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
35150 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
35160 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
35170 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
35180 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
35190 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
351a0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
351b0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
351c0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
351d0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
351e0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
351f0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
35200 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
35210 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
35220 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35230 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
35240 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
35250 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
35260 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
35270 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
35280 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
35290 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
352a0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
352b0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
352c0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
352d0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
352e0 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
352f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
35300 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
35310 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
35320 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
35330 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
35340 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
35350 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
35360 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
35370 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
35380 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
35390 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
353a0 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
353b0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
353c0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
353d0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
353e0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
353f0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
35400 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
35410 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
35420 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
35430 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
35440 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
35450 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
35460 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
35470 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
35480 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
35490 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
354a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
354b0 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
354c0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
354d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
354e0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
354f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
35500 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
35510 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
35520 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
35530 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
35540 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49  page */.  u8 *pI
35550 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ns;         /* T
35560 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67  he point in pPag
35570 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68  e->aCellIdx[] wh
35580 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65  ere no cell inse
35590 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  rted */..  if( *
355a0 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
355b0 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
355c0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
355d0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
355e0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
355f0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
35600 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
35610 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
35620 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
35630 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
35640 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
35650 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
35660 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
35670 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
35680 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
35690 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
356a0 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
356b0 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
356c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
356d0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
356e0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
356f0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
35700 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
35710 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
35720 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
35730 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
35740 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
35750 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
35760 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
35770 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
35780 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
35790 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
357a0 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
357b0 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
357c0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
357d0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
357e0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
357f0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
35800 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
35810 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
35820 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
35830 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
35840 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
35850 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
35860 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
35870 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
35880 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
35890 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
358a0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
358b0 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
358c0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
358d0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
358e0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
358f0 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
35900 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
35910 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
35920 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
35930 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
35940 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
35950 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
35960 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
35970 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
35980 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
35990 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
359a0 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
359b0 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
359c0 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
359d0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
359e0 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
359f0 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
35a00 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
35a10 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
35a20 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
35a30 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
35a40 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
35a50 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
35a60 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
35a70 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
35a80 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
35a90 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
35aa0 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
35ab0 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
35ac0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
35ad0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
35ae0 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
35af0 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
35b00 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
35b10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
35b20 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
35b30 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
35b40 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
35b50 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
35b60 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
35b70 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
35b80 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
35b90 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
35ba0 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
35bb0 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
35bc0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
35bd0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35be0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35bf0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35c00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35c10 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
35c20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
35c30 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
35c40 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35c50 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35c60 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
35c70 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
35c80 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74      assert( &dat
35c90 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
35ca0 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65  set]==pPage->aCe
35cb0 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20  llIdx );.    rc 
35cc0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
35cd0 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
35ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
35cf0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
35d00 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
35d10 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
35d20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
35d30 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
35d40 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
35d50 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
35d60 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f   successfully */
35d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
35d80 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
35d90 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67  ert( idx >= pPag
35da0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
35db0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c  pPage->nCell+2 |
35dc0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
35dd0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
35de0 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
35df0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
35e00 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
35e10 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
35e20 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
35e30 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
35e40 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
35e50 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
35e60 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
35e70 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
35e80 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20  .    }.    pIns 
35e90 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  = pPage->aCellId
35ea0 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d  x + i*2;.    mem
35eb0 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e  move(pIns+2, pIn
35ec0 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  s, 2*(pPage->nCe
35ed0 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75  ll - i));.    pu
35ee0 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78  t2byte(pIns, idx
35ef0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
35f00 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e  ell++;.    /* in
35f10 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c  crement the cell
35f20 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
35f30 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d  ( (++data[pPage-
35f40 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d  >hdrOffset+4])==
35f50 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e  0 ) data[pPage->
35f60 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a  hdrOffset+3]++;.
35f70 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
35f80 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
35f90 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
35fa0 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
35fb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35fc0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
35fd0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
35fe0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
35ff0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
36000 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
36010 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
36020 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
36030 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
36040 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
36050 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
36060 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
36070 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
36080 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
36090 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
360a0 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
360b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
360c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41  }../*.** A CellA
360d0 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
360e0 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20  ains a cache of 
360f0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a  pointers and siz
36100 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73  es for a.** cons
36110 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65  ecutive sequence
36120 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d   of cells that m
36130 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75 6c  ight be held mul
36140 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a  tiple pages..*/.
36150 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
36160 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72  ellArray CellArr
36170 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41  ay;.struct CellA
36180 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65  rray {.  int nCe
36190 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
361a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
361b0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
361c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  */.  MemPage *pR
361d0 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef;          /* 
361e0 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a  Reference page *
361f0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
36200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
36210 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
36220 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
36230 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
36240 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
36250 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
36260 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d  in apCell[] */.}
36270 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
36280 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  re the cell size
36290 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c  s at idx, idx+1,
362a0 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61   ..., idx+N-1 ha
362b0 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75  ve been.** compu
362c0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
362d0 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c  oid populateCell
362e0 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20  Cache(CellArray 
362f0 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
36300 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   N){.  assert( i
36310 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d  dx>=0 && idx+N<=
36320 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68  p->nCell );.  wh
36330 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20  ile( N>0 ){.    
36340 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c  assert( p->apCel
36350 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20  l[idx]!=0 );.   
36360 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69   if( p->szCell[i
36370 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx]==0 ){.      
36380 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d  p->szCell[idx] =
36390 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
363a0 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
363b0 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20  apCell[idx]);.  
363c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
363d0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
363e0 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  B ||.           
363f0 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
36400 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c  ]==p->pRef->xCel
36410 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
36420 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29  ->apCell[idx]) )
36430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b  ;.    }.    idx+
36440 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a  +;.    N--;.  }.
36450 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
36460 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
36470 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  Nth element of t
36480 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f  he cell array.*/
36490 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
364a0 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70  OINLINE u16 comp
364b0 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  uteCellSize(Cell
364c0 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
364d0 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
364e0 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
364f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
36500 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20  zCell[N]==0 );. 
36510 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20   p->szCell[N] = 
36520 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
36530 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
36540 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74  pCell[N]);.  ret
36550 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36560 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
36570 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65  achedCellSize(Ce
36580 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36590 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
365a0 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
365b0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43   );.  if( p->szC
365c0 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20  ell[N] ) return 
365d0 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20  p->szCell[N];.  
365e0 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65  return computeCe
365f0 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a  llSize(p, N);.}.
36600 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
36610 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70  ell[] contains p
36620 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c  ointers to nCell
36630 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c   b-tree page cel
36640 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65  ls. The .** szCe
36650 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ll[] array conta
36660 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
36670 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65  bytes of each ce
36680 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
36690 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68  n.** replaces th
366a0 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
366b0 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77  ts of page pPg w
366c0 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
366d0 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   of the cell.** 
366e0 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  array..**.** Som
366f0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69  e of the cells i
36700 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63  n apCell[] may c
36710 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
36720 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a  ed in pPg. This.
36730 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  ** function work
36740 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  s around problem
36750 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73  s caused by this
36760 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70   by making a cop
36770 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63  y of any .** suc
36780 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f  h cells before o
36790 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70  verwriting the p
367a0 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  age data..**.** 
367b0 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65  The MemPage.nFre
367c0 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
367d0 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66  idated by this f
367e0 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74  unction. It is t
367f0 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
36800 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
36810 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
36820 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
36830 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61  ic int rebuildPa
36840 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
36850 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
36860 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
36870 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
36880 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
36890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
368a0 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
368b0 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
368c0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
368d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368e0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
368f0 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
36900 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
36910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
36920 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
36930 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
36940 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
36950 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
36960 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
36970 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
36980 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
36990 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
369a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
369b0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
369c0 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
369d0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
369e0 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
369f0 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
36a00 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
36a10 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
36a20 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
36a30 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
36a40 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
36a50 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
36a60 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
36a70 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
36a80 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
36a90 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
36aa0 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
36ab0 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
36ac0 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
36ad0 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
36ae0 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
36af0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
36b00 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
36b10 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
36b20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
36b30 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61  WITHIN(pCell,aDa
36b40 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  ta,pEnd) ){.    
36b50 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
36b60 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
36b70 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
36b80 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
36b90 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
36ba0 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44  ptr, (pData - aD
36bb0 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c  ata));.    pCell
36bc0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66  ptr += 2;.    if
36bd0 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70  ( pData < pCellp
36be0 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  tr ) return SQLI
36bf0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36c00 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
36c10 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  a, pCell, szCell
36c20 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [i]);.    assert
36c30 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67  ( szCell[i]==pPg
36c40 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
36c50 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
36c60 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73  PT_DB );.    tes
36c70 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d  tcase( szCell[i]
36c80 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65  !=pPg->xCellSize
36c90 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20  (pPg,pCell) );. 
36ca0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67   }..  /* The pPg
36cb0 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  ->nFree field is
36cc0 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65   now set incorre
36cd0 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ctly. The caller
36ce0 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f   will fix it. */
36cf0 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20  .  pPg->nCell = 
36d00 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f  nCell;.  pPg->nO
36d10 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
36d20 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
36d30 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75  hdr+1], 0);.  pu
36d40 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
36d50 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c  r+3], pPg->nCell
36d60 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
36d70 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61  Data[hdr+5], pDa
36d80 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61  ta - aData);.  a
36d90 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78  Data[hdr+7] = 0x
36da0 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  00;.  return SQL
36db0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
36dc0 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
36dd0 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
36de0 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
36df0 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
36e00 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e  zCell.** contain
36e10 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
36e20 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
36e30 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
36e40 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
36e50 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c   .** add the cel
36e60 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ls stored in the
36e70 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70   array to page p
36e80 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74  Pg. If it cannot
36e90 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68   (because .** th
36ea0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
36eb0 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20  be defragmented 
36ec0 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73  before the cells
36ed0 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d   will fit), non-
36ee0 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72  zero.** is retur
36ef0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
36f00 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  if the cells are
36f10 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
36f20 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20  lly, zero is.** 
36f30 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
36f40 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74  Argument pCellpt
36f50 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
36f60 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
36f70 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
36f80 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f  array.** (part o
36f90 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70  f page pPg) to p
36fa0 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63  opulate. After c
36fb0 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73  ell apCell[0] is
36fc0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
36fd0 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20  ** page body, a 
36fe0 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73  16-bit offset is
36ff0 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c   written to pCel
37000 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c  lptr. And so on,
37010 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c   for each.** cel
37020 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  l in the array. 
37030 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
37040 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
37050 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65  caller to ensure
37060 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73  .** that it is s
37070 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65  afe to overwrite
37080 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
37090 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
370a0 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rray..**.** When
370b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
370c0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74  s called, *ppDat
370d0 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  a points to the 
370e0 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a  start of the .**
370f0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e   content area on
37100 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68   page pPg. If th
37110 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
37120 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78  ntent area is ex
37130 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61  tended,.** *ppDa
37140 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ta is updated to
37150 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
37160 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  w start of the c
37170 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62  ontent area.** b
37180 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
37190 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
371a0 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20  argument pBegin 
371b0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79  points to the by
371c0 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  te immediately f
371d0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20  ollowing the.** 
371e0 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65  end of the space
371f0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
37200 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63  s page for the c
37210 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
37220 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c   (for.** all cel
37230 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68  ls - not just th
37240 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20  ose inserted by 
37250 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c  the current call
37260 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  ). If the conten
37270 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62  t.** area must b
37280 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65  e extended to be
37290 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20  fore this point 
372a0 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f  in order to acco
372b0 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65  modate all.** ce
372c0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c  lls in apCell[],
372d0 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20   then the cells 
372e0 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e  do not fit and n
372f0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
37300 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
37310 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  nt pageInsertArr
37320 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
37330 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
37340 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
37350 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f   add cells to */
37360 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20  .  u8 *pBegin,  
37370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37380 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c     /* End of cel
37390 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l-pointer array 
373a0 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61  */.  u8 **ppData
373b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
373c0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
373d0 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72  Page content -ar
373e0 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ea pointer */.  
373f0 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20  u8 *pCellptr,   
37400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37410 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65  /* Pointer to ce
37420 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
37430 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
37440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37450 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
37460 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 61   first cell to a
37470 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  dd */.  int nCel
37480 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37490 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
374a0 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
374b0 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65  d to pPg */.  Ce
374c0 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79  llArray *pCArray
374d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
374e0 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
374f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
37500 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67   u8 *aData = pPg
37510 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70  ->aData;.  u8 *p
37520 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a  Data = *ppData;.
37530 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69    int iEnd = iFi
37540 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61  rst + nCell;.  a
37550 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
37560 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66  B || pPg->hdrOff
37570 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
37580 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  Never called on 
37590 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28  page 1 */.  for(
375a0 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64  i=iFirst; i<iEnd
375b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
375c0 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a  sz, rc;.    u8 *
375d0 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20  pSlot;.    sz = 
375e0 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70  cachedCellSize(p
375f0 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20  CArray, i);.    
37600 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30  if( (aData[1]==0
37610 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29   && aData[2]==0)
37620 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
37630 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a  eFindSlot(pPg,sz
37640 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ,&rc))==0 ){.   
37650 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a     pData -= sz;.
37660 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3c        if( pData<
37670 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e 20  pBegin ) return 
37680 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d  1;.      pSlot =
37690 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
376a0 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e 64 20 70    /* pSlot and p
376b0 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
376c0 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  ] will never ove
376d0 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c 6c 2d 66  rlap on a well-f
376e0 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20 64 61 74  ormed.    ** dat
376f0 61 62 61 73 65 2e 20 20 42 75 74 20 74 68 65 79  abase.  But they
37700 20 6d 69 67 68 74 20 66 6f 72 20 61 20 63 6f 72   might for a cor
37710 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20  rupt database.  
37720 48 65 6e 63 65 20 75 73 65 20 6d 65 6d 6d 6f 76  Hence use memmov
37730 65 28 29 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65  e().    ** since
37740 20 6d 65 6d 63 70 79 28 29 20 73 65 6e 64 73 20   memcpy() sends 
37750 53 49 47 41 42 4f 52 54 20 77 69 74 68 20 6f 76  SIGABORT with ov
37760 65 72 6c 61 70 70 69 6e 67 20 62 75 66 66 65 72  erlapping buffer
37770 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20 2a 2f 0a  s on OpenBSD */.
37780 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 6c      assert( (pSl
37790 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72 61 79 2d  ot+sz)<=pCArray-
377a0 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20 20 20 20  >apCell[i].     
377b0 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d 28 70      || pSlot>=(p
377c0 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
377d0 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20 20 20 7c  ]+sz).         |
377e0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
377f0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 53 6c 6f      memmove(pSlo
37800 74 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65  t, pCArray->apCe
37810 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  ll[i], sz);.    
37820 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
37830 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74  r, (pSlot - aDat
37840 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  a));.    pCellpt
37850 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70  r += 2;.  }.  *p
37860 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
37870 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
37880 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
37890 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
378a0 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
378b0 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
378c0 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e  y szCell .** con
378d0 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
378e0 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
378f0 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
37900 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68  function adds th
37910 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63  e.** space assoc
37920 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
37930 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
37940 79 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  y that is curren
37950 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77  tly stored .** w
37960 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f  ithin the body o
37970 66 20 70 50 67 20 74 6f 20 74 68 65 20 70 50 67  f pPg to the pPg
37980 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20   free-list. The 
37990 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e  cell-pointers an
379a0 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64  d other.** field
379b0 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 72  s of the page ar
379c0 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a  e not updated..*
379d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
379e0 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  on returns the t
379f0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
37a00 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68  ells added to th
37a10 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a  e free-list..*/.
37a20 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 46  static int pageF
37a30 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  reeArray(.  MemP
37a40 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
37a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37a60 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20  age to edit */. 
37a70 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
37a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37a90 20 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c 20 74   /* First cell t
37aa0 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
37ab0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
37ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37ad0 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65   Cells to delete
37ae0 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20   */.  CellArray 
37af0 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20  *pCArray        
37b00 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37b10 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  f cells */.){.  
37b20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
37b30 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
37b40 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
37b50 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70   = &aData[pPg->p
37b60 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
37b70 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53  .  u8 * const pS
37b80 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50  tart = &aData[pP
37b90 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38  g->hdrOffset + 8
37ba0 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72   + pPg->childPtr
37bb0 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65  Size];.  int nRe
37bc0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  t = 0;.  int i;.
37bd0 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69    int iEnd = iFi
37be0 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75  rst + nCell;.  u
37bf0 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  8 *pFree = 0;.  
37c00 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a  int szFree = 0;.
37c10 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
37c20 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20   i<iEnd; i++){. 
37c30 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
37c40 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
37c50 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ];.    if( SQLIT
37c60 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 20  E_WITHIN(pCell, 
37c70 70 53 74 61 72 74 2c 20 70 45 6e 64 29 20 29 7b  pStart, pEnd) ){
37c80 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
37c90 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20       /* No need 
37ca0 74 6f 20 75 73 65 20 63 61 63 68 65 64 43 65 6c  to use cachedCel
37cb0 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54  lSize() here.  T
37cc0 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20  he sizes of all 
37cd0 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20  cells that.     
37ce0 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72   ** are to be fr
37cf0 65 65 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  eed have already
37d00 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20   been computing 
37d10 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77  while deciding w
37d20 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65  hich.      ** ce
37d30 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67  lls need freeing
37d40 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70   */.      sz = p
37d50 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69  CArray->szCell[i
37d60 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30  ];  assert( sz>0
37d70 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
37d80 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a  ree!=(pCell + sz
37d90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
37da0 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
37db0 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65      assert( pFre
37dc0 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65  e>aData && (pFre
37dd0 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36  e - aData)<65536
37de0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72   );.          fr
37df0 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31  eeSpace(pPg, (u1
37e00 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  6)(pFree - aData
37e10 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20  ), szFree);.    
37e20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46      }.        pF
37e30 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
37e40 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a       szFree = sz
37e50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
37e60 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65  ree+sz>pEnd ) re
37e70 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
37e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72  lse{.        pFr
37e90 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ee = pCell;.    
37ea0 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a      szFree += sz
37eb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37ec0 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRet++;.    }.  
37ed0 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  }.  if( pFree ){
37ee0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
37ef0 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
37f00 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
37f10 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61  6 );.    freeSpa
37f20 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
37f30 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a  ree - aData), sz
37f40 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
37f50 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
37f60 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  ** apCell[] and 
37f70 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  szCell[] contain
37f80 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e  s pointers to an
37f90 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63  d sizes of all c
37fa0 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ells in the.** p
37fb0 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ages being balan
37fc0 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ced.  The curren
37fd0 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73  t page, pPg, has
37fe0 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c   pPg->nCell cell
37ff0 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  s starting.** wi
38000 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e  th apCell[iOld].
38010 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e    After balancin
38020 67 2c 20 74 68 69 73 20 70 61 67 65 20 73 68 6f  g, this page sho
38030 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65  uld hold nNew ce
38040 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20  lls.** starting 
38050 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e  at apCell[iNew].
38060 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
38070 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65  ine makes the ne
38080 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
38090 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68  nts to pPg so th
380a0 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  at it contains.*
380b0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 65  * the correct ce
380c0 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67 20  lls after being 
380d0 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
380e0 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66  The pPg->nFree f
380f0 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20  ield is invalid 
38100 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
38110 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69  on returns. It i
38120 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
38130 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
38140 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
38150 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
38160 61 74 69 63 20 69 6e 74 20 65 64 69 74 50 61 67  atic int editPag
38170 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
38180 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
38190 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68 69       /* Edit thi
381a0 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  s page */.  int 
381b0 69 4f 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  iOld,           
381c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
381d0 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65  ndex of first ce
381e0 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  ll currently on 
381f0 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4e  page */.  int iN
38200 65 77 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ew,             
38210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
38220 65 78 20 6f 66 20 6e 65 77 20 66 69 72 73 74 20  ex of new first 
38230 63 65 6c 6c 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  cell on page */.
38240 20 20 69 6e 74 20 6e 4e 65 77 2c 20 20 20 20 20    int nNew,     
38250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38260 20 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65    /* Final numbe
38270 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61  r of cells on pa
38280 67 65 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61  ge */.  CellArra
38290 79 20 2a 70 43 41 72 72 61 79 20 20 20 20 20 20  y *pCArray      
382a0 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
382b0 20 6f 66 20 63 65 6c 6c 73 20 61 6e 64 20 73 69   of cells and si
382c0 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  zes */.){.  u8 *
382d0 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70   const aData = p
382e0 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 63 6f 6e  Pg->aData;.  con
382f0 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
38300 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75  ->hdrOffset;.  u
38310 38 20 2a 70 42 65 67 69 6e 20 3d 20 26 70 50 67  8 *pBegin = &pPg
38320 2d 3e 61 43 65 6c 6c 49 64 78 5b 6e 4e 65 77 20  ->aCellIdx[nNew 
38330 2a 20 32 5d 3b 0a 20 20 69 6e 74 20 6e 43 65 6c  * 2];.  int nCel
38340 6c 20 3d 20 70 50 67 2d 3e 6e 43 65 6c 6c 3b 20  l = pPg->nCell; 
38350 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 73        /* Cells s
38360 74 6f 72 65 64 20 6f 6e 20 70 50 67 20 2a 2f 0a  tored on pPg */.
38370 20 20 75 38 20 2a 70 44 61 74 61 3b 0a 20 20 75    u8 *pData;.  u
38380 38 20 2a 70 43 65 6c 6c 70 74 72 3b 0a 20 20 69  8 *pCellptr;.  i
38390 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 4f 6c 64  nt i;.  int iOld
383a0 45 6e 64 20 3d 20 69 4f 6c 64 20 2b 20 70 50 67  End = iOld + pPg
383b0 2d 3e 6e 43 65 6c 6c 20 2b 20 70 50 67 2d 3e 6e  ->nCell + pPg->n
383c0 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 6e 74 20  Overflow;.  int 
383d0 69 4e 65 77 45 6e 64 20 3d 20 69 4e 65 77 20 2b  iNewEnd = iNew +
383e0 20 6e 4e 65 77 3b 0a 0a 23 69 66 64 65 66 20 53   nNew;..#ifdef S
383f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
38400 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65 33   *pTmp = sqlite3
38410 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 70  PagerTempSpace(p
38420 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29  Pg->pBt->pPager)
38430 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 6d 70 2c  ;.  memcpy(pTmp,
38440 20 61 44 61 74 61 2c 20 70 50 67 2d 3e 70 42 74   aData, pPg->pBt
38450 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 23  ->usableSize);.#
38460 65 6e 64 69 66 0