/ Hex Artifact Content
Login

Artifact 474ad91c1684e9053da64fa88747a1cb0c10d034:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 73 74  Bt->mutex);.}.st
3ba0: 61 74 69 63 20 69 6e 74 20 63 75 72 73 6f 72 4f  atic int cursorO
3bb0: 77 6e 73 42 74 53 68 61 72 65 64 28 42 74 43 75  wnsBtShared(BtCu
3bc0: 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
3bd0: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
3be0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
3bf0: 75 72 6e 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e  urn (p->pBtree->
3c00: 64 62 3d 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b  db==p->pBt->db);
3c10: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
3c20: 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20   Invalidate the 
3c30: 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f  overflow cache o
3c40: 66 20 74 68 65 20 63 75 72 73 6f 72 20 70 61 73  f the cursor pas
3c50: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
3c60: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e   argument..** on
3c70: 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72 65   the shared btre
3c80: 65 20 73 74 72 75 63 74 75 72 65 20 70 42 74 2e  e structure pBt.
3c90: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61  .*/.#define inva
3ca0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
3cb0: 63 68 65 28 70 43 75 72 29 20 28 70 43 75 72 2d  che(pCur) (pCur-
3cc0: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54  >curFlags &= ~BT
3cd0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f  CF_ValidOvfl)../
3ce0: 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20  *.** Invalidate 
3cf0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
3d00: 65 2d 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72  e-list cache for
3d10: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65   all cursors ope
3d20: 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68  ned.** on the sh
3d30: 61 72 65 64 20 62 74 72 65 65 20 73 74 72 75 63  ared btree struc
3d40: 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61  ture pBt..*/.sta
3d50: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
3d60: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
3d70: 63 68 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  che(BtShared *pB
3d80: 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  t){.  BtCursor *
3d90: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  p;.  assert( sql
3da0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3db0: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
3dc0: 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72   for(p=pBt->pCur
3dd0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
3de0: 78 74 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64  xt){.    invalid
3df0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3e00: 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  (p);.  }.}..#ifn
3e10: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3e20: 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54  INCRBLOB./*.** T
3e30: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
3e40: 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f  called before mo
3e50: 64 69 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74  difying the cont
3e60: 65 6e 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a  ents of a table.
3e70: 2a 2a 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65  ** to invalidate
3e80: 20 61 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75   any incrblob cu
3e90: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f  rsors that are o
3ea0: 70 65 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f  pen on the.** ro
3eb0: 77 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20  w or one of the 
3ec0: 72 6f 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66  rows being modif
3ed0: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ied..**.** If ar
3ee0: 67 75 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61  gument isClearTa
3ef0: 62 6c 65 20 69 73 20 74 72 75 65 2c 20 74 68 65  ble is true, the
3f00: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e  n the entire con
3f10: 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20  tents of the.** 
3f20: 74 61 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74  table is about t
3f30: 6f 20 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e  o be deleted. In
3f40: 20 74 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c   this case inval
3f50: 69 64 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c  idate all incrbl
3f60: 6f 62 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70  ob.** cursors op
3f70: 65 6e 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69  en on any row wi
3f80: 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77  thin the table w
3f90: 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67  ith root-page pg
3fa0: 6e 6f 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74  noRoot..**.** Ot
3fb0: 68 65 72 77 69 73 65 2c 20 69 66 20 61 72 67 75  herwise, if argu
3fc0: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3fd0: 65 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  e is false, then
3fe0: 20 74 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a   the row with.**
3ff0: 20 72 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62   rowid iRow is b
4000: 65 69 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72  eing replaced or
4010: 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69   deleted. In thi
4020: 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74  s case invalidat
4030: 65 0a 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20  e.** only those 
4040: 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73  incrblob cursors
4050: 20 6f 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70   open on that sp
4060: 65 63 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73  ecific row..*/.s
4070: 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c  tatic void inval
4080: 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72  idateIncrblobCur
4090: 73 6f 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70  sors(.  Btree *p
40a0: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 20 20  Btree,          
40b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
40c0: 66 69 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f  file to check */
40d0: 0a 20 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20  .  i64 iRow,    
40e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
40f0: 65 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67  e rowid that mig
4100: 68 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a  ht be changing *
4110: 2f 0a 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54  /.  int isClearT
4120: 61 62 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54  able        /* T
4130: 72 75 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  rue if all rows 
4140: 61 72 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65  are being delete
4150: 64 20 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73  d */.){.  BtCurs
4160: 6f 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74  or *p;.  if( pBt
4170: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4180: 43 75 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Cur==0 ) return;
4190: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
41a0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
41b0: 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70  x(pBtree) );.  p
41c0: 42 74 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c  Btree->hasIncrbl
41d0: 6f 62 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72  obCur = 0;.  for
41e0: 28 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e  (p=pBtree->pBt->
41f0: 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d  pCursor; p; p=p-
4200: 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
4210: 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20   (p->curFlags & 
4220: 42 54 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d  BTCF_Incrblob)!=
4230: 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65  0 ){.      pBtre
4240: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
4250: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  r = 1;.      if(
4260: 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c   isClearTable ||
4270: 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
4280: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Row ){.        p
4290: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
42a0: 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
42b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
42c0: 23 65 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20  #else.  /* Stub 
42d0: 66 75 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e  function when IN
42e0: 43 52 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65  CRBLOB is omitte
42f0: 64 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69  d */.  #define i
4300: 6e 76 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f  nvalidateIncrblo
4310: 62 43 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a  bCursors(x,y,z).
4320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
4330: 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a  _OMIT_INCRBLOB *
4340: 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74  /../*.** Set bit
4350: 20 70 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53   pgno of the BtS
4360: 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e  hared.pHasConten
4370: 74 20 62 69 74 76 65 63 2e 20 54 68 69 73 20 69  t bitvec. This i
4380: 73 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65  s called .** whe
4390: 6e 20 61 20 70 61 67 65 20 74 68 61 74 20 70 72  n a page that pr
43a0: 65 76 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e  eviously contain
43b0: 65 64 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20  ed data becomes 
43c0: 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
43d0: 20 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a   .** page..**.**
43e0: 20 54 68 65 20 42 74 53 68 61 72 65 64 2e 70 48   The BtShared.pH
43f0: 61 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63  asContent bitvec
4400: 20 65 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20   exists to work 
4410: 61 72 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72  around an obscur
4420: 65 0a 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20  e.** bug caused 
4430: 62 79 20 74 68 65 20 69 6e 74 65 72 61 63 74 69  by the interacti
4440: 6f 6e 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c  on of two useful
4450: 20 49 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   IO optimization
4460: 73 20 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a  s surrounding.**
4470: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
4480: 70 61 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  pages:.**.**   1
4490: 29 20 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  ) When all data 
44a0: 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  is deleted from 
44b0: 61 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 70  a page and the p
44c0: 61 67 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20  age becomes.**  
44d0: 20 20 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20      a free-list 
44e0: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 70  leaf page, the p
44f0: 61 67 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74  age is not writt
4500: 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
4510: 73 65 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66  se.**      (as f
4520: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
4530: 67 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d  ges contain no m
4540: 65 61 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e  eaningful data).
4550: 20 53 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20   Sometimes.**   
4560: 20 20 20 73 75 63 68 20 61 20 70 61 67 65 20 69     such a page i
4570: 73 20 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e  s not even journ
4580: 61 6c 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c  alled (as it wil
4590: 6c 20 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  l not be modifie
45a0: 64 2c 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62  d,.**      why b
45b0: 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e  other journallin
45c0: 67 20 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20  g it?)..**.**   
45d0: 32 29 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c  2) When a free-l
45e0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ist leaf page is
45f0: 20 72 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e   reused, its con
4600: 74 65 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64  tent is not read
4610: 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68  .**      from th
4620: 65 20 64 61 74 61 62 61 73 65 20 6f 72 20 77 72  e database or wr
4630: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4640: 72 6e 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73  rnal file (why s
4650: 68 6f 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20  hould it.**     
4660: 20 62 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f   be, if it is no
4670: 74 20 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67  t at all meaning
4680: 66 75 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20  ful?)..**.** By 
4690: 74 68 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73  themselves, thes
46a0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  e optimizations 
46b0: 77 6f 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72  work fine and pr
46c0: 6f 76 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a  ovide a handy.**
46d0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f   performance boo
46e0: 73 74 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74  st to bulk delet
46f0: 65 20 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72  e or insert oper
4700: 61 74 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c  ations. However,
4710: 20 69 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73   if.** a page is
4720: 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72   moved to the fr
4730: 65 65 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e  ee-list and then
4740: 20 72 65 75 73 65 64 20 77 69 74 68 69 6e 20 74   reused within t
4750: 68 65 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73  he same.** trans
4760: 61 63 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65  action, a proble
4770: 6d 20 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74  m comes up. If t
4780: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a  he page is not j
4790: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a  ournalled when.*
47a0: 2a 20 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f  * it is moved to
47b0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61   the free-list a
47c0: 6e 64 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f  nd it is also no
47d0: 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65  t journalled whe
47e0: 6e 20 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61  n it.** is extra
47f0: 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  cted from the fr
4800: 65 65 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73  ee-list and reus
4810: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ed, then the ori
4820: 67 69 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61  ginal data.** ma
4830: 79 20 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68  y be lost. In th
4840: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c  e event of a rol
4850: 6c 62 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f  lback, it may no
4860: 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a  t be possible.**
4870: 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
4880: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
4890: 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75  original configu
48a0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
48b0: 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68  e solution is th
48c0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
48d0: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57  ontent bitvec. W
48e0: 68 65 6e 65 76 65 72 20 61 20 70 61 67 65 20 69  henever a page i
48f0: 73 20 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62  s .** moved to b
4900: 65 63 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73  ecome a free-lis
4910: 74 20 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65  t leaf page, the
4920: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
4930: 69 74 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20  it is.** set in 
4940: 74 68 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e  the bitvec. When
4950: 65 76 65 72 20 61 20 6c 65 61 66 20 70 61 67 65  ever a leaf page
4960: 20 69 73 20 65 78 74 72 61 63 74 65 64 20 66 72   is extracted fr
4970: 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  om the free-list
4980: 2c 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ,.** optimizatio
4990: 6e 20 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69  n 2 above is omi
49a0: 74 74 65 64 20 69 66 20 74 68 65 20 63 6f 72 72  tted if the corr
49b0: 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
49c0: 20 61 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20   already.** set 
49d0: 69 6e 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  in BtShared.pHas
49e0: 43 6f 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e  Content. The con
49f0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74  tents of the bit
4a00: 76 65 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a  vec are cleared.
4a10: 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
4a20: 20 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69   every transacti
4a30: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
4a40: 74 20 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e  t btreeSetHasCon
4a50: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4a60: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4a70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4a80: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74  E_OK;.  if( !pBt
4a90: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b  ->pHasContent ){
4aa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
4ab0: 6f 3c 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b  o<=pBt->nPage );
4ac0: 0a 20 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f  .    pBt->pHasCo
4ad0: 6e 74 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42  ntent = sqlite3B
4ae0: 69 74 76 65 63 43 72 65 61 74 65 28 70 42 74 2d  itvecCreate(pBt-
4af0: 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  >nPage);.    if(
4b00: 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65   !pBt->pHasConte
4b10: 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nt ){.      rc =
4b20: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
4b30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  PT;.    }.  }.  
4b40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4b50: 4b 20 26 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74  K && pgno<=sqlit
4b60: 65 33 42 69 74 76 65 63 53 69 7a 65 28 70 42 74  e3BitvecSize(pBt
4b70: 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 29 20 29  ->pHasContent) )
4b80: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
4b90: 65 33 42 69 74 76 65 63 53 65 74 28 70 42 74 2d  e3BitvecSet(pBt-
4ba0: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67  >pHasContent, pg
4bb0: 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  no);.  }.  retur
4bc0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51  n rc;.}../*.** Q
4bd0: 75 65 72 79 20 74 68 65 20 42 74 53 68 61 72 65  uery the BtShare
4be0: 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 76 65  d.pHasContent ve
4bf0: 63 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ctor..**.** This
4c00: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4c10: 6c 65 64 20 77 68 65 6e 20 61 20 66 72 65 65 2d  led when a free-
4c20: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 20 69  list leaf page i
4c30: 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  s removed from t
4c40: 68 65 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20  he.** free-list 
4c50: 66 6f 72 20 72 65 75 73 65 2e 20 49 74 20 72 65  for reuse. It re
4c60: 74 75 72 6e 73 20 66 61 6c 73 65 20 69 66 20 69  turns false if i
4c70: 74 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 74  t is safe to ret
4c80: 72 69 65 76 65 20 74 68 65 0a 2a 2a 20 70 61 67  rieve the.** pag
4c90: 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
4ca0: 20 6c 61 79 65 72 20 77 69 74 68 20 74 68 65 20   layer with the 
4cb0: 27 6e 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61  'no-content' fla
4cc0: 67 20 73 65 74 2e 20 54 72 75 65 20 6f 74 68 65  g set. True othe
4cd0: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
4ce0: 20 69 6e 74 20 62 74 72 65 65 47 65 74 48 61 73   int btreeGetHas
4cf0: 43 6f 6e 74 65 6e 74 28 42 74 53 68 61 72 65 64  Content(BtShared
4d00: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pBt, Pgno pgno
4d10: 29 7b 0a 20 20 42 69 74 76 65 63 20 2a 70 20 3d  ){.  Bitvec *p =
4d20: 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e   pBt->pHasConten
4d30: 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  t;.  return (p &
4d40: 26 20 28 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42  & (pgno>sqlite3B
4d50: 69 74 76 65 63 53 69 7a 65 28 70 29 20 7c 7c 20  itvecSize(p) || 
4d60: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
4d70: 74 28 70 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a  t(p, pgno)));.}.
4d80: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65  ./*.** Clear (de
4d90: 73 74 72 6f 79 29 20 74 68 65 20 42 74 53 68 61  stroy) the BtSha
4da0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
4db0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 73 68 6f  bitvec. This sho
4dc0: 75 6c 64 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65  uld be.** invoke
4dd0: 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75 73  d at the conclus
4de0: 69 6f 6e 20 6f 66 20 65 61 63 68 20 77 72 69 74  ion of each writ
4df0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e-transaction..*
4e00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
4e10: 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65  reeClearHasConte
4e20: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4e30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
4e40: 65 63 44 65 73 74 72 6f 79 28 70 42 74 2d 3e 70  ecDestroy(pBt->p
4e50: 48 61 73 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70  HasContent);.  p
4e60: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4e70: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
4e80: 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 74 68 65  lease all of the
4e90: 20 61 70 50 61 67 65 5b 5d 20 70 61 67 65 73 20   apPage[] pages 
4ea0: 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
4eb0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
4ec0: 65 65 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73  eeReleaseAllCurs
4ed0: 6f 72 50 61 67 65 73 28 42 74 43 75 72 73 6f 72  orPages(BtCursor
4ee0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69   *pCur){.  int i
4ef0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
4f00: 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b  pCur->iPage; i++
4f10: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
4f20: 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
4f30: 69 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  i]);.    pCur->a
4f40: 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPage[i] = 0;.  
4f50: 7d 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  }.  pCur->iPage 
4f60: 3d 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  = -1;.}../*.** T
4f70: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
4f80: 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
4f90: 75 6d 65 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74  ument must point
4fa0: 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
4fb0: 79 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  y.** when this f
4fc0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
4fd0: 64 20 28 69 2e 65 2e 20 68 61 76 65 20 65 53 74  d (i.e. have eSt
4fe0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
4ff0: 44 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  D). This.** func
5000: 74 69 6f 6e 20 73 61 76 65 73 20 74 68 65 20 63  tion saves the c
5010: 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 6b 65  urrent cursor ke
5020: 79 20 69 6e 20 76 61 72 69 61 62 6c 65 73 20 70  y in variables p
5030: 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a  Cur->nKey and.**
5040: 20 70 43 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c   pCur->pKey. SQL
5050: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
5060: 65 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ed if successful
5070: 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
5080: 72 6f 72 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  ror .** code oth
5090: 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
50a0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6f   the cursor is o
50b0: 70 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79  pen on an intkey
50c0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68 65   table, then the
50d0: 20 69 6e 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20   integer key.** 
50e0: 28 74 68 65 20 72 6f 77 69 64 29 20 69 73 20 73  (the rowid) is s
50f0: 74 6f 72 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e  tored in pCur->n
5100: 4b 65 79 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b  Key and pCur->pK
5110: 65 79 20 69 73 20 6c 65 66 74 20 73 65 74 20 74  ey is left set t
5120: 6f 0a 2a 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68  o.** NULL. If th
5130: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
5140: 20 6f 6e 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79   on a non-intkey
5150: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 70 43 75   table, then pCu
5160: 72 2d 3e 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73  r->pKey is .** s
5170: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  et to point to a
5180: 20 6d 61 6c 6c 6f 63 65 64 20 62 75 66 66 65 72   malloced buffer
5190: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65   pCur->nKey byte
51a0: 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69  s in size contai
51b0: 6e 69 6e 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79  ning .** the key
51c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
51d0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 42 74  saveCursorKey(Bt
51e0: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
51f0: 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
5200: 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  t( CURSOR_VALID=
5210: 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b  =pCur->eState );
5220: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43  .  assert( 0==pC
5230: 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73  ur->pKey );.  as
5240: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
5250: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
5260: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
5270: 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
5280: 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a  , &pCur->nKey);.
5290: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
52a0: 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 2f 2a 20 4b  LITE_OK );  /* K
52b0: 65 79 53 69 7a 65 28 29 20 63 61 6e 6e 6f 74 20  eySize() cannot 
52c0: 66 61 69 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  fail */..  /* If
52d0: 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b   this is an intK
52e0: 65 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74  ey table, then t
52f0: 68 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f  he above call to
5300: 20 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a   BtreeKeySize().
5310: 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20    ** stores the 
5320: 69 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70  integer key in p
5330: 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68  Cur->nKey. In th
5340: 69 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c  is case this val
5350: 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74  ue is.  ** all t
5360: 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e  hat is required.
5370: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70   Otherwise, if p
5380: 43 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20  Cur is not open 
5390: 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a  on an intKey.  *
53a0: 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61  * table, then ma
53b0: 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61  lloc space for a
53c0: 6e 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75  nd store the pCu
53d0: 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66  r->nKey bytes of
53e0: 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e   key .  ** data.
53f0: 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 70 43    */.  if( 0==pC
5400: 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 29 7b  ur->curIntKey ){
5410: 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65 79 20  .    void *pKey 
5420: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
5430: 20 70 43 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20   pCur->nKey );. 
5440: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
5450: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
5460: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
5470: 30 2c 20 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b  0, (int)pCur->nK
5480: 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20 20  ey, pKey);.     
5490: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
54a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43  OK ){.        pC
54b0: 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b  ur->pKey = pKey;
54c0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
54d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
54e0: 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20 20  ee(pKey);.      
54f0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
5500: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
5510: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
5520: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
5530: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5540: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
5550: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
5560: 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  ../*.** Save the
5570: 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
5580: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
5590: 76 61 72 69 61 62 6c 65 73 20 42 74 43 75 72 73  variables BtCurs
55a0: 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20  or.nKey .** and 
55b0: 42 74 43 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54  BtCursor.pKey. T
55c0: 68 65 20 63 75 72 73 6f 72 27 73 20 73 74 61 74  he cursor's stat
55d0: 65 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  e is set to CURS
55e0: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 2e 0a  OR_REQUIRESEEK..
55f0: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72  **.** The caller
5600: 20 6d 75 73 74 20 65 6e 73 75 72 65 20 74 68 61   must ensure tha
5610: 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
5620: 76 61 6c 69 64 20 28 68 61 73 20 65 53 74 61 74  valid (has eStat
5630: 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29  e==CURSOR_VALID)
5640: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  .** prior to cal
5650: 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e  ling this routin
5660: 65 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e.  .*/.static i
5670: 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  nt saveCursorPos
5680: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
5690: 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pCur){.  int rc;
56a0: 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ..  assert( CURS
56b0: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
56c0: 65 53 74 61 74 65 20 7c 7c 20 43 55 52 53 4f 52  eState || CURSOR
56d0: 5f 53 4b 49 50 4e 45 58 54 3d 3d 70 43 75 72 2d  _SKIPNEXT==pCur-
56e0: 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73  >eState );.  ass
56f0: 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b  ert( 0==pCur->pK
5700: 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
5710: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
5720: 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28  (pCur) );..  if(
5730: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
5740: 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29  URSOR_SKIPNEXT )
5750: 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  {.    pCur->eSta
5760: 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
5770: 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
5780: 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
5790: 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20   0;.  }..  rc = 
57a0: 73 61 76 65 43 75 72 73 6f 72 4b 65 79 28 70 43  saveCursorKey(pC
57b0: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
57c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
57d0: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
57e0: 75 72 73 6f 72 50 61 67 65 73 28 70 43 75 72 29  ursorPages(pCur)
57f0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
5800: 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55  te = CURSOR_REQU
5810: 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20  IRESEEK;.  }..  
5820: 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
5830: 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b  = ~(BTCF_ValidNK
5840: 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
5850: 6c 7c 42 54 43 46 5f 41 74 4c 61 73 74 29 3b 0a  l|BTCF_AtLast);.
5860: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
5870: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
5880: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
5890: 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
58a0: 4e 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e  NE saveCursorsOn
58b0: 4c 69 73 74 28 42 74 43 75 72 73 6f 72 2a 2c 50  List(BtCursor*,P
58c0: 67 6e 6f 2c 42 74 43 75 72 73 6f 72 2a 29 3b 0a  gno,BtCursor*);.
58d0: 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20  ./*.** Save the 
58e0: 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c  positions of all
58f0: 20 63 75 72 73 6f 72 73 20 28 65 78 63 65 70 74   cursors (except
5900: 20 70 45 78 63 65 70 74 29 20 74 68 61 74 20 61   pExcept) that a
5910: 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a 2a 20 74 68  re open on.** th
5920: 65 20 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f  e table with roo
5930: 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 22  t-page iRoot.  "
5940: 53 61 76 69 6e 67 20 74 68 65 20 63 75 72 73 6f  Saving the curso
5950: 72 20 70 6f 73 69 74 69 6f 6e 22 20 6d 65 61 6e  r position" mean
5960: 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6c 6f  s that.** the lo
5970: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 62 74  cation in the bt
5980: 72 65 65 20 69 73 20 72 65 6d 65 6d 62 65 72 65  ree is remembere
5990: 64 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20  d in such a way 
59a0: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 0a 2a  that it can be.*
59b0: 2a 20 6d 6f 76 65 64 20 62 61 63 6b 20 74 6f 20  * moved back to 
59c0: 74 68 65 20 73 61 6d 65 20 73 70 6f 74 20 61 66  the same spot af
59d0: 74 65 72 20 74 68 65 20 62 74 72 65 65 20 68 61  ter the btree ha
59e0: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
59f0: 20 20 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e    This.** routin
5a00: 65 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  e is called just
5a10: 20 62 65 66 6f 72 65 20 63 75 72 73 6f 72 20 70   before cursor p
5a20: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
5a30: 6f 20 6d 6f 64 69 66 79 20 74 68 65 0a 2a 2a 20  o modify the.** 
5a40: 74 61 62 6c 65 2c 20 66 6f 72 20 65 78 61 6d 70  table, for examp
5a50: 6c 65 20 69 6e 20 42 74 72 65 65 44 65 6c 65 74  le in BtreeDelet
5a60: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
5a70: 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rt()..**.** If t
5a80: 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72 20  here are two or 
5a90: 6d 6f 72 65 20 63 75 72 73 6f 72 73 20 6f 6e 20  more cursors on 
5aa0: 74 68 65 20 73 61 6d 65 20 62 74 72 65 65 2c 20  the same btree, 
5ab0: 74 68 65 6e 20 61 6c 6c 20 73 75 63 68 20 0a 2a  then all such .*
5ac0: 2a 20 63 75 72 73 6f 72 73 20 73 68 6f 75 6c 64  * cursors should
5ad0: 20 68 61 76 65 20 74 68 65 69 72 20 42 54 43 46   have their BTCF
5ae0: 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20 73  _Multiple flag s
5af0: 65 74 2e 20 20 54 68 65 20 62 74 72 65 65 43 75  et.  The btreeCu
5b00: 72 73 6f 72 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  rsor().** routin
5b10: 65 20 65 6e 66 6f 72 63 65 73 20 74 68 61 74 20  e enforces that 
5b20: 72 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  rule.  This rout
5b30: 69 6e 65 20 6f 6e 6c 79 20 6e 65 65 64 73 20 74  ine only needs t
5b40: 6f 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 0a 2a  o be called in.*
5b50: 2a 20 74 68 65 20 75 6e 63 6f 6d 6d 6f 6e 20 63  * the uncommon c
5b60: 61 73 65 20 77 68 65 6e 20 70 45 78 70 65 63 74  ase when pExpect
5b70: 20 68 61 73 20 74 68 65 20 42 54 43 46 5f 4d 75   has the BTCF_Mu
5b80: 6c 74 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e  ltiple flag set.
5b90: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 65 63  .**.** If pExpec
5ba0: 74 21 3d 4e 55 4c 4c 20 61 6e 64 20 69 66 20 6e  t!=NULL and if n
5bb0: 6f 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20  o other cursors 
5bc0: 61 72 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65  are found on the
5bd0: 20 73 61 6d 65 20 72 6f 6f 74 2d 70 61 67 65 2c   same root-page,
5be0: 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 42 54 43  .** then the BTC
5bf0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5c00: 6f 6e 20 70 45 78 70 65 63 74 20 69 73 20 63 6c  on pExpect is cl
5c10: 65 61 72 65 64 2c 20 74 6f 20 61 76 6f 69 64 20  eared, to avoid 
5c20: 61 6e 6f 74 68 65 72 0a 2a 2a 20 70 6f 69 6e 74  another.** point
5c30: 6c 65 73 73 20 63 61 6c 6c 20 74 6f 20 74 68 69  less call to thi
5c40: 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
5c50: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
5c60: 6e 6f 74 65 3a 20 20 54 68 69 73 20 72 6f 75 74  note:  This rout
5c70: 69 6e 65 20 6d 65 72 65 6c 79 20 63 68 65 63 6b  ine merely check
5c80: 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 79 20  s to see if any 
5c90: 63 75 72 73 6f 72 73 0a 2a 2a 20 6e 65 65 64 20  cursors.** need 
5ca0: 74 6f 20 62 65 20 73 61 76 65 64 2e 20 20 49 74  to be saved.  It
5cb0: 20 63 61 6c 6c 73 20 6f 75 74 20 74 6f 20 73 61   calls out to sa
5cc0: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5cd0: 29 20 69 6e 20 74 68 65 20 28 75 6e 75 73 75 61  ) in the (unusua
5ce0: 6c 29 0a 2a 2a 20 65 76 65 6e 74 20 74 68 61 74  l).** event that
5cf0: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 20   cursors are in 
5d00: 6e 65 65 64 20 74 6f 20 62 65 69 6e 67 20 73 61  need to being sa
5d10: 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ved..*/.static i
5d20: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
5d30: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
5d40: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
5d50: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
5d60: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
5d70: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5d80: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
5d90: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5da0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
5db0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
5dc0: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
5dd0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
5de0: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
5df0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
5e00: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
5e10: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
5e20: 52 6f 6f 74 29 20 29 20 62 72 65 61 6b 3b 0a 20  Root) ) break;. 
5e30: 20 7d 0a 20 20 69 66 28 20 70 20 29 20 72 65 74   }.  if( p ) ret
5e40: 75 72 6e 20 73 61 76 65 43 75 72 73 6f 72 73 4f  urn saveCursorsO
5e50: 6e 4c 69 73 74 28 70 2c 20 69 52 6f 6f 74 2c 20  nList(p, iRoot, 
5e60: 70 45 78 63 65 70 74 29 3b 0a 20 20 69 66 28 20  pExcept);.  if( 
5e70: 70 45 78 63 65 70 74 20 29 20 70 45 78 63 65 70  pExcept ) pExcep
5e80: 74 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  t->curFlags &= ~
5e90: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20  BTCF_Multiple;. 
5ea0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5eb0: 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 68 65  K;.}../* This he
5ec0: 6c 70 65 72 20 72 6f 75 74 69 6e 65 20 74 6f 20  lper routine to 
5ed0: 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 20 64  saveAllCursors d
5ee0: 6f 65 73 20 74 68 65 20 61 63 74 75 61 6c 20 77  oes the actual w
5ef0: 6f 72 6b 20 6f 66 20 73 61 76 69 6e 67 0a 2a 2a  ork of saving.**
5f00: 20 74 68 65 20 63 75 72 73 6f 72 73 20 69 66 20   the cursors if 
5f10: 61 6e 64 20 77 68 65 6e 20 61 20 63 75 72 73 6f  and when a curso
5f20: 72 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  r is found that 
5f30: 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69 72 65  actually require
5f40: 73 20 73 61 76 69 6e 67 2e 0a 2a 2a 20 54 68 65  s saving..** The
5f50: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 69 73 20   common case is 
5f60: 74 68 61 74 20 6e 6f 20 63 75 72 73 6f 72 73 20  that no cursors 
5f70: 6e 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64  need to be saved
5f80: 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
5f90: 65 20 69 73 0a 2a 2a 20 62 72 6f 6b 65 6e 20 6f  e is.** broken o
5fa0: 75 74 20 66 72 6f 6d 20 69 74 73 20 63 61 6c 6c  ut from its call
5fb0: 65 72 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65  er to avoid unne
5fc0: 63 65 73 73 61 72 79 20 73 74 61 63 6b 20 70 6f  cessary stack po
5fd0: 69 6e 74 65 72 20 6d 6f 76 65 6d 65 6e 74 2e 0a  inter movement..
5fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5ff0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
6000: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
6010: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 2c 20  .  BtCursor *p, 
6020: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
6030: 69 72 73 74 20 63 75 72 73 6f 72 20 74 68 61 74  irst cursor that
6040: 20 6e 65 65 64 73 20 73 61 76 69 6e 67 20 2a 2f   needs saving */
6050: 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 20  .  Pgno iRoot,  
6060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
6070: 73 61 76 65 20 63 75 72 73 6f 72 20 77 69 74 68  save cursor with
6080: 20 74 68 69 73 20 69 52 6f 6f 74 2e 20 53 61 76   this iRoot. Sav
6090: 65 20 61 6c 6c 20 69 66 20 7a 65 72 6f 20 2a 2f  e all if zero */
60a0: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78  .  BtCursor *pEx
60b0: 63 65 70 74 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  cept    /* Do no
60c0: 74 20 73 61 76 65 20 74 68 69 73 20 63 75 72 73  t save this curs
60d0: 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64 6f 7b 0a 20  or */.){.  do{. 
60e0: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
60f0: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
6100: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
6110: 52 6f 6f 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Root) ){.      i
6120: 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55  f( p->eState==CU
6130: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 2d  RSOR_VALID || p-
6140: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
6150: 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20 20  SKIPNEXT ){.    
6160: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76      int rc = sav
6170: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6180: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
6190: 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
61a0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
61b0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
61c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
61d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
61e0: 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 20  ->iPage>0 );.   
61f0: 20 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73       btreeReleas
6200: 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28  eAllCursorPages(
6210: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
6220: 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
6230: 78 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 20  xt;.  }while( p 
6240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
6250: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6260: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
6270: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
6280: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6290: 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73  e3BtreeClearCurs
62a0: 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
62b0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  r){.  assert( cu
62c0: 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
62d0: 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  Cur) );.  sqlite
62e0: 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  3_free(pCur->pKe
62f0: 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79  y);.  pCur->pKey
6300: 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53   = 0;.  pCur->eS
6310: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6320: 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  VALID;.}../*.** 
6330: 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20  In this version 
6340: 6f 66 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20  of BtreeMoveto, 
6350: 70 4b 65 79 20 69 73 20 61 20 70 61 63 6b 65 64  pKey is a packed
6360: 20 69 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a   index record.**
6370: 20 73 75 63 68 20 61 73 20 69 73 20 67 65 6e 65   such as is gene
6380: 72 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  rated by the OP_
6390: 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64  MakeRecord opcod
63a0: 65 2e 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a  e.  Unpack the.*
63b0: 2a 20 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65  * record and the
63c0: 6e 20 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65  n call BtreeMove
63d0: 74 6f 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20  toUnpacked() to 
63e0: 64 6f 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a  do the work..*/.
63f0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
6400: 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
6410: 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a  or *pCur,     /*
6420: 20 43 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20   Cursor open on 
6430: 74 68 65 20 62 74 72 65 65 20 74 6f 20 62 65 20  the btree to be 
6440: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f  searched */.  co
6450: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
6460: 20 20 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20    /* Packed key 
6470: 69 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  if the btree is 
6480: 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36  an index */.  i6
6490: 34 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  4 nKey,         
64a0: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79    /* Integer key
64b0: 20 66 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69   for tables.  Si
64c0: 7a 65 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69  ze of pKey for i
64d0: 6e 64 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20  ndices */.  int 
64e0: 62 69 61 73 2c 20 20 20 20 20 20 20 20 20 20 20  bias,           
64f0: 2f 2a 20 42 69 61 73 20 73 65 61 72 63 68 20 74  /* Bias search t
6500: 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
6510: 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
6520: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
6530: 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
6540: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
6550: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
6560: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75          /* Statu
6570: 73 20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61  s code */.  Unpa
6580: 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78  ckedRecord *pIdx
6590: 4b 65 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b  Key;   /* Unpack
65a0: 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
65b0: 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32 30    char aSpace[20
65c0: 30 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0];          /* 
65d0: 54 65 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70  Temp space for p
65e0: 49 64 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69  IdxKey - to avoi
65f0: 64 20 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 20 20  d a malloc */.  
6600: 63 68 61 72 20 2a 70 46 72 65 65 20 3d 20 30 3b  char *pFree = 0;
6610: 0a 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ..  if( pKey ){.
6620: 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79      assert( nKey
6630: 3d 3d 28 69 36 34 29 28 69 6e 74 29 6e 4b 65 79  ==(i64)(int)nKey
6640: 20 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79 20   );.    pIdxKey 
6650: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c  = sqlite3VdbeAll
6660: 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  ocUnpackedRecord
6670: 28 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e  (.        pCur->
6680: 70 4b 65 79 49 6e 66 6f 2c 20 61 53 70 61 63 65  pKeyInfo, aSpace
6690: 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
66a0: 2c 20 26 70 46 72 65 65 0a 20 20 20 20 29 3b 0a  , &pFree.    );.
66b0: 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d      if( pIdxKey=
66c0: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
66d0: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
66e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
66f0: 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
6700: 3e 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29  >pKeyInfo, (int)
6710: 6e 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78  nKey, pKey, pIdx
6720: 4b 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49  Key);.    if( pI
6730: 64 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30  dxKey->nField==0
6740: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
6750: 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b  3DbFree(pCur->pK
6760: 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65  eyInfo->db, pFre
6770: 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
6780: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
6790: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  BKPT;.    }.  }e
67a0: 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  lse{.    pIdxKey
67b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   = 0;.  }.  rc =
67c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
67d0: 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72  etoUnpacked(pCur
67e0: 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c  , pIdxKey, nKey,
67f0: 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20   bias, pRes);.  
6800: 69 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20  if( pFree ){.   
6810: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70   sqlite3DbFree(p
6820: 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  Cur->pKeyInfo->d
6830: 62 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20  b, pFree);.  }. 
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6850: 2a 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65  *.** Restore the
6860: 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70   cursor to the p
6870: 6f 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69  osition it was i
6880: 6e 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74  n (or as close t
6890: 6f 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a  o as possible).*
68a0: 2a 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f  * when saveCurso
68b0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20  rPosition() was 
68c0: 63 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61  called. Note tha
68d0: 74 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65  t this call dele
68e0: 74 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65  tes the .** save
68f0: 64 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20  d position info 
6900: 73 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75  stored by saveCu
6910: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20  rsorPosition(), 
6920: 73 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a  so there can be.
6930: 2a 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65  ** at most one e
6940: 66 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65  ffective restore
6950: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
6960: 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68   call after each
6970: 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50   .** saveCursorP
6980: 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74  osition()..*/.st
6990: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65  atic int btreeRe
69a0: 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
69b0: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
69c0: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
69d0: 20 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20   int skipNext;. 
69e0: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f   assert( cursorO
69f0: 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72  wnsBtShared(pCur
6a00: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
6a10: 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52  Cur->eState>=CUR
6a20: 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
6a30: 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
6a40: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41  State==CURSOR_FA
6a50: 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULT ){.    retur
6a60: 6e 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  n pCur->skipNext
6a70: 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
6a80: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
6a90: 56 41 4c 49 44 3b 0a 20 20 72 63 20 3d 20 62 74  VALID;.  rc = bt
6aa0: 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20  reeMoveto(pCur, 
6ab0: 70 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72  pCur->pKey, pCur
6ac0: 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70  ->nKey, 0, &skip
6ad0: 4e 65 78 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  Next);.  if( rc=
6ae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6af0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6b00: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
6b10: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
6b20: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
6b30: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
6b40: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
6b50: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
6b60: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 70 43  NVALID );.    pC
6b70: 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20  ur->skipNext |= 
6b80: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  skipNext;.    if
6b90: 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74  ( pCur->skipNext
6ba0: 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
6bc0: 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53  {.      pCur->eS
6bd0: 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b  tate = CURSOR_SK
6be0: 49 50 4e 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20  IPNEXT;.    }.  
6bf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6c00: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
6c10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
6c20: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
6c30: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
6c40: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
6c50: 20 20 20 62 74 72 65 65 52 65 73 74 6f 72 65 43     btreeRestoreC
6c60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29  ursorPosition(p)
6c70: 20 3a 20 5c 0a 20 20 20 20 20 20 20 20 20 53 51   : \.         SQ
6c80: 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20  LITE_OK)../*.** 
6c90: 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65  Determine whethe
6ca0: 72 20 6f 72 20 6e 6f 74 20 61 20 63 75 72 73 6f  r or not a curso
6cb0: 72 20 68 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d  r has moved from
6cc0: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 77 68   the position wh
6cd0: 65 72 65 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61  ere.** it was la
6ce0: 73 74 20 70 6c 61 63 65 64 2c 20 6f 72 20 68 61  st placed, or ha
6cf0: 73 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 74  s been invalidat
6d00: 65 64 20 66 6f 72 20 61 6e 79 20 6f 74 68 65 72  ed for any other
6d10: 20 72 65 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73   reason..** Curs
6d20: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
6d30: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
6d40: 72 65 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 69  re pointing at i
6d50: 73 20 64 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a  s deleted out.**
6d60: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
6d70: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20  , for example.  
6d80: 43 75 72 73 6f 72 20 6d 69 67 68 74 20 61 6c 73  Cursor might als
6d90: 6f 20 6d 6f 76 65 20 69 66 20 61 20 62 74 72 65  o move if a btre
6da0: 65 0a 2a 2a 20 69 73 20 72 65 62 61 6c 61 6e 63  e.** is rebalanc
6db0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  ed..**.** Callin
6dc0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  g this routine w
6dd0: 69 74 68 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f  ith a NULL curso
6de0: 72 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  r pointer return
6df0: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55  s false..**.** U
6e00: 73 65 20 74 68 65 20 73 65 70 61 72 61 74 65 20  se the separate 
6e10: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
6e20: 6f 72 52 65 73 74 6f 72 65 28 29 20 72 6f 75 74  orRestore() rout
6e30: 69 6e 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ine to restore a
6e40: 20 63 75 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20   cursor.** back 
6e50: 74 6f 20 77 68 65 72 65 20 69 74 20 6f 75 67 68  to where it ough
6e60: 74 20 74 6f 20 62 65 20 69 66 20 74 68 69 73 20  t to be if this 
6e70: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6e80: 74 72 75 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  true..*/.int sql
6e90: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
6ea0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
6eb0: 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72   *pCur){.  retur
6ec0: 6e 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  n pCur->eState!=
6ed0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a  CURSOR_VALID;.}.
6ee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
6ef0: 69 6e 65 20 72 65 73 74 6f 72 65 73 20 61 20 63  ine restores a c
6f00: 75 72 73 6f 72 20 62 61 63 6b 20 74 6f 20 69 74  ursor back to it
6f10: 73 20 6f 72 69 67 69 6e 61 6c 20 70 6f 73 69 74  s original posit
6f20: 69 6f 6e 20 61 66 74 65 72 20 69 74 0a 2a 2a 20  ion after it.** 
6f30: 68 61 73 20 62 65 65 6e 20 6d 6f 76 65 64 20 62  has been moved b
6f40: 79 20 73 6f 6d 65 20 6f 75 74 73 69 64 65 20 61  y some outside a
6f50: 63 74 69 76 69 74 79 20 28 73 75 63 68 20 61 73  ctivity (such as
6f60: 20 61 20 62 74 72 65 65 20 72 65 62 61 6c 61 6e   a btree rebalan
6f70: 63 65 20 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68  ce or.** a row h
6f80: 61 76 69 6e 67 20 62 65 65 6e 20 64 65 6c 65 74  aving been delet
6f90: 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
6fa0: 72 20 74 68 65 20 63 75 72 73 6f 72 29 2e 20 20  r the cursor).  
6fb0: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
6fc0: 73 2c 20 74 68 65 20 2a 70 44 69 66 66 65 72 65  s, the *pDiffere
6fd0: 6e 74 52 6f 77 20 70 61 72 61 6d 65 74 65 72 20  ntRow parameter 
6fe0: 69 73 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  is false if the 
6ff0: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a  cursor is left.*
7000: 2a 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 65 78  * pointing at ex
7010: 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20 72  actly the same r
7020: 6f 77 2e 20 20 2a 70 44 69 66 66 65 72 6e 74 52  ow.  *pDifferntR
7030: 6f 77 20 69 73 20 74 68 65 20 72 6f 77 20 74 68  ow is the row th
7040: 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
7050: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 68 61 73 20  pointing to has 
7060: 62 65 65 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f  been deleted, fo
7070: 72 63 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  rcing the cursor
7080: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d   to point to som
7090: 65 0a 2a 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e  e.** nearby row.
70a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
70b0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
70c0: 62 65 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20  be called for a 
70d0: 63 75 72 73 6f 72 20 74 68 61 74 20 6a 75 73 74  cursor that just
70e0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55   returned.** TRU
70f0: 45 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 42 74  E from sqlite3Bt
7100: 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
7110: 64 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  d()..*/.int sqli
7120: 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
7130: 73 74 6f 72 65 28 42 74 43 75 72 73 6f 72 20 2a  store(BtCursor *
7140: 70 43 75 72 2c 20 69 6e 74 20 2a 70 44 69 66 66  pCur, int *pDiff
7150: 65 72 65 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74  erentRow){.  int
7160: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
7170: 70 43 75 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  pCur!=0 );.  ass
7180: 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
7190: 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
71a0: 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
71b0: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
71c0: 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20  pCur);.  if( rc 
71d0: 29 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65  ){.    *pDiffere
71e0: 6e 74 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72  ntRow = 1;.    r
71f0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
7200: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
7210: 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  !=CURSOR_VALID )
7220: 7b 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e  {.    *pDifferen
7230: 74 52 6f 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  tRow = 1;.  }els
7240: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7250: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30  Cur->skipNext==0
7260: 20 29 3b 0a 20 20 20 20 2a 70 44 69 66 66 65 72   );.    *pDiffer
7270: 65 6e 74 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a  entRow = 0;.  }.
7280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7290: 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
72a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
72b0: 4f 52 5f 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50  OR_HINTS./*.** P
72c0: 72 6f 76 69 64 65 20 68 69 6e 74 73 20 74 6f 20  rovide hints to 
72d0: 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65  the cursor.  The
72e0: 20 70 61 72 74 69 63 75 6c 61 72 20 68 69 6e 74   particular hint
72f0: 20 67 69 76 65 6e 20 28 61 6e 64 20 74 68 65 20   given (and the 
7300: 74 79 70 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62  type.** and numb
7310: 65 72 20 6f 66 20 74 68 65 20 76 61 72 61 72 67  er of the vararg
7320: 73 20 70 61 72 61 6d 65 74 65 72 73 29 20 69 73  s parameters) is
7330: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
7340: 68 65 20 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20  he eHintType.** 
7350: 70 61 72 61 6d 65 74 65 72 2e 20 20 53 65 65 20  parameter.  See 
7360: 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  the definitions 
7370: 6f 66 20 74 68 65 20 42 54 52 45 45 5f 48 49 4e  of the BTREE_HIN
7380: 54 5f 2a 20 6d 61 63 72 6f 73 20 66 6f 72 20 64  T_* macros for d
7390: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20  etails..*/.void 
73a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
73b0: 6f 72 48 69 6e 74 28 42 74 43 75 72 73 6f 72 20  orHint(BtCursor 
73c0: 2a 70 43 75 72 2c 20 69 6e 74 20 65 48 69 6e 74  *pCur, int eHint
73d0: 54 79 70 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a  Type, ...){.  /*
73e0: 20 55 73 65 64 20 6f 6e 6c 79 20 62 79 20 73 79   Used only by sy
73f0: 73 74 65 6d 20 74 68 61 74 20 73 75 62 73 74 69  stem that substi
7400: 74 75 74 65 20 74 68 65 69 72 20 6f 77 6e 20 73  tute their own s
7410: 74 6f 72 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f  torage engine */
7420: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
7430: 20 50 72 6f 76 69 64 65 20 66 6c 61 67 20 68 69   Provide flag hi
7440: 6e 74 73 20 74 6f 20 74 68 65 20 63 75 72 73 6f  nts to the curso
7450: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7460: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7470: 74 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72 20  tFlags(BtCursor 
7480: 2a 70 43 75 72 2c 20 75 6e 73 69 67 6e 65 64 20  *pCur, unsigned 
7490: 78 29 7b 0a 20 20 61 73 73 65 72 74 28 20 78 3d  x){.  assert( x=
74a0: 3d 42 54 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c  =BTREE_SEEK_EQ |
74b0: 7c 20 78 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c  | x==BTREE_BULKL
74c0: 4f 41 44 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20  OAD || x==0 );. 
74d0: 20 70 43 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78   pCur->hints = x
74e0: 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
74f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
7500: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  CUUM./*.** Given
7510: 20 61 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f   a page number o
7520: 66 20 61 20 72 65 67 75 6c 61 72 20 64 61 74 61  f a regular data
7530: 62 61 73 65 20 70 61 67 65 2c 20 72 65 74 75 72  base page, retur
7540: 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75  n the page.** nu
7550: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 70 6f 69  mber for the poi
7560: 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 74 68  nter-map page th
7570: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
7580: 65 6e 74 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a  entry for the.**
7590: 20 69 6e 70 75 74 20 70 61 67 65 20 6e 75 6d 62   input page numb
75a0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
75b0: 20 30 20 28 6e 6f 74 20 61 20 76 61 6c 69 64 20   0 (not a valid 
75c0: 70 61 67 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d  page) for pgno==
75d0: 31 20 73 69 6e 63 65 20 74 68 65 72 65 20 69 73  1 since there is
75e0: 0a 2a 2a 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d  .** no pointer m
75f0: 61 70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ap associated wi
7600: 74 68 20 70 61 67 65 20 31 2e 20 20 54 68 65 20  th page 1.  The 
7610: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 20  integrity_check 
7620: 6c 6f 67 69 63 0a 2a 2a 20 72 65 71 75 69 72 65  logic.** require
7630: 73 20 74 68 61 74 20 70 74 72 6d 61 70 50 61 67  s that ptrmapPag
7640: 65 6e 6f 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a  eno(*,1)!=1..*/.
7650: 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74 72 6d  static Pgno ptrm
7660: 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61 72 65  apPageno(BtShare
7670: 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e  d *pBt, Pgno pgn
7680: 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 73  o){.  int nPages
7690: 50 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 50 67  PerMapPage;.  Pg
76a0: 6e 6f 20 69 50 74 72 4d 61 70 2c 20 72 65 74 3b  no iPtrMap, ret;
76b0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
76c0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
76d0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
76e0: 66 28 20 70 67 6e 6f 3c 32 20 29 20 72 65 74 75  f( pgno<2 ) retu
76f0: 72 6e 20 30 3b 0a 20 20 6e 50 61 67 65 73 50 65  rn 0;.  nPagesPe
7700: 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74 2d  rMapPage = (pBt-
7710: 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31  >usableSize/5)+1
7720: 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28 70  ;.  iPtrMap = (p
7730: 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65 72  gno-2)/nPagesPer
7740: 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20 3d  MapPage;.  ret =
7750: 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65 73   (iPtrMap*nPages
7760: 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32 3b  PerMapPage) + 2;
7770: 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45 4e   .  if( ret==PEN
7780: 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
7790: 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b  Bt) ){.    ret++
77a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
77b0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  et;.}../*.** Wri
77c0: 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  te an entry into
77d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
77e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
77f0: 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68 65  tine updates the
7800: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
7810: 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d 62  ry for page numb
7820: 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74  er 'key'.** so t
7830: 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20 74  hat it maps to t
7840: 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64 20  ype 'eType' and 
7850: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
7860: 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a  er 'pgno'..**.**
7870: 20 49 66 20 2a 70 52 43 20 69 73 20 69 6e 69 74   If *pRC is init
7880: 69 61 6c 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28  ially non-zero (
7890: 6e 6f 6e 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74  non-SQLITE_OK) t
78a0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
78b0: 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20   is.** a no-op. 
78c0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
78d0: 75 72 73 2c 20 74 68 65 20 61 70 70 72 6f 70 72  urs, the appropr
78e0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
78f0: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
7900: 74 6f 20 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74  to *pRC..*/.stat
7910: 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70 50 75  ic void ptrmapPu
7920: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
7930: 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54   Pgno key, u8 eT
7940: 79 70 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74  ype, Pgno parent
7950: 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44  , int *pRC){.  D
7960: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
7970: 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20   /* The pointer 
7980: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  map page */.  u8
7990: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
79a0: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
79b0: 61 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e  ap data */.  Pgn
79c0: 6f 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f  o iPtrmap;     /
79d0: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
79e0: 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  p page number */
79f0: 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20  .  int offset;  
7a00: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
7a10: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  n pointer map pa
7a20: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ge */.  int rc; 
7a30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
7a40: 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75  urn code from su
7a50: 62 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20  bfunctions */.. 
7a60: 20 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75   if( *pRC ) retu
7a70: 72 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rn;..  assert( s
7a80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7a90: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
7aa0: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
7ab0: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
7ac0: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
7ad0: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
7ae0: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7af0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
7b00: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
7b10: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
7b20: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
7b30: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
7b40: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
7b50: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70  key==0 ){.    *p
7b60: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
7b70: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  UPT_BKPT;.    re
7b80: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72  turn;.  }.  iPtr
7b90: 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47  map = PTRMAP_PAG
7ba0: 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20  ENO(pBt, key);. 
7bb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
7bc0: 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65  erGet(pBt->pPage
7bd0: 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62  r, iPtrmap, &pDb
7be0: 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
7bf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
7c00: 0a 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a  .    *pRC = rc;.
7c10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
7c20: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
7c30: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
7c40: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28  map, key);.  if(
7c50: 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20   offset<0 ){.   
7c60: 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45 5f 43   *pRC = SQLITE_C
7c70: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7c80: 20 67 6f 74 6f 20 70 74 72 6d 61 70 5f 65 78 69   goto ptrmap_exi
7c90: 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
7ca0: 20 6f 66 66 73 65 74 20 3c 3d 20 28 69 6e 74 29   offset <= (int)
7cb0: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
7cc0: 35 20 29 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d  5 );.  pPtrmap =
7cd0: 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 50 61   (u8 *)sqlite3Pa
7ce0: 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
7cf0: 67 65 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  ge);..  if( eTyp
7d00: 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e!=pPtrmap[offse
7d10: 74 5d 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26  t] || get4byte(&
7d20: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
7d30: 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20  ])!=parent ){.  
7d40: 20 20 54 52 41 43 45 28 28 22 50 54 52 4d 41 50    TRACE(("PTRMAP
7d50: 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e 28 25 64  _UPDATE: %d->(%d
7d60: 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54  ,%d)\n", key, eT
7d70: 79 70 65 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20  ype, parent));. 
7d80: 20 20 20 2a 70 52 43 3d 20 72 63 20 3d 20 73 71     *pRC= rc = sq
7d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
7da0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
7db0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7dc0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
7dd0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
7de0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
7df0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
7e00: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
7e10: 20 20 7d 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f    }.  }..ptrmap_
7e20: 65 78 69 74 3a 0a 20 20 73 71 6c 69 74 65 33 50  exit:.  sqlite3P
7e30: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
7e40: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  e);.}../*.** Rea
7e50: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
7e60: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
7e70: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
7e80: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
7e90: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
7ea0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
7eb0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
7ec0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
7ed0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
7ee0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
7ef0: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
7f00: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
7f10: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
7f20: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
7f30: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
7f40: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
7f50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
7f60: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
7f70: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
7f80: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
7f90: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
7fa0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
7fb0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
7fc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
7fd0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
7fe0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
7ff0: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
8000: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
8010: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
8020: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
8030: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
8040: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
8050: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
8060: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
8070: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8080: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8090: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
80a0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
80b0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
80c0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
80d0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
80e0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
80f0: 26 70 44 62 50 61 67 65 2c 20 30 29 3b 0a 20 20  &pDbPage, 0);.  
8100: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
8110: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
8120: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
8130: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
8140: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
8150: 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d  .  offset = PTRM
8160: 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74  AP_PTROFFSET(iPt
8170: 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66  rmap, key);.  if
8180: 28 20 6f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20  ( offset<0 ){.  
8190: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
81a0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
81b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
81c0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
81d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
81e0: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
81f0: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
8200: 20 20 61 73 73 65 72 74 28 20 70 45 54 79 70 65    assert( pEType
8210: 21 3d 30 20 29 3b 0a 20 20 2a 70 45 54 79 70 65  !=0 );.  *pEType
8220: 20 3d 20 70 50 74 72 6d 61 70 5b 6f 66 66 73 65   = pPtrmap[offse
8230: 74 5d 3b 0a 20 20 69 66 28 20 70 50 67 6e 6f 20  t];.  if( pPgno 
8240: 29 20 2a 70 50 67 6e 6f 20 3d 20 67 65 74 34 62  ) *pPgno = get4b
8250: 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66  yte(&pPtrmap[off
8260: 73 65 74 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69  set+1]);..  sqli
8270: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
8280: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 2a 70  bPage);.  if( *p
8290: 45 54 79 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79  EType<1 || *pETy
82a0: 70 65 3e 35 20 29 20 72 65 74 75 72 6e 20 53 51  pe>5 ) return SQ
82b0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
82c0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  T;.  return SQLI
82d0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20  TE_OK;.}..#else 
82e0: 2f 2a 20 69 66 20 64 65 66 69 6e 65 64 20 53 51  /* if defined SQ
82f0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
8300: 43 55 55 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e  CUUM */.  #defin
8310: 65 20 70 74 72 6d 61 70 50 75 74 28 77 2c 78 2c  e ptrmapPut(w,x,
8320: 79 2c 7a 2c 72 63 29 0a 20 20 23 64 65 66 69 6e  y,z,rc).  #defin
8330: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
8340: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
8350: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
8360: 75 74 4f 76 66 6c 50 74 72 28 78 2c 20 79 2c 20  utOvflPtr(x, y, 
8370: 72 63 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  rc).#endif../*.*
8380: 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20  * Given a btree 
8390: 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20  page and a cell 
83a0: 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74  index (0 means t
83b0: 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e  he first cell on
83c0: 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20  .** the page, 1 
83d0: 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64  means the second
83e0: 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f   cell, and so fo
83f0: 72 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f  rth) return a po
8400: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
8410: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a  cell content..**
8420: 0a 2a 2a 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  .** findCellPast
8430: 50 74 72 28 29 20 64 6f 65 73 20 74 68 65 20 73  Ptr() does the s
8440: 61 6d 65 20 65 78 63 65 70 74 20 69 74 20 73 6b  ame except it sk
8450: 69 70 73 20 70 61 73 74 20 74 68 65 20 69 6e 69  ips past the ini
8460: 74 69 61 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63  tial.** 4-byte c
8470: 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 66 6f 75  hild pointer fou
8480: 6e 64 20 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70  nd on interior p
8490: 61 67 65 73 2c 20 69 66 20 74 68 65 72 65 20 69  ages, if there i
84a0: 73 20 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  s one..**.** Thi
84b0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
84c0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
84d0: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
84e0: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
84f0: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
8500: 6e 64 43 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20  ndCell(P,I) \.  
8510: 28 28 50 29 2d 3e 61 44 61 74 61 20 2b 20 28 28  ((P)->aData + ((
8520: 50 29 2d 3e 6d 61 73 6b 50 61 67 65 20 26 20 67  P)->maskPage & g
8530: 65 74 32 62 79 74 65 41 6c 69 67 6e 65 64 28 26  et2byteAligned(&
8540: 28 50 29 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a  (P)->aCellIdx[2*
8550: 28 49 29 5d 29 29 29 0a 23 64 65 66 69 6e 65 20  (I)]))).#define 
8560: 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28  findCellPastPtr(
8570: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
8580: 44 61 74 61 4f 66 73 74 20 2b 20 28 28 50 29 2d  DataOfst + ((P)-
8590: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
85a0: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
85b0: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
85c0: 5d 29 29 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ]))).../*.** Thi
85d0: 73 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c  s is common tail
85e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f 72 20   processing for 
85f0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8600: 72 28 29 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65  r() and.** btree
8610: 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65  ParseCellPtrInde
8620: 78 28 29 20 66 6f 72 20 74 68 65 20 63 61 73 65  x() for the case
8630: 20 77 68 65 6e 20 74 68 65 20 63 65 6c 6c 20 64   when the cell d
8640: 6f 65 73 20 6e 6f 74 20 66 69 74 20 65 6e 74 69  oes not fit enti
8650: 72 65 6c 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e  rely.** on a sin
8660: 67 6c 65 20 42 2d 74 72 65 65 20 70 61 67 65 2e  gle B-tree page.
8670: 20 20 4d 61 6b 65 20 6e 65 63 65 73 73 61 72 79    Make necessary
8680: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20   adjustments to 
8690: 74 68 65 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20  the CellInfo.** 
86a0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
86b0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
86c0: 4c 49 4e 45 20 76 6f 69 64 20 62 74 72 65 65 50  LINE void btreeP
86d0: 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69  arseCellAdjustSi
86e0: 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20  zeForOverflow(. 
86f0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8700: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8710: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8720: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8730: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8740: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8750: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8760: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8770: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8780: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8790: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a  cture */.){.  /*
87a0: 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61 64 20   If the payload 
87b0: 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d  will not fit com
87c0: 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c  pletely on the l
87d0: 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20 68 61  ocal page, we ha
87e0: 76 65 0a 20 20 2a 2a 20 74 6f 20 64 65 63 69 64  ve.  ** to decid
87f0: 65 20 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 74  e how much to st
8800: 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20  ore locally and 
8810: 68 6f 77 20 6d 75 63 68 20 74 6f 20 73 70 69 6c  how much to spil
8820: 6c 20 6f 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72  l onto.  ** over
8830: 66 6c 6f 77 20 70 61 67 65 73 2e 20 20 54 68 65  flow pages.  The
8840: 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20   strategy is to 
8850: 6d 69 6e 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f  minimize the amo
8860: 75 6e 74 20 6f 66 20 75 6e 75 73 65 64 0a 20 20  unt of unused.  
8870: 2a 2a 20 73 70 61 63 65 20 6f 6e 20 6f 76 65 72  ** space on over
8880: 66 6c 6f 77 20 70 61 67 65 73 20 77 68 69 6c 65  flow pages while
8890: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 61 6d 6f   keeping the amo
88a0: 75 6e 74 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f  unt of local sto
88b0: 72 61 67 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74  rage.  ** in bet
88c0: 77 65 65 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e  ween minLocal an
88d0: 64 20 6d 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a  d maxLocal..  **
88e0: 0a 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20  .  ** Warning:  
88f0: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79  changing the way
8900: 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61   overflow payloa
8910: 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  d is distributed
8920: 20 69 6e 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79   in any.  ** way
8930: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
8940: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
8950: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a  file format..  *
8960: 2f 0a 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c  /.  int minLocal
8970: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d  ;  /* Minimum am
8980: 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20  ount of payload 
8990: 68 65 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a  held locally */.
89a0: 20 20 69 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20    int maxLocal; 
89b0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75   /* Maximum amou
89c0: 6e 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65  nt of payload he
89d0: 6c 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20  ld locally */.  
89e0: 69 6e 74 20 73 75 72 70 6c 75 73 3b 20 20 20 2f  int surplus;   /
89f0: 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  * Overflow paylo
8a00: 61 64 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ad available for
8a10: 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 20 2a   local storage *
8a20: 2f 0a 0a 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20  /..  minLocal = 
8a30: 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b  pPage->minLocal;
8a40: 0a 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50  .  maxLocal = pP
8a50: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  age->maxLocal;. 
8a60: 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f   surplus = minLo
8a70: 63 61 6c 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50  cal + (pInfo->nP
8a80: 61 79 6c 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61  ayload - minLoca
8a90: 6c 29 25 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  l)%(pPage->pBt->
8aa0: 75 73 61 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20  usableSize-4);. 
8ab0: 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70 6c   testcase( surpl
8ac0: 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a  us==maxLocal );.
8ad0: 20 20 74 65 73 74 63 61 73 65 28 20 73 75 72 70    testcase( surp
8ae0: 6c 75 73 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20  lus==maxLocal+1 
8af0: 29 3b 0a 20 20 69 66 28 20 73 75 72 70 6c 75 73  );.  if( surplus
8b00: 20 3c 3d 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a   <= maxLocal ){.
8b10: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61      pInfo->nLoca
8b20: 6c 20 3d 20 28 75 31 36 29 73 75 72 70 6c 75 73  l = (u16)surplus
8b30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
8b40: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8b50: 75 31 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  u16)minLocal;.  
8b60: 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  }.  pInfo->nSize
8b70: 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f 2d   = (u16)(&pInfo-
8b80: 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f 2d  >pPayload[pInfo-
8b90: 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c 6c  >nLocal] - pCell
8ba0: 29 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) + 4;.}../*.** 
8bb0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
8bc0: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
8bd0: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
8be0: 65 20 4d 65 6d 50 61 67 65 2e 78 50 61 72 73 65  e MemPage.xParse
8bf0: 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Cell().** method
8c00: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ..**.** Parse a 
8c10: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
8c20: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
8c30: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
8c40: 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 62 74 72  cture..**.** btr
8c50: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8c60: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 74 61 62          =>   tab
8c70: 6c 65 20 62 74 72 65 65 20 6c 65 61 66 20 6e 6f  le btree leaf no
8c80: 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73  des.** btreePars
8c90: 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f 61 64 28 29  eCellNoPayload()
8ca0: 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74 72    =>   table btr
8cb0: 65 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  ee internal node
8cc0: 73 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43  s.** btreeParseC
8cd0: 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 20 20  ellPtrIndex()   
8ce0: 3d 3e 20 20 20 69 6e 64 65 78 20 62 74 72 65 65  =>   index btree
8cf0: 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65   nodes.**.** The
8d00: 72 65 20 69 73 20 61 6c 73 6f 20 61 20 77 72 61  re is also a wra
8d10: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 62 74  pper function bt
8d20: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
8d30: 68 61 74 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a  hat works for.**
8d40: 20 61 6c 6c 20 4d 65 6d 50 61 67 65 20 74 79 70   all MemPage typ
8d50: 65 73 20 61 6e 64 20 74 68 61 74 20 72 65 66 65  es and that refe
8d60: 72 65 6e 63 65 73 20 74 68 65 20 63 65 6c 6c 20  rences the cell 
8d70: 62 79 20 69 6e 64 65 78 20 72 61 74 68 65 72 20  by index rather 
8d80: 74 68 61 6e 0a 2a 2a 20 62 79 20 70 6f 69 6e 74  than.** by point
8d90: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
8da0: 69 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  id btreeParseCel
8db0: 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 0a 20  lPtrNoPayload(. 
8dc0: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
8dd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
8de0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
8df0: 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43  cell */.  u8 *pC
8e00: 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ell,            
8e10: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
8e20: 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a  the cell text. *
8e30: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
8e40: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
8e50: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
8e60: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  cture */.){.  as
8e70: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
8e80: 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
8e90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
8ea0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8eb0: 6c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 61 73 73  leaf==0 );.  ass
8ec0: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
8ed0: 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b 0a 23  dPtrSize==4 );.#
8ee0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
8ef0: 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  BUG.  UNUSED_PAR
8f00: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
8f10: 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d 3e 6e  endif.  pInfo->n
8f20: 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74 56 61  Size = 4 + getVa
8f30: 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d 2c 20  rint(&pCell[4], 
8f40: 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b  (u64*)&pInfo->nK
8f50: 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50  ey);.  pInfo->nP
8f60: 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 70 49  ayload = 0;.  pI
8f70: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 30 3b  nfo->nLocal = 0;
8f80: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
8f90: 61 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ad = 0;.  return
8fa0: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
8fb0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8fc0: 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  r(.  MemPage *pP
8fd0: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8fe0: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8ff0: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
9000: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
9010: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
9020: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
9030: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
9040: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
9050: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
9060: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
9070: 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20    u8 *pIter;    
9080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
9090: 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67   scanning throug
90a0: 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32  h pCell */.  u32
90b0: 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20   nPayload;      
90c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
90d0: 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20  f bytes of cell 
90e0: 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 36 34  payload */.  u64
90f0: 20 69 4b 65 79 3b 20 20 20 20 20 20 20 20 20 20   iKey;          
9100: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 65       /* Extracte
9110: 64 20 4b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 0a  d Key value */..
9120: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9130: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
9140: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
9150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9160: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70  ge->leaf==0 || p
9170: 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b  Page->leaf==1 );
9180: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9190: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a  ->intKeyLeaf );.
91a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
91b0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30  >childPtrSize==0
91c0: 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43   );.  pIter = pC
91d0: 65 6c 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  ell;..  /* The n
91e0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
91f0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
9200: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
9210: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9220: 72 69 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50  rint32(pIter, nP
9230: 61 79 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20  ayload);.  **.  
9240: 2a 2a 20 54 68 65 20 63 6f 64 65 20 69 73 20 69  ** The code is i
9250: 6e 6c 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20  nlined to avoid 
9260: 61 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e  a function call.
9270: 0a 20 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  .  */.  nPayload
9280: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9290: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
92a0: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
92b0: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
92c0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
92d0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
92e0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
92f0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9300: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9310: 20 20 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74     }while( (*pIt
9320: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9330: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9340: 20 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20   pIter++;..  /* 
9350: 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f  The next block o
9360: 66 20 63 6f 64 65 20 69 73 20 65 71 75 69 76 61  f code is equiva
9370: 6c 65 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20  lent to:.  **.  
9380: 2a 2a 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20  **     pIter += 
9390: 67 65 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c  getVarint(pIter,
93a0: 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e   (u64*)&pInfo->n
93b0: 4b 65 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20  Key);.  **.  ** 
93c0: 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69  The code is inli
93d0: 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66  ned to avoid a f
93e0: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20  unction call..  
93f0: 2a 2f 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74  */.  iKey = *pIt
9400: 65 72 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d  er;.  if( iKey>=
9410: 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  0x80 ){.    u8 *
9420: 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d  pEnd = &pIter[7]
9430: 3b 0a 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78  ;.    iKey &= 0x
9440: 37 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  7f;.    while(1)
9450: 7b 0a 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28  {.      iKey = (
9460: 69 4b 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70  iKey<<7) | (*++p
9470: 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20  Iter & 0x7f);.  
9480: 20 20 20 20 69 66 28 20 28 2a 70 49 74 65 72 29      if( (*pIter)
9490: 3c 30 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20  <0x80 ) break;. 
94a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d       if( pIter>=
94b0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  pEnd ){.        
94c0: 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29  iKey = (iKey<<8)
94d0: 20 7c 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20   | *++pIter;.   
94e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
94f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9500: 70 49 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66  pIter++;..  pInf
9510: 6f 2d 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a  o->nKey = *(i64*
9520: 29 26 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d  )&iKey;.  pInfo-
9530: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
9540: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70  load;.  pInfo->p
9550: 50 61 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b  Payload = pIter;
9560: 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e 50 61  .  testcase( nPa
9570: 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61  yload==pPage->ma
9580: 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74  xLocal );.  test
9590: 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d  case( nPayload==
95a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b  pPage->maxLocal+
95b0: 31 20 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c  1 );.  if( nPayl
95c0: 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad<=pPage->maxL
95d0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ocal ){.    /* T
95e0: 68 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79  his is the (easy
95f0: 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  ) common case wh
9600: 65 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70  ere the entire p
9610: 61 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20  ayload fits.    
9620: 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ** on the local 
9630: 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c  page.  No overfl
9640: 6f 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ow is required..
9650: 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f      */.    pInfo
9660: 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f  ->nSize = nPaylo
9670: 61 64 20 2b 20 28 75 31 36 29 28 70 49 74 65 72  ad + (u16)(pIter
9680: 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69   - pCell);.    i
9690: 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c  f( pInfo->nSize<
96a0: 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65  4 ) pInfo->nSize
96b0: 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d   = 4;.    pInfo-
96c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e  >nLocal = (u16)n
96d0: 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65  Payload;.  }else
96e0: 7b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  {.    btreeParse
96f0: 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f  CellAdjustSizeFo
9700: 72 4f 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c  rOverflow(pPage,
9710: 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a   pCell, pInfo);.
9720: 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69    }.}.static voi
9730: 64 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  d btreeParseCell
9740: 50 74 72 49 6e 64 65 78 28 0a 20 20 4d 65 6d 50  PtrIndex(.  MemP
9750: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
9760: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
9770: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
9780: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
9790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
97a0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
97b0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
97c0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
97d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
97e0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
97f0: 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 70 49 74   */.){.  u8 *pIt
9800: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
9810: 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e 69 6e 67   /* For scanning
9820: 20 74 68 72 6f 75 67 68 20 70 43 65 6c 6c 20 2a   through pCell *
9830: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
9840: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
9850: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
9860: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
9870: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
9880: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
9890: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
98a0: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
98b0: 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c  pPage->leaf==0 |
98c0: 7c 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d 3d 31  | pPage->leaf==1
98d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
98e0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d  age->intKeyLeaf=
98f0: 3d 30 20 29 3b 0a 20 20 70 49 74 65 72 20 3d 20  =0 );.  pIter = 
9900: 70 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63  pCell + pPage->c
9910: 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e  hildPtrSize;.  n
9920: 50 61 79 6c 6f 61 64 20 3d 20 2a 70 49 74 65 72  Payload = *pIter
9930: 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64  ;.  if( nPayload
9940: 3e 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 75 38  >=0x80 ){.    u8
9950: 20 2a 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b   *pEnd = &pIter[
9960: 38 5d 3b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  8];.    nPayload
9970: 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64 6f   &= 0x7f;.    do
9980: 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64  {.      nPayload
9990: 20 3d 20 28 6e 50 61 79 6c 6f 61 64 3c 3c 37 29   = (nPayload<<7)
99a0: 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26 20 30   | (*++pIter & 0
99b0: 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  x7f);.    }while
99c0: 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78 38 30  ( *(pIter)>=0x80
99d0: 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29   && pIter<pEnd )
99e0: 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b 2b 3b  ;.  }.  pIter++;
99f0: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79 20 3d  .  pInfo->nKey =
9a00: 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e   nPayload;.  pIn
9a10: 66 6f 2d 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e  fo->nPayload = n
9a20: 50 61 79 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f  Payload;.  pInfo
9a30: 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 70 49 74  ->pPayload = pIt
9a40: 65 72 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  er;.  testcase( 
9a50: 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65 2d  nPayload==pPage-
9a60: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  >maxLocal );.  t
9a70: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9a80: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9a90: 61 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 50  al+1 );.  if( nP
9aa0: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
9ab0: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
9ac0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
9ad0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
9ae0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
9af0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
9b00: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
9b10: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
9b20: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
9b30: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  d..    */.    pI
9b40: 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 50 61  nfo->nSize = nPa
9b50: 79 6c 6f 61 64 20 2b 20 28 75 31 36 29 28 70 49  yload + (u16)(pI
9b60: 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20  ter - pCell);.  
9b70: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 53 69    if( pInfo->nSi
9b80: 7a 65 3c 34 20 29 20 70 49 6e 66 6f 2d 3e 6e 53  ze<4 ) pInfo->nS
9b90: 69 7a 65 20 3d 20 34 3b 0a 20 20 20 20 70 49 6e  ize = 4;.    pIn
9ba0: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
9bb0: 36 29 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65  6)nPayload;.  }e
9bc0: 6c 73 65 7b 0a 20 20 20 20 62 74 72 65 65 50 61  lse{.    btreePa
9bd0: 72 73 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a  rseCellAdjustSiz
9be0: 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28 70 50 61  eForOverflow(pPa
9bf0: 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49 6e 66 6f  ge, pCell, pInfo
9c00: 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  );.  }.}.static 
9c10: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
9c20: 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
9c30: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
9c40: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
9c50: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
9c60: 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20 20 20 20  int iCell,      
9c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
9c80: 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46 69 72 73  ell index.  Firs
9c90: 74 20 63 65 6c 6c 20 69 73 20 30 20 2a 2f 0a 20  t cell is 0 */. 
9ca0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
9cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
9cc0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
9cd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50 61 67 65  re */.){.  pPage
9ce0: 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61  ->xParseCell(pPa
9cf0: 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ge, findCell(pPa
9d00: 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70 49 6e 66  ge, iCell), pInf
9d10: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  o);.}../*.** The
9d20: 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
9d30: 6e 65 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  nes are implemen
9d40: 74 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d  tations of the M
9d50: 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53 69 7a 65  emPage.xCellSize
9d60: 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a 2a  .** method..**.*
9d70: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f  * Compute the to
9d80: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  tal number of by
9d90: 74 65 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20  tes that a Cell 
9da0: 6e 65 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c  needs in the cel
9db0: 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f  l.** data area o
9dc0: 66 20 74 68 65 20 62 74 72 65 65 2d 70 61 67 65  f the btree-page
9dd0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75  .  The return nu
9de0: 6d 62 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68  mber includes th
9df0: 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68  e cell.** data h
9e00: 65 61 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f  eader and the lo
9e10: 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74  cal payload, but
9e20: 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f   not any overflo
9e30: 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65  w page or.** the
9e40: 20 73 70 61 63 65 20 75 73 65 64 20 62 79 20 74   space used by t
9e50: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e  he cell pointer.
9e60: 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69 7a 65 50  .**.** cellSizeP
9e70: 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 20  trNoPayload()   
9e80: 20 3d 3e 20 20 20 74 61 62 6c 65 20 69 6e 74 65   =>   table inte
9e90: 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20 63 65  rnal nodes.** ce
9ea0: 6c 6c 53 69 7a 65 50 74 72 28 29 20 20 20 20 20  llSizePtr()     
9eb0: 20 20 20 20 20 20 20 20 3d 3e 20 20 20 61 6c 6c          =>   all
9ec0: 20 69 6e 64 65 78 20 6e 6f 64 65 73 20 26 20 74   index nodes & t
9ed0: 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a  able leaf nodes.
9ee0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  */.static u16 ce
9ef0: 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d 50 61 67  llSizePtr(MemPag
9f00: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
9f10: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
9f20: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70 50 61 67  r = pCell + pPag
9f30: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
9f40: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9f50: 6f 76 65 72 20 62 79 74 65 73 20 6f 66 20 70 43  over bytes of pC
9f60: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e  ell */.  u8 *pEn
9f70: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66 6f    /* End mark fo
9fa0: 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  r a varint */.  
9fb0: 75 33 32 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  u32 nSize;      
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
9fe0: 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e   value to return
9ff0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
a000: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68  TE_DEBUG.  /* Th
a010: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
a020: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
a030: 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20  n should always 
a040: 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20  be the same as. 
a050: 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66   ** the (CellInf
a060: 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66  o.nSize) value f
a070: 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20  ound by doing a 
a080: 66 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68  full parse of th
a090: 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20  e.  ** cell. If 
a0a0: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20  SQLITE_DEBUG is 
a0b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
a0c0: 72 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74  rt() at the bott
a0d0: 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20  om of.  ** this 
a0e0: 66 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65  function verifie
a0f0: 73 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61  s that this inva
a100: 72 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f  riant is not vio
a110: 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c  lated. */.  Cell
a120: 49 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a  Info debuginfo;.
a130: 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
a140: 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
a150: 2c 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23  , &debuginfo);.#
a160: 65 6e 64 69 66 0a 0a 20 20 6e 53 69 7a 65 20 3d  endif..  nSize =
a170: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
a180: 53 69 7a 65 3e 3d 30 78 38 30 20 29 7b 0a 20 20  Size>=0x80 ){.  
a190: 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72 5b    pEnd = &pIter[
a1a0: 38 5d 3b 0a 20 20 20 20 6e 53 69 7a 65 20 26 3d  8];.    nSize &=
a1b0: 20 30 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20   0x7f;.    do{. 
a1c0: 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 6e 53       nSize = (nS
a1d0: 69 7a 65 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  ize<<7) | (*++pI
a1e0: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
a1f0: 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74 65 72   }while( *(pIter
a200: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
a210: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
a220: 49 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 70 50  Iter++;.  if( pP
a230: 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
a240: 20 20 20 2f 2a 20 70 49 74 65 72 20 6e 6f 77 20     /* pIter now 
a250: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 36 34  points at the 64
a260: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 6b 65 79  -bit integer key
a270: 20 76 61 6c 75 65 2c 20 61 20 76 61 72 69 61 62   value, a variab
a280: 6c 65 20 6c 65 6e 67 74 68 20 0a 20 20 20 20 2a  le length .    *
a290: 2a 20 69 6e 74 65 67 65 72 2e 20 54 68 65 20 66  * integer. The f
a2a0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6d  ollowing block m
a2b0: 6f 76 65 73 20 70 49 74 65 72 20 74 6f 20 70 6f  oves pIter to po
a2c0: 69 6e 74 20 61 74 20 74 68 65 20 66 69 72 73 74  int at the first
a2d0: 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 70 61 73   byte.    ** pas
a2e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
a2f0: 20 6b 65 79 20 76 61 6c 75 65 2e 20 2a 2f 0a 20   key value. */. 
a300: 20 20 20 70 45 6e 64 20 3d 20 26 70 49 74 65 72     pEnd = &pIter
a310: 5b 39 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  [9];.    while( 
a320: 28 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20  (*pIter++)&0x80 
a330: 26 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b  && pIter<pEnd );
a340: 0a 20 20 7d 0a 20 20 74 65 73 74 63 61 73 65 28  .  }.  testcase(
a350: 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d   nSize==pPage->m
a360: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
a370: 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50  tcase( nSize==pP
a380: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
a390: 29 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3c 3d  );.  if( nSize<=
a3a0: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
a3b0: 29 7b 0a 20 20 20 20 6e 53 69 7a 65 20 2b 3d 20  ){.    nSize += 
a3c0: 28 75 33 32 29 28 70 49 74 65 72 20 2d 20 70 43  (u32)(pIter - pC
a3d0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  ell);.    if( nS
a3e0: 69 7a 65 3c 34 20 29 20 6e 53 69 7a 65 20 3d 20  ize<4 ) nSize = 
a3f0: 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  4;.  }else{.    
a400: 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  int minLocal = p
a410: 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a  Page->minLocal;.
a420: 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c      nSize = minL
a430: 6f 63 61 6c 20 2b 20 28 6e 53 69 7a 65 20 2d 20  ocal + (nSize - 
a440: 6d 69 6e 4c 6f 63 61 6c 29 20 25 20 28 70 50 61  minLocal) % (pPa
a450: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
a460: 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65  ize - 4);.    te
a470: 73 74 63 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70  stcase( nSize==p
a480: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
a490: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
a4a0: 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e 6d 61  nSize==pPage->ma
a4b0: 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20 20 20  xLocal+1 );.    
a4c0: 69 66 28 20 6e 53 69 7a 65 3e 70 50 61 67 65 2d  if( nSize>pPage-
a4d0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  >maxLocal ){.   
a4e0: 20 20 20 6e 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f     nSize = minLo
a4f0: 63 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  cal;.    }.    n
a500: 53 69 7a 65 20 2b 3d 20 34 20 2b 20 28 75 31 36  Size += 4 + (u16
a510: 29 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29  )(pIter - pCell)
a520: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
a530: 6e 53 69 7a 65 3d 3d 64 65 62 75 67 69 6e 66 6f  nSize==debuginfo
a540: 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55 50  .nSize || CORRUP
a550: 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e  T_DB );.  return
a560: 20 28 75 31 36 29 6e 53 69 7a 65 3b 0a 7d 0a 73   (u16)nSize;.}.s
a570: 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69  tatic u16 cellSi
a580: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 4d  zePtrNoPayload(M
a590: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
a5a0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20  8 *pCell){.  u8 
a5b0: 2a 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b  *pIter = pCell +
a5c0: 20 34 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69   4; /* For loopi
a5d0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a5e0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a5f0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a600: 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b 20 66     /* End mark f
a610: 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 0a  or a varint */..
a620: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a630: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a640: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a650: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a660: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a670: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a680: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a690: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a6a0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a6b0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a6c0: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a6d0: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a6e0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a6f0: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a700: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a710: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a720: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a730: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a740: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a750: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a760: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a770: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a780: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6c 73 65 0a  buginfo);.#else.
a790: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
a7a0: 45 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69  ER(pPage);.#endi
a7b0: 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
a7c0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
a7d0: 3d 3d 34 20 29 3b 0a 20 20 70 45 6e 64 20 3d 20  ==4 );.  pEnd = 
a7e0: 70 49 74 65 72 20 2b 20 39 3b 0a 20 20 77 68 69  pIter + 9;.  whi
a7f0: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a800: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a810: 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  d );.  assert( d
a820: 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d  ebuginfo.nSize==
a830: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a840: 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  ell) || CORRUPT_
a850: 44 42 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  DB );.  return (
a860: 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43 65  u16)(pIter - pCe
a870: 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20  ll);.}...#ifdef 
a880: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20  SQLITE_DEBUG./* 
a890: 54 68 69 73 20 76 61 72 69 61 74 69 6f 6e 20 6f  This variation o
a8a0: 6e 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20  n cellSizePtr() 
a8b0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
a8c0: 66 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  f assert() state
a8d0: 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a  ments.** only. *
a8e0: 2f 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c  /.static u16 cel
a8f0: 6c 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70  lSize(MemPage *p
a900: 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29  Page, int iCell)
a910: 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
a920: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
a930: 65 2c 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  e, findCell(pPag
a940: 65 2c 20 69 43 65 6c 6c 29 29 3b 0a 7d 0a 23 65  e, iCell));.}.#e
a950: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
a960: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
a970: 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  CUUM./*.** If th
a980: 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20 70 61  e cell pCell, pa
a990: 72 74 20 6f 66 20 70 61 67 65 20 70 50 61 67 65  rt of page pPage
a9a0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
a9b0: 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f 76 65  ter.** to an ove
a9c0: 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e 73 65  rflow page, inse
a9d0: 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f  rt an entry into
a9e0: 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
a9f0: 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76 65 72  .** for the over
aa00: 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  flow page..*/.st
aa10: 61 74 69 63 20 76 6f 69 64 20 70 74 72 6d 61 70  atic void ptrmap
aa20: 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50 61  PutOvflPtr(MemPa
aa30: 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70  ge *pPage, u8 *p
aa40: 43 65 6c 6c 2c 20 69 6e 74 20 2a 70 52 43 29 7b  Cell, int *pRC){
aa50: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
aa60: 3b 0a 20 20 69 66 28 20 2a 70 52 43 20 29 20 72  ;.  if( *pRC ) r
aa70: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
aa80: 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20 20 70   pCell!=0 );.  p
aa90: 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
aaa0: 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
aab0: 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
aac0: 6f 2e 6e 4c 6f 63 61 6c 3c 69 6e 66 6f 2e 6e 50  o.nLocal<info.nP
aad0: 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 50 67  ayload ){.    Pg
aae0: 6e 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79  no ovfl = get4by
aaf0: 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 6e  te(&pCell[info.n
ab00: 53 69 7a 65 2d 34 5d 29 3b 0a 20 20 20 20 70 74  Size-4]);.    pt
ab10: 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70  rmapPut(pPage->p
ab20: 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d 41 50  Bt, ovfl, PTRMAP
ab30: 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67  _OVERFLOW1, pPag
ab40: 65 2d 3e 70 67 6e 6f 2c 20 70 52 43 29 3b 0a 20  e->pgno, pRC);. 
ab50: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
ab60: 0a 2a 2a 20 44 65 66 72 61 67 6d 65 6e 74 20 74  .** Defragment t
ab70: 68 65 20 70 61 67 65 20 67 69 76 65 6e 2e 20 20  he page given.  
ab80: 41 6c 6c 20 43 65 6c 6c 73 20 61 72 65 20 6d 6f  All Cells are mo
ab90: 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  ved to the.** en
aba0: 64 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 6e  d of the page an
abb0: 64 20 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65  d all free space
abc0: 20 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e   is collected in
abd0: 74 6f 20 6f 6e 65 0a 2a 2a 20 62 69 67 20 46 72  to one.** big Fr
abe0: 65 65 42 6c 6b 20 74 68 61 74 20 6f 63 63 75 72  eeBlk that occur
abf0: 73 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  s in between the
ac00: 20 68 65 61 64 65 72 20 61 6e 64 20 63 65 6c 6c   header and cell
ac10: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 61 72 72 61  .** pointer arra
ac20: 79 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 63  y and the cell c
ac30: 6f 6e 74 65 6e 74 20 61 72 65 61 2e 0a 2a 2a 0a  ontent area..**.
ac40: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
ac50: 52 2d 34 34 35 38 32 2d 36 30 31 33 38 20 53 51  R-44582-60138 SQ
ac60: 4c 69 74 65 20 6d 61 79 20 66 72 6f 6d 20 74 69  Lite may from ti
ac70: 6d 65 20 74 6f 20 74 69 6d 65 20 72 65 6f 72 67  me to time reorg
ac80: 61 6e 69 7a 65 20 61 0a 2a 2a 20 62 2d 74 72 65  anize a.** b-tre
ac90: 65 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 74  e page so that t
aca0: 68 65 72 65 20 61 72 65 20 6e 6f 20 66 72 65 65  here are no free
acb0: 62 6c 6f 63 6b 73 20 6f 72 20 66 72 61 67 6d 65  blocks or fragme
acc0: 6e 74 20 62 79 74 65 73 2c 20 61 6c 6c 0a 2a 2a  nt bytes, all.**
acd0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 61 72   unused bytes ar
ace0: 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  e contained in t
acf0: 68 65 20 75 6e 61 6c 6c 6f 63 61 74 65 64 20 73  he unallocated s
ad00: 70 61 63 65 20 72 65 67 69 6f 6e 2c 20 61 6e 64  pace region, and
ad10: 20 61 6c 6c 0a 2a 2a 20 63 65 6c 6c 73 20 61 72   all.** cells ar
ad20: 65 20 70 61 63 6b 65 64 20 74 69 67 68 74 6c 79  e packed tightly
ad30: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ad40: 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
ad50: 69 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e  ic int defragmen
ad60: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
ad70: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20  Page){.  int i; 
ad80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
ada0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b  ter */.  int pc;
adb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
adc0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
add0: 66 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  f the i-th cell 
ade0: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
ae10: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
ae20: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ae40: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
ae50: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
ae60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
ae70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
ae80: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
ae90: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
aea0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
aeb0: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
aec0: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
aed0: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
aee0: 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20  cbrk;           
aef0: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
af00: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
af10: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
af20: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
af30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af40: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
af50: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
af60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
af70: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
af80: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
af90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
afa0: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
afb0: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
afc0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 75 6e 73  content */.  uns
afd0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 72 63 3b  igned char *src;
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63          /* Sourc
aff0: 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  e of content */.
b000: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
b010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
b020: 46 69 72 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20  First allowable 
b030: 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20  cell index */.  
b040: 69 6e 74 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20  int iCellLast;  
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
b060: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
b070: 20 69 6e 64 65 78 20 2a 2f 0a 0a 0a 20 20 61 73   index */...  as
b080: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
b090: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
b0a0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
b0b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
b0c0: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
b0d0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b0e0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
b0f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
b100: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
b110: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
b120: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
b130: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
b140: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
b150: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
b160: 6d 70 20 3d 20 30 3b 0a 20 20 73 72 63 20 3d 20  mp = 0;.  src = 
b170: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
b180: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
b190: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
b1a0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
b1b0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
b1c0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
b1d0: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
b1e0: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
b1f0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
b200: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
b210: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
b220: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
b230: 6b 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  k = usableSize;.
b240: 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d 20 63    iCellFirst = c
b250: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
b260: 65 6c 6c 3b 0a 20 20 69 43 65 6c 6c 4c 61 73 74  ell;.  iCellLast
b270: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
b280: 34 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  4;.  for(i=0; i<
b290: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
b2a0: 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20 20 20   u8 *pAddr;     
b2b0: 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65 6c 6c  /* The i-th cell
b2c0: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20 20   pointer */.    
b2d0: 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b 63 65  pAddr = &data[ce
b2e0: 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32 5d 3b  llOffset + i*2];
b2f0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
b300: 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20 20 74  te(pAddr);.    t
b310: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b320: 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74  llFirst );.    t
b330: 65 73 74 63 61 73 65 28 20 70 63 3d 3d 69 43 65  estcase( pc==iCe
b340: 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20 2f 2a  llLast );.    /*
b350: 20 54 68 65 73 65 20 63 6f 6e 64 69 74 69 6f 6e   These condition
b360: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
b370: 65 65 6e 20 76 65 72 69 66 69 65 64 20 69 6e 20  een verified in 
b380: 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 0a  btreeInitPage().
b390: 20 20 20 20 2a 2a 20 69 66 20 50 52 41 47 4d 41      ** if PRAGMA
b3a0: 20 63 65 6c 6c 5f 73 69 7a 65 5f 63 68 65 63 6b   cell_size_check
b3b0: 3d 4f 4e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  =ON..    */.    
b3c0: 69 66 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73  if( pc<iCellFirs
b3d0: 74 20 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73  t || pc>iCellLas
b3e0: 74 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  t ){.      retur
b3f0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
b400: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b410: 20 61 73 73 65 72 74 28 20 70 63 3e 3d 69 43 65   assert( pc>=iCe
b420: 6c 6c 46 69 72 73 74 20 26 26 20 70 63 3c 3d 69  llFirst && pc<=i
b430: 43 65 6c 6c 4c 61 73 74 20 29 3b 0a 20 20 20 20  CellLast );.    
b440: 73 69 7a 65 20 3d 20 70 50 61 67 65 2d 3e 78 43  size = pPage->xC
b450: 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 26  ellSize(pPage, &
b460: 73 72 63 5b 70 63 5d 29 3b 0a 20 20 20 20 63 62  src[pc]);.    cb
b470: 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20  rk -= size;.    
b480: 69 66 28 20 63 62 72 6b 3c 69 43 65 6c 6c 46 69  if( cbrk<iCellFi
b490: 72 73 74 20 7c 7c 20 70 63 2b 73 69 7a 65 3e 75  rst || pc+size>u
b4a0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
b4b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b4c0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
b4d0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
b4e0: 20 63 62 72 6b 2b 73 69 7a 65 3c 3d 75 73 61 62   cbrk+size<=usab
b4f0: 6c 65 53 69 7a 65 20 26 26 20 63 62 72 6b 3e 3d  leSize && cbrk>=
b500: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
b510: 20 20 74 65 73 74 63 61 73 65 28 20 63 62 72 6b    testcase( cbrk
b520: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b530: 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
b540: 65 28 20 70 63 2b 73 69 7a 65 3d 3d 75 73 61 62  e( pc+size==usab
b550: 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 75  leSize );.    pu
b560: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62  t2byte(pAddr, cb
b570: 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 74 65 6d  rk);.    if( tem
b580: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  p==0 ){.      in
b590: 74 20 78 3b 0a 20 20 20 20 20 20 69 66 28 20 63  t x;.      if( c
b5a0: 62 72 6b 3d 3d 70 63 20 29 20 63 6f 6e 74 69 6e  brk==pc ) contin
b5b0: 75 65 3b 0a 20 20 20 20 20 20 74 65 6d 70 20 3d  ue;.      temp =
b5c0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d   sqlite3PagerTem
b5d0: 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42  pSpace(pPage->pB
b5e0: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b5f0: 20 20 78 20 3d 20 67 65 74 32 62 79 74 65 28 26    x = get2byte(&
b600: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
b610: 20 20 20 20 6d 65 6d 63 70 79 28 26 74 65 6d 70      memcpy(&temp
b620: 5b 78 5d 2c 20 26 64 61 74 61 5b 78 5d 2c 20 28  [x], &data[x], (
b630: 63 62 72 6b 2b 73 69 7a 65 29 20 2d 20 78 29 3b  cbrk+size) - x);
b640: 0a 20 20 20 20 20 20 73 72 63 20 3d 20 74 65 6d  .      src = tem
b650: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  p;.    }.    mem
b660: 63 70 79 28 26 64 61 74 61 5b 63 62 72 6b 5d 2c  cpy(&data[cbrk],
b670: 20 26 73 72 63 5b 70 63 5d 2c 20 73 69 7a 65 29   &src[pc], size)
b680: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
b690: 63 62 72 6b 3e 3d 69 43 65 6c 6c 46 69 72 73 74  cbrk>=iCellFirst
b6a0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
b6b0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72  data[hdr+5], cbr
b6c0: 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31  k);.  data[hdr+1
b6d0: 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64  ] = 0;.  data[hd
b6e0: 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61  r+2] = 0;.  data
b6f0: 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 6d  [hdr+7] = 0;.  m
b700: 65 6d 73 65 74 28 26 64 61 74 61 5b 69 43 65 6c  emset(&data[iCel
b710: 6c 46 69 72 73 74 5d 2c 20 30 2c 20 63 62 72 6b  lFirst], 0, cbrk
b720: 2d 69 43 65 6c 6c 46 69 72 73 74 29 3b 0a 20 20  -iCellFirst);.  
b730: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
b740: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
b750: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
b760: 29 3b 0a 20 20 69 66 28 20 63 62 72 6b 2d 69 43  );.  if( cbrk-iC
b770: 65 6c 6c 46 69 72 73 74 21 3d 70 50 61 67 65 2d  ellFirst!=pPage-
b780: 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 72 65  >nFree ){.    re
b790: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b7a0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
b7b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
b7c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
b7d0: 68 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  h the free-list 
b7e0: 6f 6e 20 70 61 67 65 20 70 50 67 20 66 6f 72 20  on page pPg for 
b7f0: 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61  space to store a
b800: 20 63 65 6c 6c 20 6e 42 79 74 65 20 62 79 74 65   cell nByte byte
b810: 73 20 69 6e 0a 2a 2a 20 73 69 7a 65 2e 20 49 66  s in.** size. If
b820: 20 6f 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e   one can be foun
b830: 64 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  d, return a poin
b840: 74 65 72 20 74 6f 20 74 68 65 20 73 70 61 63 65  ter to the space
b850: 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 0a 2a   and remove it.*
b860: 2a 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  * from the free-
b870: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  list..**.** If n
b880: 6f 20 73 75 69 74 61 62 6c 65 20 73 70 61 63 65  o suitable space
b890: 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 6f 6e   can be found on
b8a0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
b8b0: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a  return NULL..**.
b8c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b8d0: 20 6d 61 79 20 64 65 74 65 63 74 20 63 6f 72 72   may detect corr
b8e0: 75 70 74 69 6f 6e 20 77 69 74 68 69 6e 20 70 50  uption within pP
b8f0: 67 2e 20 20 49 66 20 63 6f 72 72 75 70 74 69 6f  g.  If corruptio
b900: 6e 20 69 73 0a 2a 2a 20 64 65 74 65 63 74 65 64  n is.** detected
b910: 20 74 68 65 6e 20 2a 70 52 63 20 69 73 20 73 65   then *pRc is se
b920: 74 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 52 52  t to SQLITE_CORR
b930: 55 50 54 20 61 6e 64 20 4e 55 4c 4c 20 69 73 20  UPT and NULL is 
b940: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
b950: 53 6c 6f 74 73 20 6f 6e 20 74 68 65 20 66 72 65  Slots on the fre
b960: 65 20 6c 69 73 74 20 74 68 61 74 20 61 72 65 20  e list that are 
b970: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 33 20  between 1 and 3 
b980: 62 79 74 65 73 20 6c 61 72 67 65 72 20 74 68 61  bytes larger tha
b990: 6e 20 6e 42 79 74 65 0a 2a 2a 20 77 69 6c 6c 20  n nByte.** will 
b9a0: 62 65 20 69 67 6e 6f 72 65 64 20 69 66 20 61 64  be ignored if ad
b9b0: 64 69 6e 67 20 74 68 65 20 65 78 74 72 61 20 73  ding the extra s
b9c0: 70 61 63 65 20 74 6f 20 74 68 65 20 66 72 61 67  pace to the frag
b9d0: 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e 74 0a  mentation count.
b9e0: 2a 2a 20 63 61 75 73 65 73 20 74 68 65 20 66 72  ** causes the fr
b9f0: 61 67 6d 65 6e 74 61 74 69 6f 6e 20 63 6f 75 6e  agmentation coun
ba00: 74 20 74 6f 20 65 78 63 65 65 64 20 36 30 2e 0a  t to exceed 60..
ba10: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 70 61  */.static u8 *pa
ba20: 67 65 46 69 6e 64 53 6c 6f 74 28 4d 65 6d 50 61  geFindSlot(MemPa
ba30: 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 6e 42 79  ge *pPg, int nBy
ba40: 74 65 2c 20 69 6e 74 20 2a 70 52 63 29 7b 0a 20  te, int *pRc){. 
ba50: 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72 20 3d   const int hdr =
ba60: 20 70 50 67 2d 3e 68 64 72 4f 66 66 73 65 74 3b   pPg->hdrOffset;
ba70: 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44  .  u8 * const aD
ba80: 61 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61  ata = pPg->aData
ba90: 3b 0a 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20  ;.  int iAddr = 
baa0: 68 64 72 20 2b 20 31 3b 0a 20 20 69 6e 74 20 70  hdr + 1;.  int p
bab0: 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44  c = get2byte(&aD
bac0: 61 74 61 5b 69 41 64 64 72 5d 29 3b 0a 20 20 69  ata[iAddr]);.  i
bad0: 6e 74 20 78 3b 0a 20 20 69 6e 74 20 75 73 61 62  nt x;.  int usab
bae0: 6c 65 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42  leSize = pPg->pB
baf0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 0a  t->usableSize;..
bb00: 20 20 61 73 73 65 72 74 28 20 70 63 3e 30 20 29    assert( pc>0 )
bb10: 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 6e 74 20  ;.  do{.    int 
bb20: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
bb30: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
bb40: 66 72 65 65 20 73 6c 6f 74 20 2a 2f 0a 20 20 20  free slot */.   
bb50: 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
bb60: 20 52 2d 30 36 38 36 36 2d 33 39 31 32 35 20 46   R-06866-39125 F
bb70: 72 65 65 62 6c 6f 63 6b 73 20 61 72 65 20 61 6c  reeblocks are al
bb80: 77 61 79 73 20 63 6f 6e 6e 65 63 74 65 64 20 69  ways connected i
bb90: 6e 20 6f 72 64 65 72 20 6f 66 0a 20 20 20 20 2a  n order of.    *
bba0: 2a 20 69 6e 63 72 65 61 73 69 6e 67 20 6f 66 66  * increasing off
bbb0: 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  set. */.    if( 
bbc0: 70 63 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  pc>usableSize-4 
bbd0: 7c 7c 20 70 63 3c 69 41 64 64 72 2b 34 20 29 7b  || pc<iAddr+4 ){
bbe0: 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51  .      *pRc = SQ
bbf0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
bc00: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
bc10: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  0;.    }.    /* 
bc20: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
bc30: 32 37 31 30 2d 35 33 33 32 38 20 54 68 65 20 74  2710-53328 The t
bc40: 68 69 72 64 20 61 6e 64 20 66 6f 75 72 74 68 20  hird and fourth 
bc50: 62 79 74 65 73 20 6f 66 20 65 61 63 68 0a 20 20  bytes of each.  
bc60: 20 20 2a 2a 20 66 72 65 65 62 6c 6f 63 6b 20 66    ** freeblock f
bc70: 6f 72 6d 20 61 20 62 69 67 2d 65 6e 64 69 61 6e  orm a big-endian
bc80: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
bc90: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
bca0: 65 20 66 72 65 65 62 6c 6f 63 6b 0a 20 20 20 20  e freeblock.    
bcb0: 2a 2a 20 69 6e 20 62 79 74 65 73 2c 20 69 6e 63  ** in bytes, inc
bcc0: 6c 75 64 69 6e 67 20 74 68 65 20 34 2d 62 79 74  luding the 4-byt
bcd0: 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20  e header. */.   
bce0: 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
bcf0: 28 26 61 44 61 74 61 5b 70 63 2b 32 5d 29 3b 0a  (&aData[pc+2]);.
bd00: 20 20 20 20 69 66 28 20 28 78 20 3d 20 73 69 7a      if( (x = siz
bd10: 65 20 2d 20 6e 42 79 74 65 29 3e 3d 30 20 29 7b  e - nByte)>=0 ){
bd20: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
bd30: 20 78 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 74   x==4 );.      t
bd40: 65 73 74 63 61 73 65 28 20 78 3d 3d 33 20 29 3b  estcase( x==3 );
bd50: 0a 20 20 20 20 20 20 69 66 28 20 70 63 20 3c 20  .      if( pc < 
bd60: 70 50 67 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b  pPg->cellOffset+
bd70: 32 2a 70 50 67 2d 3e 6e 43 65 6c 6c 20 7c 7c 20  2*pPg->nCell || 
bd80: 73 69 7a 65 2b 70 63 20 3e 20 75 73 61 62 6c 65  size+pc > usable
bd90: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
bda0: 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  *pRc = SQLITE_CO
bdb0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
bdc0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bdd0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 3c      }else if( x<
bde0: 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  4 ){.        /* 
bdf0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
be00: 31 34 39 38 2d 35 38 30 32 32 20 49 6e 20 61 20  1498-58022 In a 
be10: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72  well-formed b-tr
be20: 65 65 20 70 61 67 65 2c 20 74 68 65 20 74 6f 74  ee page, the tot
be30: 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  al.        ** nu
be40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
be50: 20 66 72 61 67 6d 65 6e 74 73 20 6d 61 79 20 6e   fragments may n
be60: 6f 74 20 65 78 63 65 65 64 20 36 30 2e 20 2a 2f  ot exceed 60. */
be70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 44 61  .        if( aDa
be80: 74 61 5b 68 64 72 2b 37 5d 3e 35 37 20 29 20 72  ta[hdr+7]>57 ) r
be90: 65 74 75 72 6e 20 30 3b 0a 0a 20 20 20 20 20 20  eturn 0;..      
bea0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
beb0: 73 6c 6f 74 20 66 72 6f 6d 20 74 68 65 20 66 72  slot from the fr
bec0: 65 65 2d 6c 69 73 74 2e 20 55 70 64 61 74 65 20  ee-list. Update 
bed0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20  the number of.  
bee0: 20 20 20 20 20 20 2a 2a 20 66 72 61 67 6d 65 6e        ** fragmen
bef0: 74 65 64 20 62 79 74 65 73 20 77 69 74 68 69 6e  ted bytes within
bf00: 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
bf10: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
bf20: 61 74 61 5b 69 41 64 64 72 5d 2c 20 26 61 44 61  ata[iAddr], &aDa
bf30: 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20  ta[pc], 2);.    
bf40: 20 20 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d      aData[hdr+7]
bf50: 20 2b 3d 20 28 75 38 29 78 3b 0a 20 20 20 20 20   += (u8)x;.     
bf60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
bf70: 2f 2a 20 54 68 65 20 73 6c 6f 74 20 72 65 6d 61  /* The slot rema
bf80: 69 6e 73 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ins on the free-
bf90: 6c 69 73 74 2e 20 52 65 64 75 63 65 20 69 74 73  list. Reduce its
bfa0: 20 73 69 7a 65 20 74 6f 20 61 63 63 6f 75 6e 74   size to account
bfb0: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72  .         ** for
bfc0: 20 74 68 65 20 70 6f 72 74 69 6f 6e 20 75 73 65   the portion use
bfd0: 64 20 62 79 20 74 68 65 20 6e 65 77 20 61 6c 6c  d by the new all
bfe0: 6f 63 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ocation. */.    
bff0: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 61 44      put2byte(&aD
c000: 61 74 61 5b 70 63 2b 32 5d 2c 20 78 29 3b 0a 20  ata[pc+2], x);. 
c010: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
c020: 75 72 6e 20 26 61 44 61 74 61 5b 70 63 20 2b 20  urn &aData[pc + 
c030: 78 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 41  x];.    }.    iA
c040: 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 70 63  ddr = pc;.    pc
c050: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
c060: 74 61 5b 70 63 5d 29 3b 0a 20 20 7d 77 68 69 6c  ta[pc]);.  }whil
c070: 65 28 20 70 63 20 29 3b 0a 0a 20 20 72 65 74 75  e( pc );..  retu
c080: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
c090: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
c0a0: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 72 6f  tes of space fro
c0b0: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 42 2d 54  m within the B-T
c0c0: 72 65 65 20 70 61 67 65 20 70 61 73 73 65 64 0a  ree page passed.
c0d0: 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ** as the first 
c0e0: 61 72 67 75 6d 65 6e 74 2e 20 57 72 69 74 65 20  argument. Write 
c0f0: 69 6e 74 6f 20 2a 70 49 64 78 20 74 68 65 20 69  into *pIdx the i
c100: 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67 65 2d  ndex into pPage-
c110: 3e 61 44 61 74 61 5b 5d 0a 2a 2a 20 6f 66 20 74  >aData[].** of t
c120: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c130: 20 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65   allocated space
c140: 2e 20 52 65 74 75 72 6e 20 65 69 74 68 65 72 20  . Return either 
c150: 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 0a 2a 2a 20  SQLITE_OK or.** 
c160: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 28 75  an error code (u
c170: 73 75 61 6c 6c 79 20 53 51 4c 49 54 45 5f 43 4f  sually SQLITE_CO
c180: 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  RRUPT)..**.** Th
c190: 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61 6e 74  e caller guarant
c1a0: 65 65 73 20 74 68 61 74 20 74 68 65 72 65 20 69  ees that there i
c1b0: 73 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  s sufficient spa
c1c0: 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 2a  ce to make the.*
c1d0: 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 54  * allocation.  T
c1e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
c1f0: 74 20 6e 65 65 64 20 74 6f 20 64 65 66 72 61 67  t need to defrag
c200: 6d 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ment in order to
c210: 20 62 72 69 6e 67 0a 2a 2a 20 61 6c 6c 20 74 68   bring.** all th
c220: 65 20 73 70 61 63 65 20 74 6f 67 65 74 68 65 72  e space together
c230: 2c 20 68 6f 77 65 76 65 72 2e 20 20 54 68 69 73  , however.  This
c240: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 76   routine will av
c250: 6f 69 64 20 75 73 69 6e 67 0a 2a 2a 20 74 68 65  oid using.** the
c260: 20 66 69 72 73 74 20 74 77 6f 20 62 79 74 65 73   first two bytes
c270: 20 70 61 73 74 20 74 68 65 20 63 65 6c 6c 20 70   past the cell p
c280: 6f 69 6e 74 65 72 20 61 72 65 61 20 73 69 6e 63  ointer area sinc
c290: 65 20 70 72 65 73 75 6d 61 62 6c 79 20 74 68 69  e presumably thi
c2a0: 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  s.** allocation 
c2b0: 69 73 20 62 65 69 6e 67 20 6d 61 64 65 20 69 6e  is being made in
c2c0: 20 6f 72 64 65 72 20 74 6f 20 69 6e 73 65 72 74   order to insert
c2d0: 20 61 20 6e 65 77 20 63 65 6c 6c 2c 20 73 6f 20   a new cell, so 
c2e0: 77 65 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  we will.** also 
c2f0: 65 6e 64 20 75 70 20 6e 65 65 64 69 6e 67 20 61  end up needing a
c300: 20 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65   new cell pointe
c310: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
c320: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
c330: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
c340: 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 2a 70  nt nByte, int *p
c350: 49 64 78 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e  Idx){.  const in
c360: 74 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68  t hdr = pPage->h
c370: 64 72 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20  drOffset;    /* 
c380: 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20 70  Local cache of p
c390: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
c3a0: 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20  */.  u8 * const 
c3b0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
c3c0: 61 74 61 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 63  ata;      /* Loc
c3d0: 61 6c 20 63 61 63 68 65 20 6f 66 20 70 50 61 67  al cache of pPag
c3e0: 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 69 6e  e->aData */.  in
c3f0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
c420: 20 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   of cell content
c430: 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 72   area */.  int r
c440: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 2f 2a 20 49 6e 74 65 67 65 72 20 72 65 74 75 72  /* Integer retur
c470: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c480: 67 61 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 46  gap;        /* F
c490: 69 72 73 74 20 62 79 74 65 20 6f 66 20 67 61 70  irst byte of gap
c4a0: 20 62 65 74 77 65 65 6e 20 63 65 6c 6c 20 70 6f   between cell po
c4b0: 69 6e 74 65 72 73 20 61 6e 64 20 63 65 6c 6c 20  inters and cell 
c4c0: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 0a 20 20  content */.  .  
c4d0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
c4e0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
c4f0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
c500: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c510: 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73  ge->pBt );.  ass
c520: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
c530: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
c540: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
c550: 61 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30  assert( nByte>=0
c560: 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
c570: 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a  cell size is 4 *
c580: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
c590: 65 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20  e->nFree>=nByte 
c5a0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
c5b0: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
c5c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
c5d0: 79 74 65 20 3c 20 28 69 6e 74 29 28 70 50 61 67  yte < (int)(pPag
c5e0: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
c5f0: 7a 65 2d 38 29 20 29 3b 0a 0a 20 20 61 73 73 65  ze-8) );..  asse
c600: 72 74 28 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  rt( pPage->cellO
c610: 66 66 73 65 74 20 3d 3d 20 68 64 72 20 2b 20 31  ffset == hdr + 1
c620: 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61  2 - 4*pPage->lea
c630: 66 20 29 3b 0a 20 20 67 61 70 20 3d 20 70 50 61  f );.  gap = pPa
c640: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b  ge->cellOffset +
c650: 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   2*pPage->nCell;
c660: 0a 20 20 61 73 73 65 72 74 28 20 67 61 70 3c 3d  .  assert( gap<=
c670: 36 35 35 33 36 20 29 3b 0a 20 20 2f 2a 20 45 56  65536 );.  /* EV
c680: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 33  IDENCE-OF: R-293
c690: 35 36 2d 30 32 33 39 31 20 49 66 20 74 68 65 20  56-02391 If the 
c6a0: 64 61 74 61 62 61 73 65 20 75 73 65 73 20 61 20  database uses a 
c6b0: 36 35 35 33 36 2d 62 79 74 65 20 70 61 67 65 20  65536-byte page 
c6c0: 73 69 7a 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  size.  ** and th
c6d0: 65 20 72 65 73 65 72 76 65 64 20 73 70 61 63 65  e reserved space
c6e0: 20 69 73 20 7a 65 72 6f 20 28 74 68 65 20 75 73   is zero (the us
c6f0: 75 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 72 65  ual value for re
c700: 73 65 72 76 65 64 20 73 70 61 63 65 29 0a 20 20  served space).  
c710: 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c  ** then the cell
c720: 20 63 6f 6e 74 65 6e 74 20 6f 66 66 73 65 74 20   content offset 
c730: 6f 66 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  of an empty page
c740: 20 77 61 6e 74 73 20 74 6f 20 62 65 20 36 35 35   wants to be 655
c750: 33 36 2e 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72  36..  ** However
c760: 2c 20 74 68 61 74 20 69 6e 74 65 67 65 72 20 69  , that integer i
c770: 73 20 74 6f 6f 20 6c 61 72 67 65 20 74 6f 20 62  s too large to b
c780: 65 20 73 74 6f 72 65 64 20 69 6e 20 61 20 32 2d  e stored in a 2-
c790: 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 20 20  byte unsigned.  
c7a0: 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 6f 20 61  ** integer, so a
c7b0: 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73 20 75   value of 0 is u
c7c0: 73 65 64 20 69 6e 20 69 74 73 20 70 6c 61 63 65  sed in its place
c7d0: 2e 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67 65 74  . */.  top = get
c7e0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
c7f0: 35 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  5]);.  assert( t
c800: 6f 70 3c 3d 28 69 6e 74 29 70 50 61 67 65 2d 3e  op<=(int)pPage->
c810: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c820: 29 3b 20 2f 2a 20 50 72 65 76 65 6e 74 20 62 79  ); /* Prevent by
c830: 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
c840: 29 20 2a 2f 0a 20 20 69 66 28 20 67 61 70 3e 74  ) */.  if( gap>t
c850: 6f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 74 6f  op ){.    if( to
c860: 70 3d 3d 30 20 26 26 20 70 50 61 67 65 2d 3e 70  p==0 && pPage->p
c870: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3d 3d  Bt->usableSize==
c880: 36 35 35 33 36 20 29 7b 0a 20 20 20 20 20 20 74  65536 ){.      t
c890: 6f 70 20 3d 20 36 35 35 33 36 3b 0a 20 20 20 20  op = 65536;.    
c8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
c8b0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
c8c0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
c8d0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
c8e0: 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63  e is enough spac
c8f0: 65 20 62 65 74 77 65 65 6e 20 67 61 70 20 61 6e  e between gap an
c900: 64 20 74 6f 70 20 66 6f 72 20 6f 6e 65 20 6d 6f  d top for one mo
c910: 72 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 0a  re cell pointer.
c920: 20 20 2a 2a 20 61 72 72 61 79 20 65 6e 74 72 79    ** array entry
c930: 20 6f 66 66 73 65 74 2c 20 61 6e 64 20 69 66 20   offset, and if 
c940: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
c950: 6e 6f 74 20 65 6d 70 74 79 2c 20 74 68 65 6e 20  not empty, then 
c960: 73 65 61 72 63 68 20 74 68 65 0a 20 20 2a 2a 20  search the.  ** 
c970: 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e 67  freelist looking
c980: 20 66 6f 72 20 61 20 66 72 65 65 20 73 6c 6f 74   for a free slot
c990: 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 73   big enough to s
c9a0: 61 74 69 73 66 79 20 74 68 65 20 72 65 71 75 65  atisfy the reque
c9b0: 73 74 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63  st..  */.  testc
c9c0: 61 73 65 28 20 67 61 70 2b 32 3d 3d 74 6f 70 20  ase( gap+2==top 
c9d0: 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  );.  testcase( g
c9e0: 61 70 2b 31 3d 3d 74 6f 70 20 29 3b 0a 20 20 74  ap+1==top );.  t
c9f0: 65 73 74 63 61 73 65 28 20 67 61 70 3d 3d 74 6f  estcase( gap==to
ca00: 70 20 29 3b 0a 20 20 69 66 28 20 28 64 61 74 61  p );.  if( (data
ca10: 5b 68 64 72 2b 32 5d 20 7c 7c 20 64 61 74 61 5b  [hdr+2] || data[
ca20: 68 64 72 2b 31 5d 29 20 26 26 20 67 61 70 2b 32  hdr+1]) && gap+2
ca30: 3c 3d 74 6f 70 20 29 7b 0a 20 20 20 20 75 38 20  <=top ){.    u8 
ca40: 2a 70 53 70 61 63 65 20 3d 20 70 61 67 65 46 69  *pSpace = pageFi
ca50: 6e 64 53 6c 6f 74 28 70 50 61 67 65 2c 20 6e 42  ndSlot(pPage, nB
ca60: 79 74 65 2c 20 26 72 63 29 3b 0a 20 20 20 20 69  yte, &rc);.    i
ca70: 66 28 20 70 53 70 61 63 65 20 29 7b 0a 20 20 20  f( pSpace ){.   
ca80: 20 20 20 61 73 73 65 72 74 28 20 70 53 70 61 63     assert( pSpac
ca90: 65 3e 3d 64 61 74 61 20 26 26 20 28 70 53 70 61  e>=data && (pSpa
caa0: 63 65 20 2d 20 64 61 74 61 29 3c 36 35 35 33 36  ce - data)<65536
cab0: 20 29 3b 0a 20 20 20 20 20 20 2a 70 49 64 78 20   );.      *pIdx 
cac0: 3d 20 28 69 6e 74 29 28 70 53 70 61 63 65 20 2d  = (int)(pSpace -
cad0: 20 64 61 74 61 29 3b 0a 20 20 20 20 20 20 72 65   data);.      re
cae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
caf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
cb00: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
cb10: 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
cb20: 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
cb30: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 66 75   could not be fu
cb40: 6c 66 69 6c 6c 65 64 20 75 73 69 6e 67 20 61 20  lfilled using a 
cb50: 66 72 65 65 6c 69 73 74 20 73 6c 6f 74 2e 20 20  freelist slot.  
cb60: 43 68 65 63 6b 0a 20 20 2a 2a 20 74 6f 20 73 65  Check.  ** to se
cb70: 65 20 69 66 20 64 65 66 72 61 67 6d 65 6e 74 61  e if defragmenta
cb80: 74 69 6f 6e 20 69 73 20 6e 65 63 65 73 73 61 72  tion is necessar
cb90: 79 2e 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61  y..  */.  testca
cba0: 73 65 28 20 67 61 70 2b 32 2b 6e 42 79 74 65 3d  se( gap+2+nByte=
cbb0: 3d 74 6f 70 20 29 3b 0a 20 20 69 66 28 20 67 61  =top );.  if( ga
cbc0: 70 2b 32 2b 6e 42 79 74 65 3e 74 6f 70 20 29 7b  p+2+nByte>top ){
cbd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
cbe0: 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 43  ge->nCell>0 || C
cbf0: 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
cc00: 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74   rc = defragment
cc10: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
cc20: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
cc30: 20 72 63 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67   rc;.    top = g
cc40: 65 74 32 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26  et2byteNotZero(&
cc50: 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
cc60: 20 20 61 73 73 65 72 74 28 20 67 61 70 2b 6e 42    assert( gap+nB
cc70: 79 74 65 3c 3d 74 6f 70 20 29 3b 0a 20 20 7d 0a  yte<=top );.  }.
cc80: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
cc90: 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20  memory from the 
cca0: 67 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74  gap in between t
ccb0: 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20  he cell pointer 
ccc0: 61 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74  array.  ** and t
ccd0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
cce0: 61 72 65 61 2e 20 20 54 68 65 20 62 74 72 65 65  area.  The btree
ccf0: 49 6e 69 74 50 61 67 65 28 29 20 63 61 6c 6c 20  InitPage() call 
cd00: 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  has already.  **
cd10: 20 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 66   validated the f
cd20: 72 65 65 6c 69 73 74 2e 20 20 47 69 76 65 6e 20  reelist.  Given 
cd30: 74 68 61 74 20 74 68 65 20 66 72 65 65 6c 69 73  that the freelis
cd40: 74 20 69 73 20 76 61 6c 69 64 2c 20 74 68 65 72  t is valid, ther
cd50: 65 0a 20 20 2a 2a 20 69 73 20 6e 6f 20 77 61 79  e.  ** is no way
cd60: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
cd70: 74 69 6f 6e 20 63 61 6e 20 65 78 74 65 6e 64 20  tion can extend 
cd80: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
cd90: 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 20 54 68  he page..  ** Th
cda0: 65 20 61 73 73 65 72 74 28 29 20 62 65 6c 6f 77  e assert() below
cdb0: 20 76 65 72 69 66 69 65 73 20 74 68 65 20 70 72   verifies the pr
cdc0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 2e  evious sentence.
cdd0: 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 2d 3d 20 6e  .  */.  top -= n
cde0: 42 79 74 65 3b 0a 20 20 70 75 74 32 62 79 74 65  Byte;.  put2byte
cdf0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
ce00: 6f 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74  op);.  assert( t
ce10: 6f 70 2b 6e 42 79 74 65 20 3c 3d 20 28 69 6e 74  op+nByte <= (int
ce20: 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  )pPage->pBt->usa
ce30: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 2a 70 49  bleSize );.  *pI
ce40: 64 78 20 3d 20 74 6f 70 3b 0a 20 20 72 65 74 75  dx = top;.  retu
ce50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
ce60: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
ce70: 73 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  section of the p
ce80: 50 61 67 65 2d 3e 61 44 61 74 61 20 74 6f 20 74  Page->aData to t
ce90: 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20  he freelist..** 
cea0: 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
ceb0: 66 20 74 68 65 20 6e 65 77 20 66 72 65 65 20 62  f the new free b
cec0: 6c 6f 63 6b 20 69 73 20 70 50 61 67 65 2d 3e 61  lock is pPage->a
ced0: 44 61 74 61 5b 69 53 74 61 72 74 5d 0a 2a 2a 20  Data[iStart].** 
cee0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
cef0: 74 68 65 20 62 6c 6f 63 6b 20 69 73 20 69 53 69  the block is iSi
cf00: 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  ze bytes..**.** 
cf10: 41 64 6a 61 63 65 6e 74 20 66 72 65 65 62 6c 6f  Adjacent freeblo
cf20: 63 6b 73 20 61 72 65 20 63 6f 61 6c 65 73 63 65  cks are coalesce
cf30: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  d..**.** Note th
cf40: 61 74 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  at even though t
cf50: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 6c 69 73  he freeblock lis
cf60: 74 20 77 61 73 20 63 68 65 63 6b 65 64 20 62 79  t was checked by
cf70: 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 29   btreeInitPage()
cf80: 2c 0a 2a 2a 20 74 68 61 74 20 72 6f 75 74 69 6e  ,.** that routin
cf90: 65 20 77 69 6c 6c 20 6e 6f 74 20 64 65 74 65 63  e will not detec
cfa0: 74 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  t overlap betwee
cfb0: 6e 20 63 65 6c 6c 73 20 6f 72 20 66 72 65 65 62  n cells or freeb
cfc0: 6c 6f 63 6b 73 2e 20 20 4e 6f 72 0a 2a 2a 20 64  locks.  Nor.** d
cfd0: 6f 65 73 20 69 74 20 64 65 74 65 63 74 20 63 65  oes it detect ce
cfe0: 6c 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b  lls or freeblock
cff0: 73 20 74 68 61 74 20 65 6e 63 72 6f 75 63 68 20  s that encrouch 
d000: 69 6e 74 6f 20 74 68 65 20 72 65 73 65 72 76 65  into the reserve
d010: 64 20 62 79 74 65 73 0a 2a 2a 20 61 74 20 74 68  d bytes.** at th
d020: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61 67  e end of the pag
d030: 65 2e 20 20 53 6f 20 64 6f 20 61 64 64 69 74 69  e.  So do additi
d040: 6f 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f 6e 20  onal corruption 
d050: 63 68 65 63 6b 73 20 69 6e 73 69 64 65 20 74 68  checks inside th
d060: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 61 6e  is.** routine an
d070: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
d080: 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 70  CORRUPT if any p
d090: 72 6f 62 6c 65 6d 73 20 61 72 65 20 66 6f 75 6e  roblems are foun
d0a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
d0b0: 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d 50 61   freeSpace(MemPa
d0c0: 67 65 20 2a 70 50 61 67 65 2c 20 75 31 36 20 69  ge *pPage, u16 i
d0d0: 53 74 61 72 74 2c 20 75 31 36 20 69 53 69 7a 65  Start, u16 iSize
d0e0: 29 7b 0a 20 20 75 31 36 20 69 50 74 72 3b 20 20  ){.  u16 iPtr;  
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d100: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
d110: 64 72 65 73 73 20 6f 66 20 70 74 72 20 74 6f 20  dress of ptr to 
d120: 6e 65 78 74 20 66 72 65 65 62 6c 6f 63 6b 20 2a  next freeblock *
d130: 2f 0a 20 20 75 31 36 20 69 46 72 65 65 42 6c 6b  /.  u16 iFreeBlk
d140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
d160: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
d170: 20 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20   freeblock */.  
d180: 75 38 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  u8 hdr;         
d190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1a0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 68 65        /* Page he
d1b0: 61 64 65 72 20 73 69 7a 65 2e 20 20 30 20 6f 72  ader size.  0 or
d1c0: 20 31 30 30 20 2a 2f 0a 20 20 75 38 20 6e 46 72   100 */.  u8 nFr
d1d0: 61 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ag = 0;         
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1f0: 2f 2a 20 52 65 64 75 63 74 69 6f 6e 20 69 6e 20  /* Reduction in 
d200: 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f  fragmentation */
d210: 0a 20 20 75 31 36 20 69 4f 72 69 67 53 69 7a 65  .  u16 iOrigSize
d220: 20 3d 20 69 53 69 7a 65 3b 20 20 20 20 20 20 20   = iSize;       
d230: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
d240: 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 69 53  inal value of iS
d250: 69 7a 65 20 2a 2f 0a 20 20 75 33 32 20 69 4c 61  ize */.  u32 iLa
d260: 73 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  st = pPage->pBt-
d270: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 3b 20 2f  >usableSize-4; /
d280: 2a 20 4c 61 72 67 65 73 74 20 70 6f 73 73 69 62  * Largest possib
d290: 6c 65 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66  le freeblock off
d2a0: 73 65 74 20 2a 2f 0a 20 20 75 33 32 20 69 45 6e  set */.  u32 iEn
d2b0: 64 20 3d 20 69 53 74 61 72 74 20 2b 20 69 53 69  d = iStart + iSi
d2c0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
d2d0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
d2e0: 74 20 74 68 65 20 69 53 74 61 72 74 20 62 75 66  t the iStart buf
d2f0: 66 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  fer */.  unsigne
d300: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
d310: 50 61 67 65 2d 3e 61 44 61 74 61 3b 20 20 20 2f  Page->aData;   /
d320: 2a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2a  * Page content *
d330: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
d340: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
d350: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
d360: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
d370: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
d380: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  );.  assert( COR
d390: 52 55 50 54 5f 44 42 20 7c 7c 20 69 53 74 61 72  RUPT_DB || iStar
d3a0: 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  t>=pPage->hdrOff
d3b0: 73 65 74 2b 36 2b 70 50 61 67 65 2d 3e 63 68 69  set+6+pPage->chi
d3c0: 6c 64 50 74 72 53 69 7a 65 20 29 3b 0a 20 20 61  ldPtrSize );.  a
d3d0: 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
d3e0: 42 20 7c 7c 20 69 45 6e 64 20 3c 3d 20 70 50 61  B || iEnd <= pPa
d3f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
d400: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
d410: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d420: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
d430: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
d440: 72 74 28 20 69 53 69 7a 65 3e 3d 34 20 29 3b 20  rt( iSize>=4 ); 
d450: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
d460: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
d470: 20 61 73 73 65 72 74 28 20 69 53 74 61 72 74 3c   assert( iStart<
d480: 3d 69 4c 61 73 74 20 29 3b 0a 0a 20 20 2f 2a 20  =iLast );..  /* 
d490: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
d4a0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
d4b0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
d4c0: 65 20 73 65 63 75 72 65 5f 64 65 6c 65 74 65 0a  e secure_delete.
d4d0: 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65    ** option is e
d4e0: 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20  nabled */.  if( 
d4f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 62 74 73 46  pPage->pBt->btsF
d500: 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
d510: 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
d520: 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 69 53 74  memset(&data[iSt
d530: 61 72 74 5d 2c 20 30 2c 20 69 53 69 7a 65 29 3b  art], 0, iSize);
d540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c  .  }..  /* The l
d550: 69 73 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b  ist of freeblock
d560: 73 20 6d 75 73 74 20 62 65 20 69 6e 20 61 73 63  s must be in asc
d570: 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 46  ending order.  F
d580: 69 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 73 70  ind the .  ** sp
d590: 6f 74 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 77  ot on the list w
d5a0: 68 65 72 65 20 69 53 74 61 72 74 20 73 68 6f 75  here iStart shou
d5b0: 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  ld be inserted..
d5c0: 20 20 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61    */.  hdr = pPa
d5d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
d5e0: 20 69 50 74 72 20 3d 20 68 64 72 20 2b 20 31 3b   iPtr = hdr + 1;
d5f0: 0a 20 20 69 66 28 20 64 61 74 61 5b 69 50 74 72  .  if( data[iPtr
d600: 2b 31 5d 3d 3d 30 20 26 26 20 64 61 74 61 5b 69  +1]==0 && data[i
d610: 50 74 72 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 69  Ptr]==0 ){.    i
d620: 46 72 65 65 42 6c 6b 20 3d 20 30 3b 20 20 2f 2a  FreeBlk = 0;  /*
d630: 20 53 68 6f 72 74 63 75 74 20 66 6f 72 20 74 68   Shortcut for th
d640: 65 20 63 61 73 65 20 77 68 65 6e 20 74 68 65 20  e case when the 
d650: 66 72 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74  freelist is empt
d660: 79 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  y */.  }else{.  
d670: 20 20 77 68 69 6c 65 28 20 28 69 46 72 65 65 42    while( (iFreeB
d680: 6c 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  lk = get2byte(&d
d690: 61 74 61 5b 69 50 74 72 5d 29 29 3e 30 20 26 26  ata[iPtr]))>0 &&
d6a0: 20 69 46 72 65 65 42 6c 6b 3c 69 53 74 61 72 74   iFreeBlk<iStart
d6b0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 46   ){.      if( iF
d6c0: 72 65 65 42 6c 6b 3c 69 50 74 72 2b 34 20 29 20  reeBlk<iPtr+4 ) 
d6d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
d6e0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
d6f0: 20 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c    iPtr = iFreeBl
d700: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d710: 20 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20   iFreeBlk>iLast 
d720: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d730: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
d740: 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42    assert( iFreeB
d750: 6c 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65  lk>iPtr || iFree
d760: 42 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20  Blk==0 );.  .   
d770: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
d780: 74 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72  t:.    **    iFr
d790: 65 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66  eeBlk:   First f
d7a0: 72 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69  reeblock after i
d7b0: 53 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69  Start, or zero i
d7c0: 66 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20  f none.    **   
d7d0: 20 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65   iPtr:       The
d7e0: 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f   address of a po
d7f0: 69 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c  inter to iFreeBl
d800: 6b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  k.    **.    ** 
d810: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
d820: 69 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20  iFreeBlk should 
d830: 62 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74  be coalesced ont
d840: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74  o the end of iSt
d850: 61 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  art..    */.    
d860: 69 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20  if( iFreeBlk && 
d870: 69 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b  iEnd+3>=iFreeBlk
d880: 20 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20   ){.      nFrag 
d890: 3d 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e  = iFreeBlk - iEn
d8a0: 64 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e  d;.      if( iEn
d8b0: 64 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74  d>iFreeBlk ) ret
d8c0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d8d0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69  PT_BKPT;.      i
d8e0: 45 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b  End = iFreeBlk +
d8f0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
d900: 69 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20  iFreeBlk+2]);.  
d910: 20 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70      if( iEnd > p
d920: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
d930: 65 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53  eSize ) return S
d940: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
d950: 50 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20  PT;.      iSize 
d960: 3d 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b  = iEnd - iStart;
d970: 0a 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20  .      iFreeBlk 
d980: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
d990: 5b 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20  [iFreeBlk]);.   
d9a0: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
d9b0: 69 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20  iPtr is another 
d9c0: 66 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20  freeblock (that 
d9d0: 69 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e  is, if iPtr is n
d9e0: 6f 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  ot the freelist.
d9f0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69      ** pointer i
da00: 6e 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  n the page heade
da10: 72 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f  r) then check to
da20: 20 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73   see if iStart s
da30: 68 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20  hould be.    ** 
da40: 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74  coalesced onto t
da50: 68 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a  he end of iPtr..
da60: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
da70: 50 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20  Ptr>hdr+1 ){.   
da80: 20 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d     int iPtrEnd =
da90: 20 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65   iPtr + get2byte
daa0: 28 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b  (&data[iPtr+2]);
dab0: 0a 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45  .      if( iPtrE
dac0: 6e 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a  nd+3>=iStart ){.
dad0: 20 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72          if( iPtr
dae0: 45 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74  End>iStart ) ret
daf0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
db00: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
db10: 20 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74   nFrag += iStart
db20: 20 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20   - iPtrEnd;.    
db30: 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64      iSize = iEnd
db40: 20 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20   - iPtr;.       
db50: 20 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a   iStart = iPtr;.
db60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
db70: 20 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61    if( nFrag>data
db80: 5b 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e  [hdr+7] ) return
db90: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
dba0: 42 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68  BKPT;.    data[h
dbb0: 64 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a  dr+7] -= nFrag;.
dbc0: 20 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74    }.  if( iStart
dbd0: 3d 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61  ==get2byte(&data
dbe0: 5b 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20  [hdr+5]) ){.    
dbf0: 2f 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62  /* The new freeb
dc00: 6c 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62  lock is at the b
dc10: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
dc20: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
dc30: 61 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73  a,.    ** so jus
dc40: 74 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c  t extend the cel
dc50: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72  l content area r
dc60: 61 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74  ather than creat
dc70: 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a  e another.    **
dc80: 20 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20   freelist entry 
dc90: 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21  */.    if( iPtr!
dca0: 3d 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20  =hdr+1 ) return 
dcb0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dcc0: 4b 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74  KPT;.    put2byt
dcd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20  e(&data[hdr+1], 
dce0: 69 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70  iFreeBlk);.    p
dcf0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
dd00: 72 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d  r+5], iEnd);.  }
dd10: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73  else{.    /* Ins
dd20: 65 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65  ert the new free
dd30: 62 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66  block into the f
dd40: 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70  reelist */.    p
dd50: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50  ut2byte(&data[iP
dd60: 74 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20  tr], iStart);.  
dd70: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
dd80: 5b 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42  [iStart], iFreeB
dd90: 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  lk);.    put2byt
dda0: 65 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32  e(&data[iStart+2
ddb0: 5d 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20  ], iSize);.  }. 
ddc0: 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
ddd0: 20 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65   iOrigSize;.  re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
de00: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
de10: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
de20: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
de30: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
de40: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
de50: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
de60: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
de70: 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  dingly..**.** On
de80: 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ly the following
de90: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
dea0: 65 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e  e supported.  An
deb0: 79 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ything different
dec0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20  .** indicates a 
ded0: 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
dee0: 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   files:.**.**   
def0: 20 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41        PTF_ZERODA
df00: 54 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54  TA.**         PT
df10: 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46  F_ZERODATA | PTF
df20: 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20  _LEAF.**        
df30: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
df40: 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20  PTF_INTKEY.**   
df50: 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41        PTF_LEAFDA
df60: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20  TA | PTF_INTKEY 
df70: 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74  | PTF_LEAF.*/.st
df80: 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46  atic int decodeF
df90: 6c 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  lags(MemPage *pP
dfa0: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74  age, int flagByt
dfb0: 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
dfc0: 70 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f  pBt;     /* A co
dfd0: 70 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74  py of pPage->pBt
dfe0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
dff0: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d  Page->hdrOffset=
e000: 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  =(pPage->pgno==1
e010: 20 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20   ? 100 : 0) );. 
e020: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
e030: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
e040: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
e050: 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  ;.  pPage->leaf 
e060: 3d 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e  = (u8)(flagByte>
e070: 3e 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54  >3);  assert( PT
e080: 46 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29  F_LEAF == 1<<3 )
e090: 3b 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20  ;.  flagByte &= 
e0a0: 7e 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61  ~PTF_LEAF;.  pPa
e0b0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
e0c0: 20 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65   = 4-4*pPage->le
e0d0: 61 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65  af;.  pPage->xCe
e0e0: 6c 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a  llSize = cellSiz
e0f0: 65 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50  ePtr;.  pBt = pP
e100: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  age->pBt;.  if( 
e110: 66 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c  flagByte==(PTF_L
e120: 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e  EAFDATA | PTF_IN
e130: 54 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20  TKEY) ){.    /* 
e140: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
e150: 33 36 34 30 2d 31 33 34 31 35 20 41 20 76 61 6c  3640-13415 A val
e160: 75 65 20 6f 66 20 35 20 6d 65 61 6e 73 20 74 68  ue of 5 means th
e170: 65 20 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74  e page is an int
e180: 65 72 69 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62  erior.    ** tab
e190: 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  le b-tree page. 
e1a0: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
e1b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46  PTF_LEAFDATA|PTF
e1c0: 5f 49 4e 54 4b 45 59 29 3d 3d 35 20 29 3b 0a 20  _INTKEY)==5 );. 
e1d0: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e1e0: 46 3a 20 52 2d 32 30 35 30 31 2d 36 31 37 39 36  F: R-20501-61796
e1f0: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 33 20 6d   A value of 13 m
e200: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e210: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 74   a leaf.    ** t
e220: 61 62 6c 65 20 62 2d 74 72 65 65 20 70 61 67 65  able b-tree page
e230: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e240: 20 28 50 54 46 5f 4c 45 41 46 44 41 54 41 7c 50   (PTF_LEAFDATA|P
e250: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
e260: 41 46 29 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70  AF)==13 );.    p
e270: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31  Page->intKey = 1
e280: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
e290: 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70  >leaf ){.      p
e2a0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66  Page->intKeyLeaf
e2b0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 61 67   = 1;.      pPag
e2c0: 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d 20  e->xParseCell = 
e2d0: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
e2e0: 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
e2f0: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e300: 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  yLeaf = 0;.     
e310: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e320: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e  e = cellSizePtrN
e330: 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20  oPayload;.      
e340: 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
e350: 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43 65  l = btreeParseCe
e360: 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a  llPtrNoPayload;.
e370: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
e380: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
e390: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
e3a0: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
e3b0: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
e3c0: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
e3d0: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
e3e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e3f0: 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32 32 35 2d  NCE-OF: R-27225-
e400: 35 33 39 33 36 20 41 20 76 61 6c 75 65 20 6f 66  53936 A value of
e410: 20 32 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   2 means the pag
e420: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
e430: 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 2d  .    ** index b-
e440: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e450: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 5a    assert( (PTF_Z
e460: 45 52 4f 44 41 54 41 29 3d 3d 32 20 29 3b 0a 20  ERODATA)==2 );. 
e470: 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
e480: 46 3a 20 52 2d 31 36 35 37 31 2d 31 31 36 31 35  F: R-16571-11615
e490: 20 41 20 76 61 6c 75 65 20 6f 66 20 31 30 20 6d   A value of 10 m
e4a0: 65 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73  eans the page is
e4b0: 20 61 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 69   a leaf.    ** i
e4c0: 6e 64 65 78 20 62 2d 74 72 65 65 20 70 61 67 65  ndex b-tree page
e4d0: 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
e4e0: 20 28 50 54 46 5f 5a 45 52 4f 44 41 54 41 7c 50   (PTF_ZERODATA|P
e4f0: 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20 29 3b 0a  TF_LEAF)==10 );.
e500: 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65      pPage->intKe
e510: 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  y = 0;.    pPage
e520: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
e530: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61  ;.    pPage->xPa
e540: 72 73 65 43 65 6c 6c 20 3d 20 62 74 72 65 65 50  rseCell = btreeP
e550: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
e560: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
e570: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
e580: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
e590: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e5a0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
e5b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
e5c0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38  ENCE-OF: R-47608
e5d0: 2d 35 36 34 36 39 20 41 6e 79 20 6f 74 68 65 72  -56469 Any other
e5e0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 62   value for the b
e5f0: 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65 20  -tree page type 
e600: 69 73 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  is.    ** an err
e610: 6f 72 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  or. */.    retur
e620: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
e630: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61  _BKPT;.  }.  pPa
e640: 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c  ge->max1bytePayl
e650: 6f 61 64 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62  oad = pBt->max1b
e660: 79 74 65 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65  ytePayload;.  re
e670: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e680: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
e690: 69 7a 65 20 74 68 65 20 61 75 78 69 6c 69 61 72  ize the auxiliar
e6a0: 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  y information fo
e6b0: 72 20 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a  r a disk block..
e6c0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
e6d0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
e6e0: 73 2e 20 20 49 66 20 77 65 20 73 65 65 20 74 68  s.  If we see th
e6f0: 61 74 20 74 68 65 20 70 61 67 65 20 64 6f 65 73  at the page does
e700: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  .** not contain 
e710: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  a well-formed da
e720: 74 61 62 61 73 65 20 70 61 67 65 2c 20 74 68 65  tabase page, the
e730: 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c  n return .** SQL
e740: 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f  ITE_CORRUPT.  No
e750: 74 65 20 74 68 61 74 20 61 20 72 65 74 75 72 6e  te that a return
e760: 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f   of SQLITE_OK do
e770: 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e  es not.** guaran
e780: 74 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67  tee that the pag
e790: 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  e is well-formed
e7a0: 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73  .  It only shows
e7b0: 20 74 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c   that.** we fail
e7c0: 65 64 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79  ed to detect any
e7d0: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
e7e0: 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
e7f0: 49 6e 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65  InitPage(MemPage
e800: 20 2a 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73   *pPage){..  ass
e810: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
e820: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
e830: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d  pPage->pBt->db!=
e840: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
e850: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e860: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
e870: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
e880: 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73  ( pPage->pgno==s
e890: 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e  qlite3PagerPagen
e8a0: 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62  umber(pPage->pDb
e8b0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
e8c0: 74 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69  t( pPage == sqli
e8d0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
e8e0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
e8f0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
e900: 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71  age->aData == sq
e910: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
e920: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
e930: 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  ) );..  if( !pPa
e940: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
e950: 20 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20    u16 pc;       
e960: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
e970: 6f 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77  of a freeblock w
e980: 69 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ithin pPage->aDa
e990: 74 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68  ta[] */.    u8 h
e9a0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  dr;            /
e9b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69  * Offset to begi
e9c0: 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65  nning of page he
e9d0: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a  ader */.    u8 *
e9e0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
e9f0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
ea00: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42  ->aData */.    B
ea10: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
ea20: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
ea30: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
ea40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62   */.    int usab
ea50: 6c 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d  leSize;    /* Am
ea60: 6f 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73  ount of usable s
ea70: 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67  pace on each pag
ea80: 65 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c  e */.    u16 cel
ea90: 6c 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f  lOffset;    /* O
eaa0: 66 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74  ffset from start
eab0: 20 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73   of page to firs
eac0: 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
ead0: 2f 0a 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b  /.    int nFree;
eae0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
eaf0: 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74  er of unused byt
eb00: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a  es on the page *
eb10: 2f 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20  /.    int top;  
eb20: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
eb30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65  t byte of the ce
eb40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll content area 
eb50: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c 6c  */.    int iCell
eb60: 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72  First;    /* Fir
eb70: 73 74 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c  st allowable cel
eb80: 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f  l or freeblock o
eb90: 66 66 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74  ffset */.    int
eba0: 20 69 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20   iCellLast;     
ebb0: 2f 2a 20 4c 61 73 74 20 70 6f 73 73 69 62 6c 65  /* Last possible
ebc0: 20 63 65 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f   cell or freeblo
ebd0: 63 6b 20 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20  ck offset */..  
ebe0: 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70    pBt = pPage->p
ebf0: 42 74 3b 0a 0a 20 20 20 20 68 64 72 20 3d 20 70  Bt;..    hdr = p
ec00: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
ec10: 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
ec20: 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a  e->aData;.    /*
ec30: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
ec40: 32 38 35 39 34 2d 30 32 38 39 30 20 54 68 65 20  28594-02890 The 
ec50: 6f 6e 65 2d 62 79 74 65 20 66 6c 61 67 20 61 74  one-byte flag at
ec60: 20 6f 66 66 73 65 74 20 30 20 69 6e 64 69 63 61   offset 0 indica
ec70: 74 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20  ting.    ** the 
ec80: 62 2d 74 72 65 65 20 70 61 67 65 20 74 79 70 65  b-tree page type
ec90: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 65 63  . */.    if( dec
eca0: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
ecb0: 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72 65 74  data[hdr]) ) ret
ecc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
ecd0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
ece0: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
ecf0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
ed00: 70 61 67 65 53 69 7a 65 3c 3d 36 35 35 33 36 20  pageSize<=65536 
ed10: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  );.    pPage->ma
ed20: 73 6b 50 61 67 65 20 3d 20 28 75 31 36 29 28 70  skPage = (u16)(p
ed30: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 31  Bt->pageSize - 1
ed40: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
ed50: 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20  verflow = 0;.   
ed60: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42   usableSize = pB
ed70: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
ed80: 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66     pPage->cellOf
ed90: 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65  fset = cellOffse
eda0: 74 20 3d 20 68 64 72 20 2b 20 38 20 2b 20 70 50  t = hdr + 8 + pP
edb0: 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
edc0: 65 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44  e;.    pPage->aD
edd0: 61 74 61 45 6e 64 20 3d 20 26 64 61 74 61 5b 75  ataEnd = &data[u
ede0: 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20  sableSize];.    
edf0: 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20  pPage->aCellIdx 
ee00: 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  = &data[cellOffs
ee10: 65 74 5d 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  et];.    pPage->
ee20: 61 44 61 74 61 4f 66 73 74 20 3d 20 26 64 61 74  aDataOfst = &dat
ee30: 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  a[pPage->childPt
ee40: 72 53 69 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45  rSize];.    /* E
ee50: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38  VIDENCE-OF: R-58
ee60: 30 31 35 2d 34 38 31 37 35 20 54 68 65 20 74 77  015-48175 The tw
ee70: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
ee80: 74 20 6f 66 66 73 65 74 20 35 20 64 65 73 69 67  t offset 5 desig
ee90: 6e 61 74 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  nates.    ** the
eea0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63 65   start of the ce
eeb0: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
eec0: 20 41 20 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f   A zero value fo
eed0: 72 20 74 68 69 73 20 69 6e 74 65 67 65 72 20 69  r this integer i
eee0: 73 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 70 72  s.    ** interpr
eef0: 65 74 65 64 20 61 73 20 36 35 35 33 36 2e 20 2a  eted as 65536. *
ef00: 2f 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  /.    top = get2
ef10: 62 79 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74  byteNotZero(&dat
ef20: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f  a[hdr+5]);.    /
ef30: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
ef40: 2d 33 37 30 30 32 2d 33 32 37 37 34 20 54 68 65  -37002-32774 The
ef50: 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65 67 65   two-byte intege
ef60: 72 20 61 74 20 6f 66 66 73 65 74 20 33 20 67 69  r at offset 3 gi
ef70: 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ves the.    ** n
ef80: 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f  umber of cells o
ef90: 6e 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  n the page. */. 
efa0: 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20     pPage->nCell 
efb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
efc0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66  [hdr+3]);.    if
efd0: 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d  ( pPage->nCell>M
efe0: 58 5f 43 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20  X_CELL(pBt) ){. 
eff0: 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20       /* To many 
f000: 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e 67  cells for a sing
f010: 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70 61  le page.  The pa
f020: 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75  ge must be corru
f030: 70 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  pt */.      retu
f040: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
f050: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
f060: 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67    testcase( pPag
f070: 65 2d 3e 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c  e->nCell==MX_CEL
f080: 4c 28 70 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a  L(pBt) );.    /*
f090: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
f0a0: 32 34 30 38 39 2d 35 37 39 37 39 20 49 66 20 61  24089-57979 If a
f0b0: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
f0c0: 6f 20 63 65 6c 6c 73 20 28 77 68 69 63 68 20 69  o cells (which i
f0d0: 73 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f  s only.    ** po
f0e0: 73 73 69 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f  ssible for a roo
f0f0: 74 20 70 61 67 65 20 6f 66 20 61 20 74 61 62 6c  t page of a tabl
f100: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
f110: 6e 6f 20 72 6f 77 73 29 20 74 68 65 6e 20 74 68  no rows) then th
f120: 65 0a 20 20 20 20 2a 2a 20 6f 66 66 73 65 74 20  e.    ** offset 
f130: 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  to the cell cont
f140: 65 6e 74 20 61 72 65 61 20 77 69 6c 6c 20 65 71  ent area will eq
f150: 75 61 6c 20 74 68 65 20 70 61 67 65 20 73 69 7a  ual the page siz
f160: 65 20 6d 69 6e 75 73 20 74 68 65 0a 20 20 20 20  e minus the.    
f170: 2a 2a 20 62 79 74 65 73 20 6f 66 20 72 65 73 65  ** bytes of rese
f180: 72 76 65 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20  rved space. */. 
f190: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f1a0: 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70  ->nCell>0 || top
f1b0: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20  ==usableSize || 
f1c0: 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20  CORRUPT_DB );.. 
f1d0: 20 20 20 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65     /* A malforme
f1e0: 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  d database page 
f1f0: 6d 69 67 68 74 20 63 61 75 73 65 20 75 73 20 74  might cause us t
f200: 6f 20 72 65 61 64 20 70 61 73 74 20 74 68 65 20  o read past the 
f210: 65 6e 64 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61  end.    ** of pa
f220: 67 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  ge when parsing 
f230: 61 20 63 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a  a cell.  .    **
f240: 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c  .    ** The foll
f250: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63  owing block of c
f260: 6f 64 65 20 63 68 65 63 6b 73 20 65 61 72 6c 79  ode checks early
f270: 20 74 6f 20 73 65 65 20 69 66 20 61 20 63 65 6c   to see if a cel
f280: 6c 20 65 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a  l extends.    **
f290: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
f2a0: 20 61 20 70 61 67 65 20 62 6f 75 6e 64 61 72 79   a page boundary
f2b0: 20 61 6e 64 20 63 61 75 73 65 73 20 53 51 4c 49   and causes SQLI
f2c0: 54 45 5f 43 4f 52 52 55 50 54 20 74 6f 20 62 65  TE_CORRUPT to be
f2d0: 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 65   .    ** returne
f2e0: 64 20 69 66 20 69 74 20 64 6f 65 73 2e 0a 20 20  d if it does..  
f2f0: 20 20 2a 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69    */.    iCellFi
f300: 72 73 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  rst = cellOffset
f310: 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
f320: 6c 3b 0a 20 20 20 20 69 43 65 6c 6c 4c 61 73 74  l;.    iCellLast
f330: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   = usableSize - 
f340: 34 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  4;.    if( pBt->
f350: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
f360: 54 45 5f 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b  TE_CellSizeCk ){
f370: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
f380: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
f390: 78 20 69 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20  x into the cell 
f3a0: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
f3b0: 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 20 20  .      int sz;  
f3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f3d0: 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20   of a cell */.. 
f3e0: 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d       if( !pPage-
f3f0: 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73  >leaf ) iCellLas
f400: 74 2d 2d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t--;.      for(i
f410: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  =0; i<pPage->nCe
f420: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f430: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 41    pc = get2byteA
f440: 6c 69 67 6e 65 64 28 26 64 61 74 61 5b 63 65 6c  ligned(&data[cel
f450: 6c 4f 66 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20  lOffset+i*2]);. 
f460: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f470: 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20   pc==iCellFirst 
f480: 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  );.        testc
f490: 61 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61  ase( pc==iCellLa
f4a0: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
f4b0: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f4c0: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
f4e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
f4f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
f500: 20 7d 0a 20 20 20 20 20 20 20 20 73 7a 20 3d 20   }.        sz = 
f510: 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65  pPage->xCellSize
f520: 28 70 50 61 67 65 2c 20 26 64 61 74 61 5b 70 63  (pPage, &data[pc
f530: 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  ]);.        test
f540: 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61  case( pc+sz==usa
f550: 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  bleSize );.     
f560: 20 20 20 69 66 28 20 70 63 2b 73 7a 3e 75 73 61     if( pc+sz>usa
f570: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
f580: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
f590: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
f5a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f5b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   }.      if( !pP
f5c0: 61 67 65 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c  age->leaf ) iCel
f5d0: 6c 4c 61 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20  lLast++;.    }  
f5e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
f5f0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
f600: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
f610: 65 0a 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43  e.    ** EVIDENC
f620: 45 2d 4f 46 3a 20 52 2d 32 33 35 38 38 2d 33 34  E-OF: R-23588-34
f630: 34 35 30 20 54 68 65 20 74 77 6f 2d 62 79 74 65  450 The two-byte
f640: 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
f650: 65 74 20 31 20 67 69 76 65 73 20 74 68 65 0a 20  et 1 gives the. 
f660: 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74     ** start of t
f670: 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f  he first freeblo
f680: 63 6b 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  ck on the page, 
f690: 6f 72 20 69 73 20 7a 65 72 6f 20 69 66 20 74 68  or is zero if th
f6a0: 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a  ere are no.    *
f6b0: 2a 20 66 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f  * freeblocks. */
f6c0: 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32 62 79  .    pc = get2by
f6d0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
f6e0: 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 64 61  ;.    nFree = da
f6f0: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b  ta[hdr+7] + top;
f700: 20 20 2f 2a 20 49 6e 69 74 20 6e 46 72 65 65 20    /* Init nFree 
f710: 74 6f 20 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b  to non-freeblock
f720: 20 66 72 65 65 20 73 70 61 63 65 20 2a 2f 0a 20   free space */. 
f730: 20 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29     while( pc>0 )
f740: 7b 0a 20 20 20 20 20 20 75 31 36 20 6e 65 78 74  {.      u16 next
f750: 2c 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66  , size;.      if
f760: 28 20 70 63 3c 69 43 65 6c 6c 46 69 72 73 74 20  ( pc<iCellFirst 
f770: 7c 7c 20 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20  || pc>iCellLast 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
f790: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35  IDENCE-OF: R-555
f7a0: 33 30 2d 35 32 39 33 30 20 49 6e 20 61 20 77 65  30-52930 In a we
f7b0: 6c 6c 2d 66 6f 72 6d 65 64 20 62 2d 74 72 65 65  ll-formed b-tree
f7c0: 20 70 61 67 65 2c 20 74 68 65 72 65 20 77 69 6c   page, there wil
f7d0: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 77  l.        ** alw
f7e0: 61 79 73 20 62 65 20 61 74 20 6c 65 61 73 74 20  ays be at least 
f7f0: 6f 6e 65 20 63 65 6c 6c 20 62 65 66 6f 72 65 20  one cell before 
f800: 74 68 65 20 66 69 72 73 74 20 66 72 65 65 62 6c  the first freebl
f810: 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ock..        **.
f820: 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74          ** Or, t
f830: 68 65 20 66 72 65 65 62 6c 6f 63 6b 20 69 73 20  he freeblock is 
f840: 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74  off the end of t
f850: 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
f860: 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  */.        retur
f870: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
f880: 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a  _BKPT; .      }.
f890: 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74        next = get
f8a0: 32 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29  2byte(&data[pc])
f8b0: 3b 0a 20 20 20 20 20 20 73 69 7a 65 20 3d 20 67  ;.      size = g
f8c0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 63  et2byte(&data[pc
f8d0: 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  +2]);.      if( 
f8e0: 28 6e 65 78 74 3e 30 20 26 26 20 6e 65 78 74 3c  (next>0 && next<
f8f0: 3d 70 63 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70  =pc+size+3) || p
f900: 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a  c+size>usableSiz
f910: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  e ){.        /* 
f920: 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74  Free blocks must
f930: 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e 67   be in ascending
f940: 20 6f 72 64 65 72 2e 20 41 6e 64 20 74 68 65 20   order. And the 
f950: 6c 61 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20  last byte of.   
f960: 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
f970: 2d 62 6c 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20  -block must lie 
f980: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
f990: 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20  page.  */.      
f9a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f9b0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
f9c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 46 72       }.      nFr
f9d0: 65 65 20 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a  ee = nFree + siz
f9e0: 65 3b 0a 20 20 20 20 20 20 70 63 20 3d 20 6e 65  e;.      pc = ne
f9f0: 78 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  xt;.    }..    /
fa00: 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
fa10: 20 6e 46 72 65 65 20 63 6f 6e 74 61 69 6e 73 20   nFree contains 
fa20: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6f  the sum of the o
fa30: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
fa40: 72 74 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  rt.    ** of the
fa50: 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72   cell-content ar
fa60: 65 61 20 70 6c 75 73 20 74 68 65 20 6e 75 6d 62  ea plus the numb
fa70: 65 72 20 6f 66 20 66 72 65 65 20 62 79 74 65 73  er of free bytes
fa80: 20 77 69 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74   within.    ** t
fa90: 68 65 20 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20  he cell-content 
faa0: 61 72 65 61 2e 20 49 66 20 74 68 69 73 20 69 73  area. If this is
fab0: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
fac0: 65 20 75 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20  e usable-size.  
fad0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65    ** of the page
fae0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
faf0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 65  must be corrupte
fb00: 64 2e 20 54 68 69 73 20 63 68 65 63 6b 20 61 6c  d. This check al
fb10: 73 6f 0a 20 20 20 20 2a 2a 20 73 65 72 76 65 73  so.    ** serves
fb20: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
fb30: 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68  the offset to th
fb40: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  e start of the c
fb50: 65 6c 6c 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20  ell-content.    
fb60: 2a 2a 20 61 72 65 61 2c 20 61 63 63 6f 72 64 69  ** area, accordi
fb70: 6e 67 20 74 6f 20 74 68 65 20 70 61 67 65 20 68  ng to the page h
fb80: 65 61 64 65 72 2c 20 6c 69 65 73 20 77 69 74 68  eader, lies with
fb90: 69 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 20  in the page..   
fba0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 46 72 65   */.    if( nFre
fbb0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fbc0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fbd0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fbe0: 3b 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  ; .    }.    pPa
fbf0: 67 65 2d 3e 6e 46 72 65 65 20 3d 20 28 75 31 36  ge->nFree = (u16
fc00: 29 28 6e 46 72 65 65 20 2d 20 69 43 65 6c 6c 46  )(nFree - iCellF
fc10: 69 72 73 74 29 3b 0a 20 20 20 20 70 50 61 67 65  irst);.    pPage
fc20: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
fc30: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
fc40: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
fc50: 65 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65  et up a raw page
fc60: 20 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b   so that it look
fc70: 73 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73  s like a databas
fc80: 65 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a  e page holding.*
fc90: 2a 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f  * no entries..*/
fca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72  .static void zer
fcb0: 6f 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  oPage(MemPage *p
fcc0: 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  Page, int flags)
fcd0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
fce0: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
fcf0: 3e 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72  >aData;.  BtShar
fd00: 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
fd10: 3e 70 42 74 3b 0a 20 20 75 38 20 68 64 72 20 3d  >pBt;.  u8 hdr =
fd20: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
fd30: 74 3b 0a 20 20 75 31 36 20 66 69 72 73 74 3b 0a  t;.  u16 first;.
fd40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fd50: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
fd60: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
fd70: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
fd80: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fd90: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
fda0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
fdb0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
fdc0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
fdd0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
fde0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
fdf0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
fe00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
fe10: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
fe20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
fe30: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
fe40: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
fe50: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
fe60: 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  if( pBt->btsFlag
fe70: 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44  s & BTS_SECURE_D
fe80: 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d  ELETE ){.    mem
fe90: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
fea0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
feb0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20  ze - hdr);.  }. 
fec0: 20 64 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68   data[hdr] = (ch
fed0: 61 72 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73  ar)flags;.  firs
fee0: 74 20 3d 20 68 64 72 20 2b 20 28 28 66 6c 61 67  t = hdr + ((flag
fef0: 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f  s&PTF_LEAF)==0 ?
ff00: 20 31 32 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73   12 : 8);.  mems
ff10: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
ff20: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
ff30: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
ff40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
ff50: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
ff60: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
ff70: 46 72 65 65 20 3d 20 28 75 31 36 29 28 70 42 74  Free = (u16)(pBt
ff80: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 66  ->usableSize - f
ff90: 69 72 73 74 29 3b 0a 20 20 64 65 63 6f 64 65 46  irst);.  decodeF
ffa0: 6c 61 67 73 28 70 50 61 67 65 2c 20 66 6c 61 67  lags(pPage, flag
ffb0: 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c  s);.  pPage->cel
ffc0: 6c 4f 66 66 73 65 74 20 3d 20 66 69 72 73 74 3b  lOffset = first;
ffd0: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45  .  pPage->aDataE
ffe0: 6e 64 20 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e  nd = &data[pBt->
fff0: 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70  usableSize];.  p
10000 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d  Page->aCellIdx =
10010 20 26 64 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20   &data[first];. 
10020 20 70 50 61 67 65 2d 3e 61 44 61 74 61 4f 66 73   pPage->aDataOfs
10030 74 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  t = &data[pPage-
10040 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a  >childPtrSize];.
10050 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
10060 6f 77 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ow = 0;.  assert
10070 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
10080 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
10090 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
100a0 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
100b0 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
100c0 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
100d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30  pPage->nCell = 0
100e0 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  ;.  pPage->isIni
100f0 74 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  t = 1;.}.../*.**
10100 20 43 6f 6e 76 65 72 74 20 61 20 44 62 50 61 67   Convert a DbPag
10110 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
10120 74 68 65 20 70 61 67 65 72 20 69 6e 74 6f 20 61  the pager into a
10130 20 4d 65 6d 50 61 67 65 20 75 73 65 64 20 62 79   MemPage used by
10140 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20 6c 61  .** the btree la
10150 79 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d  yer..*/.static M
10160 65 6d 50 61 67 65 20 2a 62 74 72 65 65 50 61 67  emPage *btreePag
10170 65 46 72 6f 6d 44 62 50 61 67 65 28 44 62 50 61  eFromDbPage(DbPa
10180 67 65 20 2a 70 44 62 50 61 67 65 2c 20 50 67 6e  ge *pDbPage, Pgn
10190 6f 20 70 67 6e 6f 2c 20 42 74 53 68 61 72 65 64  o pgno, BtShared
101a0 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67   *pBt){.  MemPag
101b0 65 20 2a 70 50 61 67 65 20 3d 20 28 4d 65 6d 50  e *pPage = (MemP
101c0 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65  age*)sqlite3Page
101d0 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
101e0 65 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d  e);.  if( pgno!=
101f0 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20  pPage->pgno ){. 
10200 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
10210 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
10220 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
10230 20 20 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61      pPage->pDbPa
10240 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20  ge = pDbPage;.  
10250 20 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70    pPage->pBt = p
10260 42 74 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70  Bt;.    pPage->p
10270 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  gno = pgno;.    
10280 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
10290 20 3d 20 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30   = pgno==1 ? 100
102a0 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   : 0;.  }.  asse
102b0 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61  rt( pPage->aData
102c0 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ==sqlite3PagerGe
102d0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20 29  tData(pDbPage) )
102e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
102f0 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ; .}../*.** Get 
10300 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
10310 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61 6c 69  pager.  Initiali
10320 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ze the MemPage.p
10330 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67  Bt and.** MemPag
10340 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e 74 73  e.aData elements
10350 20 69 66 20 6e 65 65 64 65 64 2e 20 20 53 65 65   if needed.  See
10360 20 61 6c 73 6f 3a 20 62 74 72 65 65 47 65 74 55   also: btreeGetU
10370 6e 75 73 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a  nusedPage()..**.
10380 2a 2a 20 49 66 20 74 68 65 20 50 41 47 45 52 5f  ** If the PAGER_
10390 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c  GET_NOCONTENT fl
103a0 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d 65  ag is set, it me
103b0 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
103c0 6f 74 20 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74  ot care.** about
103d0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
103e0 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69 73  the page at this
103f0 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f   time.  So do no
10400 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  t go to the disk
10410 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68 65  .** to fetch the
10420 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20   content.  Just 
10430 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74  fill in the cont
10440 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20 66  ent with zeros f
10450 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e  or now..** If in
10460 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20 63   the future we c
10470 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72  all sqlite3Pager
10480 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73 20  Write() on this 
10490 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65  page, that.** me
104a0 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61 72  ans we have star
104b0 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65 72  ted to be concer
104c0 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e  ned about conten
104d0 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a  t and the disk.*
104e0 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  * read should oc
104f0 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
10500 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
10510 20 62 74 72 65 65 47 65 74 50 61 67 65 28 0a 20   btreeGetPage(. 
10520 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10530 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
10540 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ee */.  Pgno pgn
10550 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  o,           /* 
10560 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10570 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  ge to fetch */. 
10580 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
10590 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  e,    /* Return 
105a0 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
105b0 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20   parameter */.  
105c0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
105d0 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 47 45       /* PAGER_GE
105e0 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50  T_NOCONTENT or P
105f0 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c  AGER_GET_READONL
10600 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Y */.){.  int rc
10610 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
10620 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
10630 66 6c 61 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67  flags==0 || flag
10640 73 3d 3d 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  s==PAGER_GET_NOC
10650 4f 4e 54 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d  ONTENT || flags=
10660 3d 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f  =PAGER_GET_READO
10670 4e 4c 59 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NLY );.  assert(
10680 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
10690 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
106a0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
106b0 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
106c0 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62  Pager, pgno, (Db
106d0 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67 65 2c  Page**)&pDbPage,
106e0 20 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72   flags);.  if( r
106f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
10700 20 2a 70 70 50 61 67 65 20 3d 20 62 74 72 65 65   *ppPage = btree
10710 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70  PageFromDbPage(p
10720 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42  DbPage, pgno, pB
10730 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
10740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10750 20 52 65 74 72 69 65 76 65 20 61 20 70 61 67 65   Retrieve a page
10760 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
10770 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 72 65  cache. If the re
10780 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
10790 6e 6f 74 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69  not.** already i
107a0 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
107b0 65 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49  e return NULL. I
107c0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 4d 65  nitialize the Me
107d0 6d 50 61 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a  mPage.pBt and.**
107e0 20 4d 65 6d 50 61 67 65 2e 61 44 61 74 61 20 65   MemPage.aData e
107f0 6c 65 6d 65 6e 74 73 20 69 66 20 6e 65 65 64 65  lements if neede
10800 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d  d..*/.static Mem
10810 50 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 4c  Page *btreePageL
10820 6f 6f 6b 75 70 28 42 74 53 68 61 72 65 64 20 2a  ookup(BtShared *
10830 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
10840 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
10850 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
10860 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10870 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10880 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69    pDbPage = sqli
10890 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70  te3PagerLookup(p
108a0 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f  Bt->pPager, pgno
108b0 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67 65  );.  if( pDbPage
108c0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 62   ){.    return b
108d0 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62 50 61  treePageFromDbPa
108e0 67 65 28 70 44 62 50 61 67 65 2c 20 70 67 6e 6f  ge(pDbPage, pgno
108f0 2c 20 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65  , pBt);.  }.  re
10900 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
10910 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
10920 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
10930 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 2e 20   file in pages. 
10940 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 79 20  If there is any 
10950 6b 69 6e 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72  kind of.** error
10960 2c 20 72 65 74 75 72 6e 20 28 28 75 6e 73 69 67  , return ((unsig
10970 6e 65 64 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a  ned int)-1)..*/.
10980 73 74 61 74 69 63 20 50 67 6e 6f 20 62 74 72 65  static Pgno btre
10990 65 50 61 67 65 63 6f 75 6e 74 28 42 74 53 68 61  ePagecount(BtSha
109a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 72 65 74  red *pBt){.  ret
109b0 75 72 6e 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a  urn pBt->nPage;.
109c0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 42 74 72  }.u32 sqlite3Btr
109d0 65 65 4c 61 73 74 50 61 67 65 28 42 74 72 65 65  eeLastPage(Btree
109e0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
109f0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
10a00 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61  sMutex(p) );.  a
10a10 73 73 65 72 74 28 20 28 28 70 2d 3e 70 42 74 2d  ssert( ((p->pBt-
10a20 3e 6e 50 61 67 65 29 26 30 78 38 30 30 30 30 30  >nPage)&0x800000
10a30 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
10a40 6e 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  n btreePagecount
10a50 28 70 2d 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a  (p->pBt);.}../*.
10a60 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66 72  ** Get a page fr
10a70 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e 64  om the pager and
10a80 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a   initialize it..
10a90 2a 2a 0a 2a 2a 20 49 66 20 70 43 75 72 21 3d 30  **.** If pCur!=0
10aa0 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 69   then the page i
10ab0 73 20 62 65 69 6e 67 20 66 65 74 63 68 65 64 20  s being fetched 
10ac0 61 73 20 70 61 72 74 20 6f 66 20 61 20 6d 6f 76  as part of a mov
10ad0 65 54 6f 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61  eToChild().** ca
10ae0 6c 6c 2e 20 20 44 6f 20 61 64 64 69 74 69 6f 6e  ll.  Do addition
10af0 61 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  al sanity checki
10b00 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20 69  ng on the page i
10b10 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20  n this case..** 
10b20 41 6e 64 20 69 66 20 74 68 65 20 66 65 74 63 68  And if the fetch
10b30 20 66 61 69 6c 73 2c 20 74 68 69 73 20 72 6f 75   fails, this rou
10b40 74 69 6e 65 20 6d 75 73 74 20 64 65 63 72 65 6d  tine must decrem
10b50 65 6e 74 20 70 43 75 72 2d 3e 69 50 61 67 65 2e  ent pCur->iPage.
10b60 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
10b70 69 73 20 66 65 74 63 68 65 64 20 61 73 20 72 65  is fetched as re
10b80 61 64 2d 77 72 69 74 65 20 75 6e 6c 65 73 73 20  ad-write unless 
10b90 70 43 75 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  pCur is not NULL
10ba0 20 61 6e 64 20 69 73 0a 2a 2a 20 61 20 72 65 61   and is.** a rea
10bb0 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a  d-only cursor..*
10bc0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10bd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 2a 70   occurs, then *p
10be0 70 50 61 67 65 20 69 73 20 75 6e 64 65 66 69 6e  pPage is undefin
10bf0 65 64 2e 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65  ed. It.** may re
10c00 6d 61 69 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20  main unchanged, 
10c10 6f 72 20 69 74 20 6d 61 79 20 62 65 20 73 65 74  or it may be set
10c20 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 76   to an invalid v
10c30 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
10c40 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74 50 61  int getAndInitPa
10c50 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
10c60 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  pBt,            
10c70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
10c80 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
10c90 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
10ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65  /* Number of the
10cc0 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a   page to get */.
10cd0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
10ce0 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
10cf0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
10d00 61 67 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65  age pointer here
10d10 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
10d20 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20  pCur,           
10d30 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
10d40 74 6f 20 72 65 63 65 69 76 65 20 74 68 65 20 70  to receive the p
10d50 61 67 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  age, or NULL */.
10d60 20 20 69 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20    int bReadOnly 
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
10d90 72 65 61 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a  read-only page *
10da0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
10db0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
10dc0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10dd0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10de0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10df0 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20  assert( pCur==0 
10e00 7c 7c 20 70 70 50 61 67 65 3d 3d 26 70 43 75 72  || ppPage==&pCur
10e10 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
10e20 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
10e30 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52  t( pCur==0 || bR
10e40 65 61 64 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63  eadOnly==pCur->c
10e50 75 72 50 61 67 65 72 46 6c 61 67 73 20 29 3b 0a  urPagerFlags );.
10e60 20 20 61 73 73 65 72 74 28 20 70 43 75 72 3d 3d    assert( pCur==
10e70 30 20 7c 7c 20 70 43 75 72 2d 3e 69 50 61 67 65  0 || pCur->iPage
10e80 3e 30 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e  >0 );..  if( pgn
10e90 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
10ea0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 63 20  (pBt) ){.    rc 
10eb0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
10ec0 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20  _BKPT;.    goto 
10ed0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
10ee0 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rror;.  }.  rc =
10ef0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
10f00 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
10f10 6e 6f 2c 20 28 44 62 50 61 67 65 2a 2a 29 26 70  no, (DbPage**)&p
10f20 44 62 50 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c  DbPage, bReadOnl
10f30 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  y);.  if( rc ){.
10f40 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e 64 49      goto getAndI
10f50 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20  nitPage_error;. 
10f60 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 28   }.  *ppPage = (
10f70 4d 65 6d 50 61 67 65 2a 29 73 71 6c 69 74 65 33  MemPage*)sqlite3
10f80 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
10f90 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 28 2a  bPage);.  if( (*
10fa0 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d  ppPage)->isInit=
10fb0 3d 30 20 29 7b 0a 20 20 20 20 62 74 72 65 65 50  =0 ){.    btreeP
10fc0 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10fd0 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10fe0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
10ff0 65 49 6e 69 74 50 61 67 65 28 2a 70 70 50 61 67  eInitPage(*ppPag
11000 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
11010 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11020 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11030 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  ppPage);.      g
11040 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11050 67 65 5f 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  ge_error;.    }.
11060 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 2a    }.  assert( (*
11070 70 70 50 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70  ppPage)->pgno==p
11080 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  gno );.  assert(
11090 20 28 2a 70 70 50 61 67 65 29 2d 3e 61 44 61 74   (*ppPage)->aDat
110a0 61 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 47  a==sqlite3PagerG
110b0 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 20  etData(pDbPage) 
110c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61  );..  /* If obta
110d0 69 6e 69 6e 67 20 61 20 63 68 69 6c 64 20 70 61  ining a child pa
110e0 67 65 20 66 6f 72 20 61 20 63 75 72 73 6f 72 2c  ge for a cursor,
110f0 20 77 65 20 6d 75 73 74 20 76 65 72 69 66 79 20   we must verify 
11100 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
11110 0a 20 20 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65  .  ** compatible
11120 20 77 69 74 68 20 74 68 65 20 72 6f 6f 74 20 70   with the root p
11130 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43  age. */.  if( pC
11140 75 72 20 26 26 20 28 28 2a 70 70 50 61 67 65 29  ur && ((*ppPage)
11150 2d 3e 6e 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70  ->nCell<1 || (*p
11160 70 50 61 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d  pPage)->intKey!=
11170 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29  pCur->curIntKey)
11180 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11190 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
111a0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
111b0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
111c0 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50  goto getAndInitP
111d0 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  age_error;.  }. 
111e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
111f0 4b 3b 0a 0a 67 65 74 41 6e 64 49 6e 69 74 50 61  K;..getAndInitPa
11200 67 65 5f 65 72 72 6f 72 3a 0a 20 20 69 66 28 20  ge_error:.  if( 
11210 70 43 75 72 20 29 20 70 43 75 72 2d 3e 69 50 61  pCur ) pCur->iPa
11220 67 65 2d 2d 3b 0a 20 20 74 65 73 74 63 61 73 65  ge--;.  testcase
11230 28 20 70 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61  ( pgno==0 );.  a
11240 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c  ssert( pgno!=0 |
11250 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52  | rc==SQLITE_COR
11260 52 55 50 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  RUPT );.  return
11270 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
11280 6c 65 61 73 65 20 61 20 4d 65 6d 50 61 67 65 2e  lease a MemPage.
11290 20 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65    This should be
112a0 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
112b0 20 65 61 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63   each prior.** c
112c0 61 6c 6c 20 74 6f 20 62 74 72 65 65 47 65 74 50  all to btreeGetP
112d0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
112e0 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 4e  oid releasePageN
112f0 6f 74 4e 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a  otNull(MemPage *
11300 70 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  pPage){.  assert
11310 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29  ( pPage->aData )
11320 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
11330 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
11340 72 74 28 20 70 50 61 67 65 2d 3e 70 44 62 50 61  rt( pPage->pDbPa
11350 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
11360 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  t( sqlite3PagerG
11370 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70  etExtra(pPage->p
11380 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64  DbPage) == (void
11390 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  *)pPage );.  ass
113a0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
113b0 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e  rGetData(pPage->
113c0 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d  pDbPage)==pPage-
113d0 3e 61 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65  >aData );.  asse
113e0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
113f0 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
11400 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  t->mutex) );.  s
11410 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
11420 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70  NotNull(pPage->p
11430 44 62 50 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69  DbPage);.}.stati
11440 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61  c void releasePa
11450 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
11460 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20  e){.  if( pPage 
11470 29 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74  ) releasePageNot
11480 4e 75 6c 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a  Null(pPage);.}..
11490 2f 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75  /*.** Get an unu
114a0 73 65 64 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  sed page..**.** 
114b0 54 68 69 73 20 77 6f 72 6b 73 20 6a 75 73 74 20  This works just 
114c0 6c 69 6b 65 20 62 74 72 65 65 47 65 74 50 61 67  like btreeGetPag
114d0 65 28 29 20 77 69 74 68 20 74 68 65 20 61 64 64  e() with the add
114e0 69 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  ition:.**.**   *
114f0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
11500 20 61 6c 72 65 61 64 79 20 69 6e 20 75 73 65 20   already in use 
11510 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
11520 75 72 70 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74  urpose, immediat
11530 65 6c 79 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65  ely.**      rele
11540 61 73 65 20 69 74 20 61 6e 64 20 72 65 74 75 72  ase it and retur
11550 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43 55 52 52  n an SQLITE_CURR
11560 55 50 54 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20  UPT error..**   
11570 2a 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  *  Make sure the
11580 20 69 73 49 6e 69 74 20 66 6c 61 67 20 69 73 20   isInit flag is 
11590 63 6c 65 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20  clear.*/.static 
115a0 69 6e 74 20 62 74 72 65 65 47 65 74 55 6e 75 73  int btreeGetUnus
115b0 65 64 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  edPage(.  BtShar
115c0 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f  ed *pBt,       /
115d0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
115e0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
115f0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11600 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66  of the page to f
11610 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  etch */.  MemPag
11620 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
11630 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
11640 65 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65  e in this parame
11650 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ter */.  int fla
11660 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gs            /*
11670 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e   PAGER_GET_NOCON
11680 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f 47 45  TENT or PAGER_GE
11690 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b  T_READONLY */.){
116a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 62 74 72 65  .  int rc = btre
116b0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
116c0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 66 6c 61 67  no, ppPage, flag
116d0 73 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  s);.  if( rc==SQ
116e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
116f0 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  f( sqlite3PagerP
11700 61 67 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70  ageRefcount((*pp
11710 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3e  Page)->pDbPage)>
11720 31 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  1 ){.      relea
11730 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  sePage(*ppPage);
11740 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d  .      *ppPage =
11750 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
11760 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
11770 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
11780 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
11790 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t = 0;.  }else{.
117a0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
117b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
117c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69  ;.}.../*.** Duri
117d0 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77  ng a rollback, w
117e0 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 72 65  hen the pager re
117f0 6c 6f 61 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f  loads informatio
11800 6e 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  n into the cache
11810 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20  .** so that the 
11820 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
11830 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
11840 6c 20 73 74 61 74 65 20 61 74 20 74 68 65 20 73  l state at the s
11850 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74  tart of.** the t
11860 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20  ransaction, for 
11870 65 61 63 68 20 70 61 67 65 20 72 65 73 74 6f 72  each page restor
11880 65 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ed this routine 
11890 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
118a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6e 65   This routine ne
118b0 65 64 73 20 74 6f 20 72 65 73 65 74 20 74 68 65  eds to reset the
118c0 20 65 78 74 72 61 20 64 61 74 61 20 73 65 63 74   extra data sect
118d0 69 6f 6e 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ion at the end o
118e0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  f the.** page to
118f0 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20   agree with the 
11900 72 65 73 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a  restored data..*
11910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
11920 67 65 52 65 69 6e 69 74 28 44 62 50 61 67 65 20  geReinit(DbPage 
11930 2a 70 44 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61  *pData){.  MemPa
11940 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 70 50 61  ge *pPage;.  pPa
11950 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29  ge = (MemPage *)
11960 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11970 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20 20 61  xtra(pData);.  a
11980 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
11990 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
119a0 70 44 61 74 61 29 3e 30 20 29 3b 0a 20 20 69 66  pData)>0 );.  if
119b0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
119c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  ){.    assert( s
119d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
119e0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
119f0 74 65 78 29 20 29 3b 0a 20 20 20 20 70 50 61 67  tex) );.    pPag
11a00 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20  e->isInit = 0;. 
11a10 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
11a20 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
11a30 70 44 61 74 61 29 3e 31 20 29 7b 0a 20 20 20 20  pData)>1 ){.    
11a40 20 20 2f 2a 20 70 50 61 67 65 20 6d 69 67 68 74    /* pPage might
11a50 20 6e 6f 74 20 62 65 20 61 20 62 74 72 65 65 20   not be a btree 
11a60 70 61 67 65 3b 20 20 69 74 20 6d 69 67 68 74 20  page;  it might 
11a70 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  be an overflow p
11a80 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20  age.      ** or 
11a90 70 74 72 6d 61 70 20 70 61 67 65 20 6f 72 20 61  ptrmap page or a
11aa0 20 66 72 65 65 20 70 61 67 65 2e 20 20 49 6e 20   free page.  In 
11ab0 74 68 6f 73 65 20 63 61 73 65 73 2c 20 74 68 65  those cases, the
11ac0 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20   following.     
11ad0 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 62 74 72 65   ** call to btre
11ae0 65 49 6e 69 74 50 61 67 65 28 29 20 77 69 6c 6c  eInitPage() will
11af0 20 6c 69 6b 65 6c 79 20 72 65 74 75 72 6e 20 53   likely return S
11b00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20  QLITE_CORRUPT.. 
11b10 20 20 20 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68       ** But no h
11b20 61 72 6d 20 69 73 20 64 6f 6e 65 20 62 79 20 74  arm is done by t
11b30 68 69 73 2e 20 20 41 6e 64 20 69 74 20 69 73 20  his.  And it is 
11b40 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 20 74  very important t
11b50 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 62 74 72  hat.      ** btr
11b60 65 65 49 6e 69 74 50 61 67 65 28 29 20 62 65 20  eeInitPage() be 
11b70 63 61 6c 6c 65 64 20 6f 6e 20 65 76 65 72 79 20  called on every 
11b80 62 74 72 65 65 20 70 61 67 65 20 73 6f 20 77 65  btree page so we
11b90 20 6d 61 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74   make.      ** t
11ba0 68 65 20 63 61 6c 6c 20 66 6f 72 20 65 76 65 72  he call for ever
11bb0 79 20 70 61 67 65 20 74 68 61 74 20 63 6f 6d 65  y page that come
11bc0 73 20 69 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74  s in for re-init
11bd0 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74  ing. */.      bt
11be0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
11bf0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
11c00 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
11c10 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66  e busy handler f
11c20 6f 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73  or a btree..*/.s
11c30 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 49  tatic int btreeI
11c40 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
11c50 28 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20  (void *pArg){.  
11c60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
11c70 28 42 74 53 68 61 72 65 64 2a 29 70 41 72 67 3b  (BtShared*)pArg;
11c80 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
11c90 64 62 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  db );.  assert( 
11ca0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11cb0 6c 64 28 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65  ld(pBt->db->mute
11cc0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  x) );.  return s
11cd0 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
11ce0 48 61 6e 64 6c 65 72 28 26 70 42 74 2d 3e 64 62  Handler(&pBt->db
11cf0 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a  ->busyHandler);.
11d00 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
11d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
11d20 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20  * .** zFilename 
11d30 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
11d40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11d50 2e 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  .  If zFilename 
11d60 69 73 20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20  is NULL.** then 
11d70 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74  an ephemeral dat
11d80 61 62 61 73 65 20 69 73 20 63 72 65 61 74 65 64  abase is created
11d90 2e 20 20 54 68 65 20 65 70 68 65 6d 65 72 61 6c  .  The ephemeral
11da0 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74 0a   database might.
11db0 2a 2a 20 62 65 20 65 78 63 6c 75 73 69 76 65 6c  ** be exclusivel
11dc0 79 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20  y in memory, or 
11dd0 69 74 20 6d 69 67 68 74 20 75 73 65 20 61 20 64  it might use a d
11de0 69 73 6b 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79  isk-based memory
11df0 20 63 61 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65   cache..** Eithe
11e00 72 20 77 61 79 2c 20 74 68 65 20 65 70 68 65 6d  r way, the ephem
11e10 65 72 61 6c 20 64 61 74 61 62 61 73 65 20 77 69  eral database wi
11e20 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
11e30 6c 6c 79 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20  lly deleted .** 
11e40 77 68 65 6e 20 73 71 6c 69 74 65 33 42 74 72 65  when sqlite3Btre
11e50 65 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c  eClose() is call
11e60 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
11e70 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
11e80 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
11e90 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
11ea0 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
11eb0 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
11ec0 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
11ed0 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
11ee0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67  .**.** The "flag
11ef0 73 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  s" parameter is 
11f00 61 20 62 69 74 6d 61 73 6b 20 74 68 61 74 20 6d  a bitmask that m
11f10 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 62 69 74  ight contain bit
11f20 73 20 6c 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f  s like.** BTREE_
11f30 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64  OMIT_JOURNAL and
11f40 2f 6f 72 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59  /or BTREE_MEMORY
11f50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
11f60 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11f70 64 79 20 6f 70 65 6e 65 64 20 69 6e 20 74 68 65  dy opened in the
11f80 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 63   same database c
11f90 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64  onnection.** and
11fa0 20 77 65 20 61 72 65 20 69 6e 20 73 68 61 72 65   we are in share
11fb0 64 20 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68  d cache mode, th
11fc0 65 6e 20 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c  en the open will
11fd0 20 66 61 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a   fail with an.**
11fe0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
11ff0 4e 54 20 65 72 72 6f 72 2e 20 20 57 65 20 63 61  NT error.  We ca
12000 6e 6e 6f 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f  nnot allow two o
12010 72 20 6d 6f 72 65 20 42 74 53 68 61 72 65 64 0a  r more BtShared.
12020 2a 2a 20 6f 62 6a 65 63 74 73 20 69 6e 20 74 68  ** objects in th
12030 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
12040 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65  connection since
12050 20 64 6f 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c   doing so will l
12060 65 61 64 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65  ead.** to proble
12070 6d 73 20 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e  ms with locking.
12080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
12090 74 72 65 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69  treeOpen(.  sqli
120a0 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
120b0 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
120c0 65 20 66 6f 72 20 74 68 69 73 20 62 2d 74 72 65  e for this b-tre
120d0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
120e0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
120f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
12100 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  le containing th
12110 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73 65  e BTree database
12120 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
12130 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
12140 20 41 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   Associated data
12150 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
12160 20 42 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65   Btree **ppBtree
12170 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
12180 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
12190 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
121a0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  here */.  int fl
121b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
121c0 20 20 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a    /* Options */.
121d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
121e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
121f0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
12200 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
12210 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
12220 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12230 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12240 2f 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f  /* Shared part o
12250 66 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  f btree structur
12260 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b  e */.  Btree *p;
12270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12280 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
12290 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73  to return */.  s
122a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
122b0 74 65 78 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a  texOpen = 0;  /*
122c0 20 50 72 65 76 65 6e 74 73 20 61 20 72 61 63 65   Prevents a race
122d0 20 63 6f 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b   condition. Tick
122e0 65 74 20 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e  et #3537 */.  in
122f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12300 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
12310 52 65 73 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d  Result code from
12320 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
12330 2f 0a 20 20 75 38 20 6e 52 65 73 65 72 76 65 3b  /.  u8 nReserve;
12340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12350 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e     /* Byte of un
12360 75 73 65 64 20 73 70 61 63 65 20 6f 6e 20 65 61  used space on ea
12370 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73  ch page */.  uns
12380 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
12390 61 64 65 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44  ader[100];  /* D
123a0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20 63  atabase header c
123b0 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20  ontent */..  /* 
123c0 54 72 75 65 20 69 66 20 6f 70 65 6e 69 6e 67 20  True if opening 
123d0 61 6e 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 65  an ephemeral, te
123e0 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
123f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20   */.  const int 
12400 69 73 54 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65  isTempDb = zFile
12410 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65  name==0 || zFile
12420 6e 61 6d 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f  name[0]==0;..  /
12430 2a 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62  * Set the variab
12440 6c 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72  le isMemdb to tr
12450 75 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ue for an in-mem
12460 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72  ory database, or
12470 20 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72   .  ** false for
12480 20 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61   a file-based da
12490 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66  tabase..  */.#if
124a0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
124b0 4d 45 4d 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74  MEMORYDB.  const
124c0 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30   int isMemdb = 0
124d0 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20  ;.#else.  const 
124e0 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a  int isMemdb = (z
124f0 46 69 6c 65 6e 61 6d 65 20 26 26 20 73 74 72 63  Filename && strc
12500 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a  mp(zFilename, ":
12510 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20  memory:")==0).  
12520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12530 20 20 20 20 20 7c 7c 20 28 69 73 54 65 6d 70 44       || (isTempD
12540 62 20 26 26 20 73 71 6c 69 74 65 33 54 65 6d 70  b && sqlite3Temp
12550 49 6e 4d 65 6d 6f 72 79 28 64 62 29 29 0a 20 20  InMemory(db)).  
12560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12570 20 20 20 20 20 7c 7c 20 28 76 66 73 46 6c 61 67       || (vfsFlag
12580 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12590 4d 45 4d 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64  MEMORY)!=0;.#end
125a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62  if..  assert( db
125b0 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
125c0 20 70 56 66 73 21 3d 30 20 29 3b 0a 20 20 61 73   pVfs!=0 );.  as
125d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
125e0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
125f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
12600 20 28 66 6c 61 67 73 26 30 78 66 66 29 3d 3d 66   (flags&0xff)==f
12610 6c 61 67 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61  lags );   /* fla
12620 67 73 20 66 69 74 20 69 6e 20 38 20 62 69 74 73  gs fit in 8 bits
12630 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61   */..  /* Only a
12640 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61   BTREE_SINGLE da
12650 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 42 54  tabase can be BT
12660 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f  REE_UNORDERED */
12670 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
12680 73 20 26 20 42 54 52 45 45 5f 55 4e 4f 52 44 45  s & BTREE_UNORDE
12690 52 45 44 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  RED)==0 || (flag
126a0 73 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45  s & BTREE_SINGLE
126b0 29 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20  )!=0 );..  /* A 
126c0 42 54 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74  BTREE_SINGLE dat
126d0 61 62 61 73 65 20 69 73 20 61 6c 77 61 79 73 20  abase is always 
126e0 61 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f  a temporary and/
126f0 6f 72 20 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a  or ephemeral */.
12700 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67 73    assert( (flags
12710 20 26 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29   & BTREE_SINGLE)
12720 3d 3d 30 20 7c 7c 20 69 73 54 65 6d 70 44 62 20  ==0 || isTempDb 
12730 29 3b 0a 0a 20 20 69 66 28 20 69 73 4d 65 6d 64  );..  if( isMemd
12740 62 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  b ){.    flags |
12750 3d 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a  = BTREE_MEMORY;.
12760 20 20 7d 0a 20 20 69 66 28 20 28 76 66 73 46 6c    }.  if( (vfsFl
12770 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
12780 4e 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26  N_MAIN_DB)!=0 &&
12790 20 28 69 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54   (isMemdb || isT
127a0 65 6d 70 44 62 29 20 29 7b 0a 20 20 20 20 76 66  empDb) ){.    vf
127b0 73 46 6c 61 67 73 20 3d 20 28 76 66 73 46 6c 61  sFlags = (vfsFla
127c0 67 73 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  gs & ~SQLITE_OPE
127d0 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c  N_MAIN_DB) | SQL
127e0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
127f0 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69  ;.  }.  p = sqli
12800 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
12810 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20 20  zeof(Btree));.  
12820 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
12830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
12840 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 2d  M_BKPT;.  }.  p-
12850 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
12860 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
12870 20 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   db;.#ifndef SQL
12880 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
12890 43 41 43 48 45 0a 20 20 70 2d 3e 6c 6f 63 6b 2e  CACHE.  p->lock.
128a0 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 2d  pBtree = p;.  p-
128b0 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 20 3d 20 31  >lock.iTable = 1
128c0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  ;.#endif..#if !d
128d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
128e0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
128f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
12900 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
12910 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  /*.  ** If th
12920 69 73 20 42 74 72 65 65 20 69 73 20 61 20 63 61  is Btree is a ca
12930 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68 61 72  ndidate for shar
12940 65 64 20 63 61 63 68 65 2c 20 74 72 79 20 74 6f  ed cache, try to
12950 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20 65 78   find an.  ** ex
12960 69 73 74 69 6e 67 20 42 74 53 68 61 72 65 64 20  isting BtShared 
12970 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65 20 63  object that we c
12980 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a 20 20  an share with.  
12990 2a 2f 0a 20 20 69 66 28 20 69 73 54 65 6d 70 44  */.  if( isTempD
129a0 62 3d 3d 30 20 26 26 20 28 69 73 4d 65 6d 64 62  b==0 && (isMemdb
129b0 3d 3d 30 20 7c 7c 20 28 76 66 73 46 6c 61 67 73  ==0 || (vfsFlags
129c0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  &SQLITE_OPEN_URI
129d0 29 21 3d 30 29 20 29 7b 0a 20 20 20 20 69 66 28  )!=0) ){.    if(
129e0 20 76 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49   vfsFlags & SQLI
129f0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
12a00 43 48 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  CHE ){.      int
12a10 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 73 71 6c   nFilename = sql
12a20 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
12a30 6c 65 6e 61 6d 65 29 2b 31 3b 0a 20 20 20 20 20  lename)+1;.     
12a40 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74 68 6e 61   int nFullPathna
12a50 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
12a60 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 20 20 63  hname+1;.      c
12a70 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61  har *zFullPathna
12a80 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  me = sqlite3Mall
12a90 6f 63 28 4d 41 58 28 6e 46 75 6c 6c 50 61 74 68  oc(MAX(nFullPath
12aa0 6e 61 6d 65 2c 6e 46 69 6c 65 6e 61 6d 65 29 29  name,nFilename))
12ab0 3b 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f  ;.      MUTEX_LO
12ac0 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  GIC( sqlite3_mut
12ad0 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
12ae0 20 29 0a 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   )..      p->sha
12af0 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20  rable = 1;.     
12b00 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
12b10 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
12b20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
12b30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
12b40 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
12b50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b60 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a 20  if( isMemdb ){. 
12b70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 46         memcpy(zF
12b80 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 7a 46 69  ullPathname, zFi
12b90 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65 6e 61 6d  lename, nFilenam
12ba0 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
12bb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12bc0 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12bd0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12be0 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
12bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c00 20 20 20 20 20 20 20 20 6e 46 75 6c 6c 50 61 74          nFullPat
12c10 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  hname, zFullPath
12c20 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  name);.        i
12c30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
12c40 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
12c50 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
12c60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12c70 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12c80 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12c90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12ca0 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  }.#if SQLITE_THR
12cb0 45 41 44 53 41 46 45 0a 20 20 20 20 20 20 6d 75  EADSAFE.      mu
12cc0 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c 69 74 65  texOpen = sqlite
12cd0 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12ce0 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
12cf0 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20 73 71 6c  OPEN);.      sql
12d00 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
12d10 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20 20 20  (mutexOpen);.   
12d20 20 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d     mutexShared =
12d30 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
12d40 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
12d50 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
12d60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
12d70 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
12d80 68 61 72 65 64 29 3b 0a 23 65 6e 64 69 66 0a 20  hared);.#endif. 
12d90 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
12da0 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
12db0 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
12dc0 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
12dd0 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
12de0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
12df0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
12e00 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
12e10 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
12e20 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
12e30 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
12e40 72 2c 20 30 29 29 0a 20 20 20 20 20 20 20 20 20  r, 0)).         
12e50 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
12e60 65 33 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e  e3PagerVfs(pBt->
12e70 70 50 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b  pPager)==pVfs ){
12e80 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
12e90 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  Db;.          fo
12ea0 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62 2d 31 3b  r(iDb=db->nDb-1;
12eb0 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d 2d 29 7b   iDb>=0; iDb--){
12ec0 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 74 72  .            Btr
12ed0 65 65 20 2a 70 45 78 69 73 74 69 6e 67 20 3d 20  ee *pExisting = 
12ee0 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74  db->aDb[iDb].pBt
12ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
12f00 28 20 70 45 78 69 73 74 69 6e 67 20 26 26 20 70  ( pExisting && p
12f10 45 78 69 73 74 69 6e 67 2d 3e 70 42 74 3d 3d 70  Existing->pBt==p
12f20 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
12f30 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f40 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
12f50 72 65 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  red);.          
12f60 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12f70 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70 65  x_leave(mutexOpe
12f80 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
12f90 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
12fa0 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
12fc0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
12fe0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
12ff0 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 20 20  AINT;.          
13000 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
13010 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74            p->pBt
13020 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
13030 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pBt->nRef++;. 
13040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
13050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13060 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
13070 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
13080 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20  xShared);.      
13090 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75  sqlite3_free(zFu
130a0 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
130b0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
130c0 5f 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  _DEBUG.    else{
130d0 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62  .      /* In deb
130e0 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b  ug mode, we mark
130f0 20 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20   all persistent 
13100 64 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61  databases as sha
13110 72 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65  rable.      ** e
13120 76 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72  ven when they ar
13130 65 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65  e not.  This exe
13140 72 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69  rcises the locki
13150 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20  ng code and.    
13160 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20    ** gives more 
13170 6f 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20  opportunity for 
13180 61 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f  asserts(sqlite3_
13190 6d 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20  mutex_held()).  
131a0 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
131b0 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e  s to find lockin
131c0 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20  g problems..    
131d0 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68    */.      p->sh
131e0 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  arable = 1;.    
131f0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e  }.#endif.  }.#en
13200 64 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30  dif.  if( pBt==0
13210 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   ){.    /*.    *
13220 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
13230 61 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72  asserts make sur
13240 65 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65  e that structure
13250 73 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74  s used by the bt
13260 72 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74  ree are.    ** t
13270 68 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20  he right size.  
13280 54 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64  This is to guard
13290 20 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68   against size ch
132a0 61 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c  anges that resul
132b0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f  t.    ** when co
132c0 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66  mpiling on a dif
132d0 66 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74  ferent architect
132e0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
132f0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69  assert( sizeof(i
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 36 34  sert( sizeof(u64
13320 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61 73 73 65  )==8 );.    asse
13330 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32 29 3d  rt( sizeof(u32)=
13340 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =4 );.    assert
13350 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32  ( sizeof(u16)==2
13360 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13370 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20  sizeof(Pgno)==4 
13380 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20 3d 20  );.  .    pBt = 
13390 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
133a0 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74 29 20  o( sizeof(*pBt) 
133b0 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 3d 3d  );.    if( pBt==
133c0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
133d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
133e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74  T;.      goto bt
133f0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13400 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
13410 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56  ite3PagerOpen(pV
13420 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72  fs, &pBt->pPager
13430 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  , zFilename,.   
13440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13450 20 20 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a         EXTRA_SIZ
13460 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61  E, flags, vfsFla
13470 67 73 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b  gs, pageReinit);
13480 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
13490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
134a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d  sqlite3PagerSetM
134b0 6d 61 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50  mapLimit(pBt->pP
134c0 61 67 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70  ager, db->szMmap
134d0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
134e0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
134f0 6c 65 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50  leheader(pBt->pP
13500 61 67 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48  ager,sizeof(zDbH
13510 65 61 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72  eader),zDbHeader
13520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
13530 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
13540 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72  {.      goto btr
13550 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20  ee_open_out;.   
13560 20 7d 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e   }.    pBt->open
13570 46 6c 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67  Flags = (u8)flag
13580 73 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  s;.    pBt->db =
13590 20 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   db;.    sqlite3
135a0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
135b0 6c 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ler(pBt->pPager,
135c0 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79   btreeInvokeBusy
135d0 48 61 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20  Handler, pBt);. 
135e0 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
135f0 0a 20 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75  .  .    pBt->pCu
13600 72 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  rsor = 0;.    pB
13610 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
13620 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
13630 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
13640 74 2d 3e 70 50 61 67 65 72 29 20 29 20 70 42 74  t->pPager) ) pBt
13650 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
13660 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66  S_READ_ONLY;.#if
13670 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
13680 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74  E_DELETE.    pBt
13690 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
136a0 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b  S_SECURE_DELETE;
136b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45  .#endif.    /* E
136c0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31  VIDENCE-OF: R-51
136d0 38 37 33 2d 33 39 36 31 38 20 54 68 65 20 70 61  873-39618 The pa
136e0 67 65 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61  ge size for a da
136f0 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20  tabase file is. 
13700 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64     ** determined
13710 20 62 79 20 74 68 65 20 32 2d 62 79 74 65 20 69   by the 2-byte i
13720 6e 74 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61  nteger located a
13730 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31  t an offset of 1
13740 36 20 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20  6 bytes from.   
13750 20 2a 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   ** the beginnin
13760 67 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  g of the databas
13770 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70  e file. */.    p
13780 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
13790 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38  zDbHeader[16]<<8
137a0 29 20 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31  ) | (zDbHeader[1
137b0 37 5d 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28  7]<<16);.    if(
137c0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35   pBt->pageSize<5
137d0 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53  12 || pBt->pageS
137e0 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
137f0 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20  AGE_SIZE.       
13800 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65    || ((pBt->page
13810 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67  Size-1)&pBt->pag
13820 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20  eSize)!=0 ){.   
13830 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
13840 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13850 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13860 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66  CUUM.      /* If
13870 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20   the magic name 
13880 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20  ":memory:" will 
13890 63 72 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d  create an in-mem
138a0 6f 72 79 20 64 61 74 61 62 61 73 65 2c 20 74 68  ory database, th
138b0 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76  en.      ** leav
138c0 65 20 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d  e the autoVacuum
138d0 20 6d 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e   mode at 0 (do n
138e0 6f 74 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c  ot auto-vacuum),
138f0 20 65 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a   even if.      *
13900 2a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  * SQLITE_DEFAULT
13910 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74  _AUTOVACUUM is t
13920 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65  rue. On the othe
13930 72 20 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20  r hand, if.     
13940 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   ** SQLITE_OMIT_
13950 4d 45 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65  MEMORYDB has bee
13960 6e 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  n defined, then 
13970 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75  ":memory:" is ju
13980 73 74 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65  st a.      ** re
13990 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e  gular file-name.
139a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
139b0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70  e auto-vacuum ap
139c0 70 6c 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72  plies as per nor
139d0 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  mal..      */.  
139e0 20 20 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d      if( zFilenam
139f0 65 20 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b  e && !isMemdb ){
13a00 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75  .        pBt->au
13a10 74 6f 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49  toVacuum = (SQLI
13a20 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
13a30 41 43 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a  ACUUM ? 1 : 0);.
13a40 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
13a50 72 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54  rVacuum = (SQLIT
13a60 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41  E_DEFAULT_AUTOVA
13a70 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29  CUUM==2 ? 1 : 0)
13a80 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
13a90 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20  .      nReserve 
13aa0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
13ab0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
13ac0 45 2d 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32  E-OF: R-37497-42
13ad0 34 31 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20  412 The size of 
13ae0 74 68 65 20 72 65 73 65 72 76 65 64 20 72 65 67  the reserved reg
13af0 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ion is.      ** 
13b00 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
13b10 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67  e one-byte unsig
13b20 6e 65 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e  ned integer foun
13b30 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f  d at an offset o
13b40 66 20 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e  f 20.      ** in
13b50 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13b60 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a  file header. */.
13b70 20 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d        nReserve =
13b80 20 7a 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a   zDbHeader[20];.
13b90 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
13ba0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
13bb0 49 5a 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64  IZE_FIXED;.#ifnd
13bc0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
13bd0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
13be0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
13bf0 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
13c00 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
13c10 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
13c20 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
13c30 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13c40 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
13c50 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
13c60 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
13c70 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
13c80 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
13c90 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
13ca0 20 6e 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20   nReserve);.    
13cb0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74  if( rc ) goto bt
13cc0 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
13cd0 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
13ce0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
13cf0 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
13d00 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
13d10 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
13d20 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
13d30 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
13d40 53 69 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20  Size */.   .#if 
13d50 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
13d60 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
13d70 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
13d80 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
13d90 4f 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  O).    /* Add th
13da0 65 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f  e new BtShared o
13db0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e  bject to the lin
13dc0 6b 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c  ked list sharabl
13dd0 65 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20  e BtShareds..   
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
13df0 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
13e00 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71   MUTEX_LOGIC( sq
13e10 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
13e20 65 78 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20  exShared; ).    
13e30 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
13e40 0a 20 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47  .      MUTEX_LOG
13e50 49 43 28 20 6d 75 74 65 78 53 68 61 72 65 64 20  IC( mutexShared 
13e60 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
13e70 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
13e80 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
13e90 29 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ).      if( SQLI
13ea0 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26  TE_THREADSAFE &&
13eb0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13ec0 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
13ed0 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  ){.        pBt->
13ee0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
13ef0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
13f00 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
13f10 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d        if( pBt->m
13f20 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
13f30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
13f40 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
13f50 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65         goto btre
13f60 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13f70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13f80 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
13f90 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53 68 61  x_enter(mutexSha
13fa0 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  red);.      pBt-
13fb0 3e 70 4e 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28  >pNext = GLOBAL(
13fc0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
13fd0 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
13fe0 29 3b 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28  );.      GLOBAL(
13ff0 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14000 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14010 29 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73  ) = pBt;.      s
14020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14030 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
14040 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
14050 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
14060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
14070 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
14080 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
14090 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49  T_DISKIO).  /* I
140a0 66 20 74 68 65 20 6e 65 77 20 42 74 72 65 65 20  f the new Btree 
140b0 75 73 65 73 20 61 20 73 68 61 72 61 62 6c 65 20  uses a sharable 
140c0 70 42 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20  pBtShared, then 
140d0 6c 69 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a  link the new.  *
140e0 2a 20 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65  * Btree into the
140f0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61   list of all sha
14100 72 61 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72  rable Btrees for
14110 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63   the same connec
14120 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c  tion..  ** The l
14130 69 73 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61  ist is kept in a
14140 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62  scending order b
14150 79 20 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20  y pBt address.. 
14160 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61   */.  if( p->sha
14170 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74  rable ){.    int
14180 20 69 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70   i;.    Btree *p
14190 53 69 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Sib;.    for(i=0
141a0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
141b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 53  ){.      if( (pS
141c0 69 62 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ib = db->aDb[i].
141d0 70 42 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d  pBt)!=0 && pSib-
141e0 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
141f0 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
14200 2d 3e 70 50 72 65 76 20 29 7b 20 70 53 69 62 20  ->pPrev ){ pSib 
14210 3d 20 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d  = pSib->pPrev; }
14220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14230 70 42 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b  pBt<pSib->pBt ){
14240 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e  .          p->pN
14250 65 78 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20  ext = pSib;.    
14260 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
14270 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53   0;.          pS
14280 69 62 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20  ib->pPrev = p;. 
14290 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
142a0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70          while( p
142b0 53 69 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53  Sib->pNext && pS
142c0 69 62 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70  ib->pNext->pBt<p
142d0 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ->pBt ){.       
142e0 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69 62       pSib = pSib
142f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
14300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
14310 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e  ->pNext = pSib->
14320 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
14330 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62   p->pPrev = pSib
14340 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
14350 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  p->pNext ){.    
14360 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
14370 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
14380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14390 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d     pSib->pNext =
143a0 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   p;.        }.  
143b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
143c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
143d0 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65  endif.  *ppBtree
143e0 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65   = p;..btree_ope
143f0 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  n_out:.  if( rc!
14400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14410 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42 74    if( pBt && pBt
14420 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
14430 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c    sqlite3PagerCl
14440 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ose(pBt->pPager)
14450 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14460 74 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20  te3_free(pBt);. 
14470 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14480 70 29 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65  p);.    *ppBtree
14490 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
144a0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54     /* If the B-T
144b0 72 65 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ree was successf
144c0 75 6c 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74  ully opened, set
144d0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
144e0 20 73 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20   size to the.   
144f0 20 2a 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75   ** default valu
14500 65 2e 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20  e. Except, when 
14510 6f 70 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78  opening on an ex
14520 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70 61  isting shared pa
14530 67 65 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a  ger-cache,.    *
14540 2a 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  * do not change 
14550 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
14560 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
14570 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
14580 65 53 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29  eSchema(p, 0, 0)
14590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
145a0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
145b0 65 73 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50  esize(p->pBt->pP
145c0 61 67 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46  ager, SQLITE_DEF
145d0 41 55 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29  AULT_CACHE_SIZE)
145e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
145f0 28 20 6d 75 74 65 78 4f 70 65 6e 20 29 7b 0a 20  ( mutexOpen ){. 
14600 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
14610 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 6d 75  e3_mutex_held(mu
14620 74 65 78 4f 70 65 6e 29 20 29 3b 0a 20 20 20 20  texOpen) );.    
14630 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14640 61 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ave(mutexOpen);.
14650 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
14660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d  .}../*.** Decrem
14670 65 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64  ent the BtShared
14680 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20  .nRef counter.  
14690 57 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20  When it reaches 
146a0 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20  zero,.** remove 
146b0 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72  the BtShared str
146c0 75 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20  ucture from the 
146d0 73 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52  sharing list.  R
146e0 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66  eturn.** true if
146f0 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52   the BtShared.nR
14700 65 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68  ef counter reach
14710 65 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75  es zero and retu
14720 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  rn.** false if i
14730 74 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74  t is still posit
14740 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
14750 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  nt removeFromSha
14760 72 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65  ringList(BtShare
14770 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66  d *pBt){.#ifndef
14780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
14790 52 45 44 5f 43 41 43 48 45 0a 20 20 4d 55 54 45  RED_CACHE.  MUTE
147a0 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
147b0 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
147c0 20 29 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70   ).  BtShared *p
147d0 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
147e0 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
147f0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
14800 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
14810 75 74 65 78 29 20 29 3b 0a 20 20 4d 55 54 45 58  utex) );.  MUTEX
14820 5f 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20  _LOGIC( pMaster 
14830 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
14840 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
14850 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b  _STATIC_MASTER);
14860 20 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   ).  sqlite3_mut
14870 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72  ex_enter(pMaster
14880 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d  );.  pBt->nRef--
14890 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52 65  ;.  if( pBt->nRe
148a0 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f<=0 ){.    if( 
148b0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
148c0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
148d0 63 68 65 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b  cheList)==pBt ){
148e0 0a 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74  .      GLOBAL(Bt
148f0 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14900 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20  haredCacheList) 
14910 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pBt->pNext;.  
14920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
14930 4c 69 73 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74  List = GLOBAL(Bt
14940 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53  Shared*,sqlite3S
14950 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b  haredCacheList);
14960 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 41 4c  .      while( AL
14970 57 41 59 53 28 70 4c 69 73 74 29 20 26 26 20 70  WAYS(pList) && p
14980 4c 69 73 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74  List->pNext!=pBt
14990 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73   ){.        pLis
149a0 74 3d 70 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a  t=pList->pNext;.
149b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
149c0 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29 20  ( ALWAYS(pList) 
149d0 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
149e0 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
149f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
14a00 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
14a10 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
14a20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
14a30 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
14a40 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
14a50 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
14a60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14a70 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
14a80 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
14a90 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
14aa0 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
14ab0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
14ac0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
14ad0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
14ae0 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
14af0 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
14b00 62 79 74 65 73 20 77 69 74 68 20 61 20 34 2d 62  bytes with a 4-b
14b10 79 74 65 20 70 72 65 66 69 78 20 66 6f 72 20 61  yte prefix for a
14b20 20 6c 65 66 74 2d 63 68 69 6c 64 0a 2a 2a 20 70   left-child.** p
14b30 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
14b40 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54  c void allocateT
14b50 65 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65  empSpace(BtShare
14b60 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21  d *pBt){.  if( !
14b70 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29  pBt->pTmpSpace )
14b80 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53  {.    pBt->pTmpS
14b90 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61  pace = sqlite3Pa
14ba0 67 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70  geMalloc( pBt->p
14bb0 61 67 65 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20  ageSize );..    
14bc0 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 75 73  /* One of the us
14bd0 65 73 20 6f 66 20 70 42 74 2d 3e 70 54 6d 70 53  es of pBt->pTmpS
14be0 70 61 63 65 20 69 73 20 74 6f 20 66 6f 72 6d 61  pace is to forma
14bf0 74 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 0a 20  t cells before. 
14c00 20 20 20 2a 2a 20 69 6e 73 65 72 74 69 6e 67 20     ** inserting 
14c10 74 68 65 6d 20 69 6e 74 6f 20 61 20 6c 65 61 66  them into a leaf
14c20 20 70 61 67 65 20 28 66 75 6e 63 74 69 6f 6e 20   page (function 
14c30 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 29 2e 20 49  fillInCell()). I
14c40 66 0a 20 20 20 20 2a 2a 20 61 20 63 65 6c 6c 20  f.    ** a cell 
14c50 69 73 20 6c 65 73 73 20 74 68 61 6e 20 34 20 62  is less than 4 b
14c60 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 69 74  ytes in size, it
14c70 20 69 73 20 72 6f 75 6e 64 65 64 20 75 70 20 74   is rounded up t
14c80 6f 20 34 20 62 79 74 65 73 0a 20 20 20 20 2a 2a  o 4 bytes.    **
14c90 20 62 79 20 74 68 65 20 76 61 72 69 6f 75 73 20   by the various 
14ca0 72 6f 75 74 69 6e 65 73 20 74 68 61 74 20 6d 61  routines that ma
14cb0 6e 69 70 75 6c 61 74 65 20 62 69 6e 61 72 79 20  nipulate binary 
14cc0 63 65 6c 6c 73 2e 20 57 68 69 63 68 0a 20 20 20  cells. Which.   
14cd0 20 2a 2a 20 63 61 6e 20 6d 65 61 6e 20 74 68 61   ** can mean tha
14ce0 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 20 6f  t fillInCell() o
14cf0 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 73 20  nly initializes 
14d00 74 68 65 20 66 69 72 73 74 20 32 20 6f 72 20 33  the first 2 or 3
14d10 0a 20 20 20 20 2a 2a 20 62 79 74 65 73 20 6f 66  .    ** bytes of
14d20 20 70 54 6d 70 53 70 61 63 65 2c 20 62 75 74 20   pTmpSpace, but 
14d30 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 34  that the first 4
14d40 20 62 79 74 65 73 20 61 72 65 20 63 6f 70 69 65   bytes are copie
14d50 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 69 74  d from.    ** it
14d60 20 69 6e 74 6f 20 61 20 64 61 74 61 62 61 73 65   into a database
14d70 20 70 61 67 65 2e 20 54 68 69 73 20 69 73 20 6e   page. This is n
14d80 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 70 72  ot actually a pr
14d90 6f 62 6c 65 6d 2c 20 62 75 74 20 69 74 0a 20 20  oblem, but it.  
14da0 20 20 2a 2a 20 64 6f 65 73 20 63 61 75 73 65 20    ** does cause 
14db0 61 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72  a valgrind error
14dc0 20 77 68 65 6e 20 74 68 65 20 31 20 6f 72 20 32   when the 1 or 2
14dd0 20 62 79 74 65 73 20 6f 66 20 75 6e 69 74 69 61   bytes of unitia
14de0 6c 69 7a 65 64 20 0a 20 20 20 20 2a 2a 20 64 61  lized .    ** da
14df0 74 61 20 69 73 20 70 61 73 73 65 64 20 74 6f 20  ta is passed to 
14e00 73 79 73 74 65 6d 20 63 61 6c 6c 20 77 72 69 74  system call writ
14e10 65 28 29 2e 20 53 6f 20 74 6f 20 61 76 6f 69 64  e(). So to avoid
14e20 20 74 68 69 73 20 65 72 72 6f 72 2c 0a 20 20 20   this error,.   
14e30 20 2a 2a 20 7a 65 72 6f 20 74 68 65 20 66 69 72   ** zero the fir
14e40 73 74 20 34 20 62 79 74 65 73 20 6f 66 20 74 65  st 4 bytes of te
14e50 6d 70 20 73 70 61 63 65 20 68 65 72 65 2e 0a 20  mp space here.. 
14e60 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73     **.    ** Als
14e70 6f 3a 20 20 50 72 6f 76 69 64 65 20 66 6f 75 72  o:  Provide four
14e80 20 62 79 74 65 73 20 6f 66 20 69 6e 69 74 69 61   bytes of initia
14e90 6c 69 7a 65 64 20 73 70 61 63 65 20 62 65 66 6f  lized space befo
14ea0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 65  re the.    ** be
14eb0 67 69 6e 6e 69 6e 67 20 6f 66 20 70 54 6d 70 53  ginning of pTmpS
14ec0 70 61 63 65 20 61 73 20 61 6e 20 61 72 65 61 20  pace as an area 
14ed0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 70 72 65  available to pre
14ee0 70 65 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20  pend the.    ** 
14ef0 6c 65 66 74 2d 63 68 69 6c 64 20 70 6f 69 6e 74  left-child point
14f00 65 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  er to the beginn
14f10 69 6e 67 20 6f 66 20 61 20 63 65 6c 6c 2e 0a 20  ing of a cell.. 
14f20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42     */.    if( pB
14f30 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a  t->pTmpSpace ){.
14f40 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 42 74        memset(pBt
14f50 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 30 2c 20  ->pTmpSpace, 0, 
14f60 38 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70  8);.      pBt->p
14f70 54 6d 70 53 70 61 63 65 20 2b 3d 20 34 3b 0a 20  TmpSpace += 4;. 
14f80 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
14f90 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
14fa0 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
14fb0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
14fc0 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
14fd0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
14fe0 7b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d  {.  if( pBt->pTm
14ff0 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70 42  pSpace ){.    pB
15000 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 2d 3d 20  t->pTmpSpace -= 
15010 34 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  4;.    sqlite3Pa
15020 67 65 46 72 65 65 28 70 42 74 2d 3e 70 54 6d 70  geFree(pBt->pTmp
15030 53 70 61 63 65 29 3b 0a 20 20 20 20 70 42 74 2d  Space);.    pBt-
15040 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a  >pTmpSpace = 0;.
15050 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
15060 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74 61 62  se an open datab
15070 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61  ase and invalida
15080 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a  te all cursors..
15090 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
150a0 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65 20 2a  reeClose(Btree *
150b0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
150c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
150d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
150e0 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
150f0 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 20 76  cursors opened v
15100 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65 2e 20  ia this handle. 
15110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
15120 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
15130 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
15140 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15150 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 43 75 72  Enter(p);.  pCur
15160 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
15170 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
15180 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
15190 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
151a0 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
151b0 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
151c0 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
151d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
151e0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
151f0 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
15200 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
15210 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
15220 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
15230 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
15240 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
15250 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
15260 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
15270 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
15280 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
15290 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
152a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
152b0 6f 6c 6c 62 61 63 6b 28 70 2c 20 53 51 4c 49 54  ollback(p, SQLIT
152c0 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69  E_OK, 0);.  sqli
152d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
152e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
152f0 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72   are still other
15300 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
15310 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
15320 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a  hared-btree.  **
15330 20 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75   structure, retu
15340 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61  rn now. The rema
15350 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72  inder of this pr
15360 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a  ocedure cleans .
15370 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72    ** up the shar
15380 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20  ed-btree..  */. 
15390 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74   assert( p->want
153a0 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e  ToLock==0 && p->
153b0 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69  locked==0 );.  i
153c0 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20  f( !p->sharable 
153d0 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61  || removeFromSha
153e0 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b  ringList(pBt) ){
153f0 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20  .    /* The pBt 
15400 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20  is no longer on 
15410 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
15420 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65  , so we can acce
15430 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74  ss.    ** it wit
15440 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68  hout having to h
15450 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20  old the mutex.. 
15460 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65     **.    ** Cle
15470 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74  an out and delet
15480 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f  e the BtShared o
15490 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  bject..    */.  
154a0 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
154b0 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73  pCursor );.    s
154c0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
154d0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
154e0 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65     if( pBt->xFre
154f0 65 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e  eSchema && pBt->
15500 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
15510 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d   pBt->xFreeSchem
15520 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b  a(pBt->pSchema);
15530 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
15540 65 33 44 62 46 72 65 65 28 30 2c 20 70 42 74 2d  e3DbFree(0, pBt-
15550 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66  >pSchema);.    f
15560 72 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74  reeTempSpace(pBt
15570 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15580 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23  ree(pBt);.  }..#
15590 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
155a0 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
155b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e    assert( p->wan
155c0 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  tToLock==0 );.  
155d0 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65  assert( p->locke
155e0 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  d==0 );.  if( p-
155f0 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65  >pPrev ) p->pPre
15600 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e  v->pNext = p->pN
15610 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e  ext;.  if( p->pN
15620 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e  ext ) p->pNext->
15630 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76  pPrev = p->pPrev
15640 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  ;.#endif..  sqli
15650 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72  te3_free(p);.  r
15660 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15670 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
15680 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69 6d 69   the "soft" limi
15690 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  t on the number 
156a0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
156b0 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73 65 64  cache..** Unused
156c0 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65 64 20   and unmodified 
156d0 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 72 65  pages will be re
156e0 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68 65 20  cycled when the 
156f0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
15700 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
15710 65 78 63 65 65 64 73 20 74 68 69 73 20 73 6f 66  exceeds this sof
15720 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20 74 68  t limit.  But th
15730 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
15740 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f 77 65   cache is allowe
15750 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67 65 72  d to grow larger
15760 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d 69 74   than this limit
15770 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a   if it contains.
15780 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73 20 6f  ** dirty pages o
15790 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20 69 6e  r pages still in
157a0 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a 2f 0a   active use..*/.
157b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
157c0 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74 72  SetCacheSize(Btr
157d0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
157e0 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  e){.  BtShared *
157f0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15800 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15810 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15820 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15830 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15840 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15850 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
15860 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15870 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15880 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15890 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
158a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
158b0 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c 69 6d   the "spill" lim
158c0 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72  it on the number
158d0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
158e0 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20 74 68   cache..** If th
158f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
15900 73 20 65 78 63 65 65 64 73 20 74 68 69 73 20 6c  s exceeds this l
15910 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20 77 72  imit during a wr
15920 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
15930 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 6d 69  .** the pager mi
15940 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f 20 22  ght attempt to "
15950 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74 6f 20  spill" pages to 
15960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61 72 6c  the journal earl
15970 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20 74 6f  y in.** order to
15980 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72 79 2e   free up memory.
15990 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  .**.** The value
159a0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
159b0 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
159c0 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20 69 73  ize.  If zero is
159d0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 61 6e   passed.** as an
159e0 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20 63 68   argument, no ch
159f0 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 74  anges are made t
15a00 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69 7a 65  o the spill size
15a10 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a 2a 20   setting, so.** 
15a20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f 66 20  using mxPage of 
15a30 30 20 69 73 20 61 20 77 61 79 20 74 6f 20 71 75  0 is a way to qu
15a40 65 72 79 20 74 68 65 20 63 75 72 72 65 6e 74 20  ery the current 
15a50 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f 0a 69  spill size..*/.i
15a60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
15a70 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74 72 65  etSpillSize(Btre
15a80 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65  e *p, int mxPage
15a90 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
15aa0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
15ab0 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65 72 74  nt res;.  assert
15ac0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
15ad0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
15ae0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
15af0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
15b00 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50 61 67  res = sqlite3Pag
15b10 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65 28 70  erSetSpillsize(p
15b20 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50 61  Bt->pPager, mxPa
15b30 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ge);.  sqlite3Bt
15b40 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15b50 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 23 69  eturn res;.}..#i
15b60 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
15b70 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 43  P_SIZE>0./*.** C
15b80 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20  hange the limit 
15b90 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  on the amount of
15ba0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15bb0 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65 0a 2a  le that may be.*
15bc0 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2e  * memory mapped.
15bd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
15be0 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d 69 74  treeSetMmapLimit
15bf0 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c 69 74  (Btree *p, sqlit
15c00 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 29  e3_int64 szMmap)
15c10 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
15c20 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73  t = p->pBt;.  as
15c30 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
15c40 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
15c50 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
15c60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
15c70 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
15c80 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70 42 74  SetMmapLimit(pBt
15c90 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d 61 70  ->pPager, szMmap
15ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15cb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
15cc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15cd0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
15ce0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15cf0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  0 */../*.** Chan
15d00 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
15d10 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
15d20 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
15d30 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
15d40 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
15d50 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
15d60 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
15d70 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
15d80 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
15d90 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
15da0 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
15db0 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
15dc0 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
15dd0 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
15de0 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
15df0 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
15e00 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
15e10 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
15e20 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
15e30 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
15e40 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
15e50 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
15e60 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
15e70 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
15e80 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
15e90 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
15ea0 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
15eb0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
15ec0 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
15ed0 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
15ee0 33 42 74 72 65 65 53 65 74 50 61 67 65 72 46 6c  3BtreeSetPagerFl
15ef0 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  ags(.  Btree *p,
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15f10 20 54 68 65 20 62 74 72 65 65 20 74 6f 20 73 65   The btree to se
15f20 74 20 74 68 65 20 73 61 66 65 74 79 20 6c 65 76  t the safety lev
15f30 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  el on */.  unsig
15f40 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20 20 20  ned pgFlags     
15f50 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50 41 47    /* Various PAG
15f60 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 29 7b  ER_* flags */.){
15f70 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
15f80 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73   = p->pBt;.  ass
15f90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
15fa0 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d  ex_held(p->db->m
15fb0 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
15fc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15fd0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  .  sqlite3PagerS
15fe0 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70 50 61  etFlags(pBt->pPa
15ff0 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b 0a 20  ger, pgFlags);. 
16000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16010 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
16030 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
16040 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
16050 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
16060 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
16070 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
16080 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
16090 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
160a0 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
160b0 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
160c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
160d0 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
160e0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
160f0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
16100 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
16110 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
16120 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
16130 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
16140 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16150 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
16160 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
16170 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16180 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
16190 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
161a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
161b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
161c0 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
161d0 68 65 20 64 65 66 61 75 6c 74 20 70 61 67 65 73  he default pages
161e0 20 73 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75   size and the nu
161f0 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65 64  mber of reserved
16200 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 2e   bytes per page.
16210 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 70  .** Or, if the p
16220 61 67 65 20 73 69 7a 65 20 68 61 73 20 61 6c 72  age size has alr
16230 65 61 64 79 20 62 65 65 6e 20 66 69 78 65 64 2c  eady been fixed,
16240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
16250 45 41 44 4f 4e 4c 59 20 0a 2a 2a 20 77 69 74 68  EADONLY .** with
16260 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 61 6e 79  out changing any
16270 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  thing..**.** The
16280 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   page size must 
16290 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
162a0 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
162b0 36 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70  65536.  If the p
162c0 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70  age.** size supp
162d0 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65  lied does not me
162e0 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  et this constrai
162f0 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  nt then the page
16300 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   size is not.** 
16310 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50  changed..**.** P
16320 61 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f  age sizes are co
16330 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20  nstrained to be 
16340 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73  a power of two s
16350 6f 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f  o that the regio
16360 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61  n.** of the data
16370 62 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66  base file used f
16380 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69  or locking (begi
16390 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47  nning at PENDING
163a0 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69  _BYTE,.** the fi
163b0 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
163c0 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20  e 1GB boundary, 
163d0 30 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64  0x40000000) need
163e0 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74  s to occur.** at
163f0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
16400 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  f a page..**.** 
16410 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65  If parameter nRe
16420 73 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68  serve is less th
16430 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
16440 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65  e number of rese
16450 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65  rved.** bytes pe
16460 72 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75  r page is left u
16470 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
16480 49 66 20 74 68 65 20 69 46 69 78 21 3d 30 20 74  If the iFix!=0 t
16490 68 65 6e 20 74 68 65 20 42 54 53 5f 50 41 47 45  hen the BTS_PAGE
164a0 53 49 5a 45 5f 46 49 58 45 44 20 66 6c 61 67 20  SIZE_FIXED flag 
164b0 69 73 20 73 65 74 20 73 6f 20 74 68 61 74 20 74  is set so that t
164c0 68 65 20 70 61 67 65 20 73 69 7a 65 0a 2a 2a 20  he page size.** 
164d0 61 6e 64 20 61 75 74 6f 76 61 63 75 75 6d 20 6d  and autovacuum m
164e0 6f 64 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65  ode can no longe
164f0 72 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f  r be changed..*/
16500 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
16510 65 53 65 74 50 61 67 65 53 69 7a 65 28 42 74 72  eSetPageSize(Btr
16520 65 65 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53  ee *p, int pageS
16530 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76  ize, int nReserv
16540 65 2c 20 69 6e 74 20 69 46 69 78 29 7b 0a 20 20  e, int iFix){.  
16550 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16560 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
16570 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
16580 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65  assert( nReserve
16590 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76 65  >=-1 && nReserve
165a0 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69 74  <=255 );.  sqlit
165b0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
165c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  .#if SQLITE_HAS_
165d0 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 52 65 73  CODEC.  if( nRes
165e0 65 72 76 65 3e 70 42 74 2d 3e 6f 70 74 69 6d 61  erve>pBt->optima
165f0 6c 52 65 73 65 72 76 65 20 29 20 70 42 74 2d 3e  lReserve ) pBt->
16600 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 3d  optimalReserve =
16610 20 28 75 38 29 6e 52 65 73 65 72 76 65 3b 0a 23   (u8)nReserve;.#
16620 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74 2d  endif.  if( pBt-
16630 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
16640 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20 29  PAGESIZE_FIXED )
16650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
16660 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
16670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
16680 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66  ADONLY;.  }.  if
16690 28 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a  ( nReserve<0 ){.
166a0 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70      nReserve = p
166b0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70  Bt->pageSize - p
166c0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
166d0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
166e0 65 73 65 72 76 65 3e 3d 30 20 26 26 20 6e 52 65  eserve>=0 && nRe
166f0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
16700 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
16710 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
16720 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
16730 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
16740 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
16750 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
16760 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
16770 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
16780 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
16790 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
167a0 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28  Bt->pageSize = (
167b0 75 33 32 29 70 61 67 65 53 69 7a 65 3b 0a 20 20  u32)pageSize;.  
167c0 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
167d0 70 42 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  pBt);.  }.  rc =
167e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
167f0 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
16800 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
16810 53 69 7a 65 2c 20 6e 52 65 73 65 72 76 65 29 3b  Size, nReserve);
16820 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  .  pBt->usableSi
16830 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69  ze = pBt->pageSi
16840 7a 65 20 2d 20 28 75 31 36 29 6e 52 65 73 65 72  ze - (u16)nReser
16850 76 65 3b 0a 20 20 69 66 28 20 69 46 69 78 20 29  ve;.  if( iFix )
16860 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
16870 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
16880 49 58 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 42  IXED;.  sqlite3B
16890 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
168a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
168b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
168c0 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64  urrently defined
168d0 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e   page size.*/.in
168e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
168f0 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65 20  tPageSize(Btree 
16900 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
16910 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  >pBt->pageSize;.
16920 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
16930 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
16940 72 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  r to sqlite3Btre
16950 65 47 65 74 52 65 73 65 72 76 65 28 29 2c 20 65  eGetReserve(), e
16960 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
16970 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 63 61 6c   may only be cal
16980 6c 65 64 20 69 66 20 69 74 20 69 73 20 67 75 61  led if it is gua
16990 72 61 6e 74 65 65 64 20 74 68 61 74 20 74 68 65  ranteed that the
169a0 20 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73   b-tree mutex is
169b0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 68 65 6c 64   already.** held
169c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
169d0 75 73 65 66 75 6c 20 69 6e 20 6f 6e 65 20 73 70  useful in one sp
169e0 65 63 69 61 6c 20 63 61 73 65 20 69 6e 20 74 68  ecial case in th
169f0 65 20 62 61 63 6b 75 70 20 41 50 49 20 63 6f 64  e backup API cod
16a00 65 20 77 68 65 72 65 20 69 74 20 69 73 0a 2a 2a  e where it is.**
16a10 20 6b 6e 6f 77 6e 20 74 68 61 74 20 74 68 65 20   known that the 
16a20 73 68 61 72 65 64 20 62 2d 74 72 65 65 20 6d 75  shared b-tree mu
16a30 74 65 78 20 69 73 20 68 65 6c 64 2c 20 62 75 74  tex is held, but
16a40 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 74 68   the mutex on th
16a50 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  e .** database h
16a60 61 6e 64 6c 65 20 74 68 61 74 20 6f 77 6e 73 20  andle that owns 
16a70 2a 70 20 69 73 20 6e 6f 74 2e 20 49 6e 20 74 68  *p is not. In th
16a80 69 73 20 63 61 73 65 20 69 66 20 73 71 6c 69 74  is case if sqlit
16a90 65 33 42 74 72 65 65 45 6e 74 65 72 28 29 0a 2a  e3BtreeEnter().*
16aa0 2a 20 77 65 72 65 20 74 6f 20 62 65 20 63 61 6c  * were to be cal
16ab0 6c 65 64 2c 20 69 74 20 6d 69 67 68 74 20 63 6f  led, it might co
16ac0 6c 6c 69 64 65 20 77 69 74 68 20 73 6f 6d 65 20  llide with some 
16ad0 6f 74 68 65 72 20 6f 70 65 72 61 74 69 6f 6e 20  other operation 
16ae0 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
16af0 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20 6f  se handle that o
16b00 77 6e 73 20 2a 70 2c 20 63 61 75 73 69 6e 67 20  wns *p, causing 
16b10 75 6e 64 65 66 69 6e 65 64 20 62 65 68 61 76 69  undefined behavi
16b20 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
16b30 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
16b40 65 4e 6f 4d 75 74 65 78 28 42 74 72 65 65 20 2a  eNoMutex(Btree *
16b50 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 61  p){.  int n;.  a
16b60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16b70 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70 42 74  utex_held(p->pBt
16b80 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6e 20  ->mutex) );.  n 
16b90 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  = p->pBt->pageSi
16ba0 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61  ze - p->pBt->usa
16bb0 62 6c 65 53 69 7a 65 3b 0a 20 20 72 65 74 75 72  bleSize;.  retur
16bc0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n n;.}../*.** Re
16bd0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
16be0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
16bf0 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  e at the end of 
16c00 65 76 65 72 79 20 70 61 67 65 20 74 68 61 74 0a  every page that.
16c10 2a 2a 20 61 72 65 20 69 6e 74 65 6e 74 75 61 6c  ** are intentual
16c20 6c 79 20 6c 65 66 74 20 75 6e 75 73 65 64 2e 20  ly left unused. 
16c30 20 54 68 69 73 20 69 73 20 74 68 65 20 22 72 65   This is the "re
16c40 73 65 72 76 65 64 22 20 73 70 61 63 65 20 74 68  served" space th
16c50 61 74 20 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d  at is.** sometim
16c60 65 73 20 75 73 65 64 20 62 79 20 65 78 74 65 6e  es used by exten
16c70 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  sions..**.** If 
16c80 53 51 4c 49 54 45 5f 48 41 53 5f 4d 55 54 45 58  SQLITE_HAS_MUTEX
16c90 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
16ca0 20 74 68 65 20 6e 75 6d 62 65 72 20 72 65 74 75   the number retu
16cb0 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 67  rned is the.** g
16cc0 72 65 61 74 65 72 20 6f 66 20 74 68 65 20 63 75  reater of the cu
16cd0 72 72 65 6e 74 20 72 65 73 65 72 76 65 64 20 73  rrent reserved s
16ce0 70 61 63 65 20 61 6e 64 20 74 68 65 20 6d 61 78  pace and the max
16cf0 69 6d 75 6d 20 72 65 71 75 65 73 74 65 64 0a 2a  imum requested.*
16d00 2a 20 72 65 73 65 72 76 65 20 73 70 61 63 65 2e  * reserve space.
16d10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
16d20 74 72 65 65 47 65 74 4f 70 74 69 6d 61 6c 52 65  treeGetOptimalRe
16d30 73 65 72 76 65 28 42 74 72 65 65 20 2a 70 29 7b  serve(Btree *p){
16d40 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
16d50 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
16d60 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 42  ;.  n = sqlite3B
16d70 74 72 65 65 47 65 74 52 65 73 65 72 76 65 4e 6f  treeGetReserveNo
16d80 4d 75 74 65 78 28 70 29 3b 0a 23 69 66 64 65 66  Mutex(p);.#ifdef
16d90 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
16da0 43 0a 20 20 69 66 28 20 6e 3c 70 2d 3e 70 42 74  C.  if( n<p->pBt
16db0 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76 65  ->optimalReserve
16dc0 20 29 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 6f   ) n = p->pBt->o
16dd0 70 74 69 6d 61 6c 52 65 73 65 72 76 65 3b 0a 23  ptimalReserve;.#
16de0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 42  endif.  sqlite3B
16df0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
16e00 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
16e10 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
16e20 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
16e30 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
16e40 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
16e50 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
16e60 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
16e70 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
16e80 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
16e90 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
16ea0 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
16eb0 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
16ec0 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
16ed0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16ee0 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
16ef0 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
16f00 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
16f10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f20 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
16f30 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
16f40 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
16f50 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
16f60 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16f70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
16f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
16f90 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  e BTS_SECURE_DEL
16fa0 45 54 45 20 66 6c 61 67 20 69 66 20 6e 65 77 46  ETE flag if newF
16fb0 6c 61 67 20 69 73 20 30 20 6f 72 20 31 2e 20 20  lag is 0 or 1.  
16fc0 49 66 20 6e 65 77 46 6c 61 67 20 69 73 20 2d 31  If newFlag is -1
16fd0 2c 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 6e  ,.** then make n
16fe0 6f 20 63 68 61 6e 67 65 73 2e 20 20 41 6c 77 61  o changes.  Alwa
16ff0 79 73 20 72 65 74 75 72 6e 20 74 68 65 20 76 61  ys return the va
17000 6c 75 65 20 6f 66 20 74 68 65 20 42 54 53 5f 53  lue of the BTS_S
17010 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  ECURE_DELETE.** 
17020 73 65 74 74 69 6e 67 20 61 66 74 65 72 20 74 68  setting after th
17030 65 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 69 6e 74  e change..*/.int
17040 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 63   sqlite3BtreeSec
17050 75 72 65 44 65 6c 65 74 65 28 42 74 72 65 65 20  ureDelete(Btree 
17060 2a 70 2c 20 69 6e 74 20 6e 65 77 46 6c 61 67 29  *p, int newFlag)
17070 7b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 69 66 28  {.  int b;.  if(
17080 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
17090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
170a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
170b0 6e 65 77 46 6c 61 67 3e 3d 30 20 29 7b 0a 20 20  newFlag>=0 ){.  
170c0 20 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61    p->pBt->btsFla
170d0 67 73 20 26 3d 20 7e 42 54 53 5f 53 45 43 55 52  gs &= ~BTS_SECUR
170e0 45 5f 44 45 4c 45 54 45 3b 0a 20 20 20 20 69 66  E_DELETE;.    if
170f0 28 20 6e 65 77 46 6c 61 67 20 29 20 70 2d 3e 70  ( newFlag ) p->p
17100 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17110 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17120 45 3b 0a 20 20 7d 20 0a 20 20 62 20 3d 20 28 70  E;.  } .  b = (p
17130 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
17140 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
17150 45 54 45 29 21 3d 30 3b 0a 20 20 73 71 6c 69 74  ETE)!=0;.  sqlit
17160 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
17170 0a 20 20 72 65 74 75 72 6e 20 62 3b 0a 7d 0a 0a  .  return b;.}..
17180 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
17190 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
171a0 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64  roperty of the d
171b0 61 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20  atabase. If the 
171c0 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20  'autoVacuum'.** 
171d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
171e0 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f  -zero, then auto
171f0 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20  -vacuum mode is 
17200 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f  enabled. If zero
17210 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62  , it.** is disab
17220 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74  led. The default
17230 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61   value for the a
17240 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65  uto-vacuum prope
17250 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72  rty is .** deter
17260 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c  mined by the SQL
17270 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
17280 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f  VACUUM macro..*/
17290 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
172a0 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42  eSetAutoVacuum(B
172b0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74  tree *p, int aut
172c0 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66  oVacuum){.#ifdef
172d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
172e0 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e  OVACUUM.  return
172f0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
17300 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72  ;.#else.  BtShar
17310 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
17320 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
17330 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 61 76 20  ITE_OK;.  u8 av 
17340 3d 20 28 75 38 29 61 75 74 6f 56 61 63 75 75 6d  = (u8)autoVacuum
17350 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
17360 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
17370 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
17380 26 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  & BTS_PAGESIZE_F
17390 49 58 45 44 29 21 3d 30 20 26 26 20 28 61 76 20  IXED)!=0 && (av 
173a0 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74 6f  ?1:0)!=pBt->auto
173b0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
173c0 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
173d0 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  LY;.  }else{.   
173e0 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
173f0 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20 20   = av ?1:0;.    
17400 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
17410 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20 20  = av==2 ?1:0;.  
17420 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
17430 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17440 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
17450 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17460 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27  e value of the '
17470 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f  auto-vacuum' pro
17480 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76  perty. If auto-v
17490 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61  acuum is .** ena
174a0 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e  bled 1 is return
174b0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e  ed. Otherwise 0.
174c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
174d0 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75  treeGetAutoVacuu
174e0 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66  m(Btree *p){.#if
174f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17500 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74  AUTOVACUUM.  ret
17510 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41  urn BTREE_AUTOVA
17520 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65  CUUM_NONE;.#else
17530 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
17540 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17550 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20  );.  rc = (.    
17560 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  (!p->pBt->autoVa
17570 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
17580 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20  VACUUM_NONE:.   
17590 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56   (!p->pBt->incrV
175a0 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
175b0 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20  OVACUUM_FULL:.  
175c0 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55    BTREE_AUTOVACU
175d0 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73  UM_INCR.  );.  s
175e0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
175f0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
17600 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
17610 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e  ** Get a referen
17620 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20  ce to pPage1 of 
17630 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17640 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a  e.  This will.**
17650 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20   also acquire a 
17660 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  readlock on that
17670 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   file..**.** SQL
17680 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
17690 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
176a0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  If the file is n
176b0 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72  ot a.** well-for
176c0 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  med database fil
176d0 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43  e, then SQLITE_C
176e0 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e  ORRUPT is return
176f0 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed..** SQLITE_BU
17700 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  SY is returned i
17710 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
17720 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54  s locked.  SQLIT
17730 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65  E_NOMEM.** is re
17740 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e  turned if we run
17750 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20   out of memory. 
17760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
17770 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65  ockBtree(BtShare
17780 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
17790 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
177a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
177b0 72 6f 6d 20 73 75 62 66 75 6e 63 74 69 6f 6e 73  rom subfunctions
177c0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
177d0 50 61 67 65 31 3b 20 20 20 20 20 2f 2a 20 50 61  Page1;     /* Pa
177e0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
177f0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
17800 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
17810 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17820 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61   pages in the da
17830 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
17840 6e 50 61 67 65 46 69 6c 65 20 3d 20 30 3b 20 20  nPageFile = 0;  
17850 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
17860 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
17870 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
17880 74 20 6e 50 61 67 65 48 65 61 64 65 72 3b 20 20  t nPageHeader;  
17890 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
178a0 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
178b0 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67 20  abase according 
178c0 74 6f 20 68 64 72 20 2a 2f 0a 0a 20 20 61 73 73  to hdr */..  ass
178d0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
178e0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
178f0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
17900 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
17910 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17920 33 50 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b  3PagerSharedLock
17930 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
17940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17950 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
17960 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50    rc = btreeGetP
17970 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
17980 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ge1, 0);.  if( r
17990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
179a0 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
179b0 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67  Do some checking
179c0 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20   to help insure 
179d0 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e  the file we open
179e0 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a  ed really is.  *
179f0 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61  * a valid databa
17a00 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20  se file. .  */. 
17a10 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 48 65   nPage = nPageHe
17a20 61 64 65 72 20 3d 20 67 65 74 34 62 79 74 65 28  ader = get4byte(
17a30 32 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e  28+(u8*)pPage1->
17a40 61 44 61 74 61 29 3b 0a 20 20 73 71 6c 69 74 65  aData);.  sqlite
17a50 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17a60 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50  pBt->pPager, &nP
17a70 61 67 65 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  ageFile);.  if( 
17a80 6e 50 61 67 65 3d 3d 30 20 7c 7c 20 6d 65 6d 63  nPage==0 || memc
17a90 6d 70 28 32 34 2b 28 75 38 2a 29 70 50 61 67 65  mp(24+(u8*)pPage
17aa0 31 2d 3e 61 44 61 74 61 2c 20 39 32 2b 28 75 38  1->aData, 92+(u8
17ab0 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c  *)pPage1->aData,
17ac0 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 6e 50 61  4)!=0 ){.    nPa
17ad0 67 65 20 3d 20 6e 50 61 67 65 46 69 6c 65 3b 0a  ge = nPageFile;.
17ae0 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
17af0 30 20 29 7b 0a 20 20 20 20 75 33 32 20 70 61 67  0 ){.    u32 pag
17b00 65 53 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 75  eSize;.    u32 u
17b10 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75  sableSize;.    u
17b20 38 20 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65  8 *page1 = pPage
17b30 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
17b40 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42   = SQLITE_NOTADB
17b50 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
17b60 45 2d 4f 46 3a 20 52 2d 34 33 37 33 37 2d 33 39  E-OF: R-43737-39
17b70 39 39 39 20 45 76 65 72 79 20 76 61 6c 69 64 20  999 Every valid 
17b80 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
17b90 66 69 6c 65 20 62 65 67 69 6e 73 0a 20 20 20 20  file begins.    
17ba0 2a 2a 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  ** with the foll
17bb0 6f 77 69 6e 67 20 31 36 20 62 79 74 65 73 20 28  owing 16 bytes (
17bc0 69 6e 20 68 65 78 29 3a 20 35 33 20 35 31 20 34  in hex): 53 51 4
17bd0 63 20 36 39 20 37 34 20 36 35 20 32 30 20 36 36  c 69 74 65 20 66
17be0 20 36 66 20 37 32 20 36 64 0a 20 20 20 20 2a 2a   6f 72 6d.    **
17bf0 20 36 31 20 37 34 20 32 30 20 33 33 20 30 30 2e   61 74 20 33 00.
17c00 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
17c10 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69 63  mp(page1, zMagic
17c20 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20 29  Header, 16)!=0 )
17c30 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
17c40 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
17c50 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
17c60 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
17c70 20 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e    if( page1[18]>
17c80 31 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  1 ){.      pBt->
17c90 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
17ca0 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d  READ_ONLY;.    }
17cb0 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31  .    if( page1[1
17cc0 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f  9]>1 ){.      go
17cd0 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
17ce0 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  iled;.    }.#els
17cf0 65 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  e.    if( page1[
17d00 31 38 5d 3e 32 20 29 7b 0a 20 20 20 20 20 20 70  18]>2 ){.      p
17d10 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
17d20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a 20  BTS_READ_ONLY;. 
17d30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67     }.    if( pag
17d40 65 31 5b 31 39 5d 3e 32 20 29 7b 0a 20 20 20 20  e1[19]>2 ){.    
17d50 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
17d60 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
17d70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 77  .    /* If the w
17d80 72 69 74 65 20 76 65 72 73 69 6f 6e 20 69 73 20  rite version is 
17d90 73 65 74 20 74 6f 20 32 2c 20 74 68 69 73 20 64  set to 2, this d
17da0 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 20 62  atabase should b
17db0 65 20 61 63 63 65 73 73 65 64 0a 20 20 20 20 2a  e accessed.    *
17dc0 2a 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 20 49  * in WAL mode. I
17dd0 66 20 74 68 65 20 6c 6f 67 20 69 73 20 6e 6f 74  f the log is not
17de0 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 6f   already open, o
17df0 70 65 6e 20 69 74 20 6e 6f 77 2e 20 54 68 65 6e  pen it now. Then
17e00 20 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20   .    ** return 
17e10 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
17e20 74 75 72 6e 20 77 69 74 68 6f 75 74 20 70 6f 70  turn without pop
17e30 75 6c 61 74 69 6e 67 20 42 74 53 68 61 72 65 64  ulating BtShared
17e40 2e 70 50 61 67 65 31 2e 0a 20 20 20 20 2a 2a 20  .pPage1..    ** 
17e50 54 68 65 20 63 61 6c 6c 65 72 20 64 65 74 65 63  The caller detec
17e60 74 73 20 74 68 69 73 20 61 6e 64 20 63 61 6c 6c  ts this and call
17e70 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
17e80 61 67 61 69 6e 2e 20 54 68 69 73 20 69 73 0a 20  again. This is. 
17e90 20 20 20 2a 2a 20 72 65 71 75 69 72 65 64 20 61     ** required a
17ea0 73 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6f 66  s the version of
17eb0 20 70 61 67 65 20 31 20 63 75 72 72 65 6e 74 6c   page 1 currentl
17ec0 79 20 69 6e 20 74 68 65 20 70 61 67 65 31 20 62  y in the page1 b
17ed0 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 6d 61 79  uffer.    ** may
17ee0 20 6e 6f 74 20 62 65 20 74 68 65 20 6c 61 74 65   not be the late
17ef0 73 74 20 76 65 72 73 69 6f 6e 20 2d 20 74 68 65  st version - the
17f00 72 65 20 6d 61 79 20 62 65 20 61 20 6e 65 77 65  re may be a newe
17f10 72 20 6f 6e 65 20 69 6e 20 74 68 65 20 6c 6f 67  r one in the log
17f20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20  .    ** file..  
17f30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 61 67    */.    if( pag
17f40 65 31 5b 31 39 5d 3d 3d 32 20 26 26 20 28 70 42  e1[19]==2 && (pB
17f50 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
17f60 53 5f 4e 4f 5f 57 41 4c 29 3d 3d 30 20 29 7b 0a  S_NO_WAL)==0 ){.
17f70 20 20 20 20 20 20 69 6e 74 20 69 73 4f 70 65 6e        int isOpen
17f80 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
17f90 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
17fa0 6e 57 61 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  nWal(pBt->pPager
17fb0 2c 20 26 69 73 4f 70 65 6e 29 3b 0a 20 20 20 20  , &isOpen);.    
17fc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17fd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
17fe0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
17ff0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 65 6c  ailed;.      }el
18000 73 65 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30  se if( isOpen==0
18010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
18020 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18030 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18040 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
18050 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   }.      rc = SQ
18060 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20  LITE_NOTADB;.   
18070 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
18080 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18090 2d 31 35 34 36 35 2d 32 30 38 31 33 20 54 68 65  -15465-20813 The
180a0 20 6d 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e   maximum and min
180b0 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61  imum embedded pa
180c0 79 6c 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61  yload.    ** fra
180d0 63 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c  ctions and the l
180e0 65 61 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63  eaf payload frac
180f0 74 69 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74  tion values must
18100 20 62 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20   be 64, 32, and 
18110 33 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  32..    **.    *
18120 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  * The original d
18130 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68  esign allowed th
18140 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76  ese amounts to v
18150 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20  ary, but as of. 
18160 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e     ** version 3.
18170 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65 20  6.0, we require 
18180 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64  them to be fixed
18190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
181a0 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32   memcmp(&page1[2
181b0 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34  1], "\100\040\04
181c0 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20  0",3)!=0 ){.    
181d0 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
181e0 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
181f0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18200 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31  OF: R-51873-3961
18210 38 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  8 The page size 
18220 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 66  for a database f
18230 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65  ile is.    ** de
18240 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
18250 32 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c  2-byte integer l
18260 6f 63 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66  ocated at an off
18270 73 65 74 20 6f 66 20 31 36 20 62 79 74 65 73 20  set of 16 bytes 
18280 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
18290 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
182a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
182b0 2a 2f 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20  */.    pageSize 
182c0 3d 20 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29  = (page1[16]<<8)
182d0 20 7c 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31   | (page1[17]<<1
182e0 36 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  6);.    /* EVIDE
182f0 4e 43 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d  NCE-OF: R-25008-
18300 32 31 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f  21688 The size o
18310 66 20 61 20 70 61 67 65 20 69 73 20 61 20 70 6f  f a page is a po
18320 77 65 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a  wer of two.    *
18330 2a 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  * between 512 an
18340 64 20 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76  d 65536 inclusiv
18350 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28  e. */.    if( ((
18360 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
18370 53 69 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c  Size)!=0.     ||
18380 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45   pageSize>SQLITE
18390 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a  _MAX_PAGE_SIZE .
183a0 20 20 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65       || pageSize
183b0 3c 3d 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20  <=256 .    ){.  
183c0 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
183d0 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
183e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
183f0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
18400 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
18410 43 45 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35  CE-OF: R-59310-5
18420 31 32 30 35 20 54 68 65 20 22 72 65 73 65 72 76  1205 The "reserv
18430 65 64 20 73 70 61 63 65 22 20 73 69 7a 65 20 69  ed space" size i
18440 6e 20 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20  n the 1-byte.   
18450 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f   ** integer at o
18460 66 66 73 65 74 20 32 30 20 69 73 20 74 68 65 20  ffset 20 is the 
18470 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18480 6f 66 20 73 70 61 63 65 20 61 74 20 74 68 65 20  of space at the 
18490 65 6e 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61  end of.    ** ea
184a0 63 68 20 70 61 67 65 20 74 6f 20 72 65 73 65 72  ch page to reser
184b0 76 65 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e  ve for extension
184c0 73 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  s. .    **.    *
184d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
184e0 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54 68 65  -37497-42412 The
184f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73   size of the res
18500 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a  erved region is.
18510 20 20 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65      ** determine
18520 64 20 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74  d by the one-byt
18530 65 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67  e unsigned integ
18540 65 72 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f  er found at an o
18550 66 66 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20  ffset of 20.    
18560 2a 2a 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ** into the data
18570 62 61 73 65 20 66 69 6c 65 20 68 65 61 64 65 72  base file header
18580 2e 20 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53  . */.    usableS
18590 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
185a0 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
185b0 69 66 28 20 28 75 33 32 29 70 61 67 65 53 69 7a  if( (u32)pageSiz
185c0 65 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e!=pBt->pageSize
185d0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74   ){.      /* Aft
185e0 65 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66  er reading the f
185f0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
18600 20 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69   database assumi
18610 6e 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20  ng a page size. 
18620 20 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61       ** of BtSha
18630 72 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65  red.pageSize, we
18640 20 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64   have discovered
18650 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73   that the page-s
18660 69 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ize is.      ** 
18670 61 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a  actually pageSiz
18680 65 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61  e. Unlock the da
18690 74 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42  tabase, leave pB
186a0 74 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20  t->pPage1 at.   
186b0 20 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72     ** zero and r
186c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
186d0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
186e0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
186f0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61  ion.      ** aga
18700 69 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72  in with the corr
18710 65 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20  ect page-size.. 
18720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
18730 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
18740 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73  );.      pBt->us
18750 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c  ableSize = usabl
18760 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
18770 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
18780 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65  eSize;.      fre
18790 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
187a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
187b0 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
187c0 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
187d0 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c   &pBt->pageSize,
187e0 0a 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 20 20 20 20                  
18800 20 20 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61      pageSize-usa
18810 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
18820 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
18830 0a 20 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64  .    if( (pBt->d
18840 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54  b->flags & SQLIT
18850 45 5f 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d  E_RecoveryMode)=
18860 3d 30 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67  =0 && nPage>nPag
18870 65 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72  eFile ){.      r
18880 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
18890 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  PT_BKPT;.      g
188a0 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
188b0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
188c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
188d0 20 52 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48   R-28312-64704 H
188e0 6f 77 65 76 65 72 2c 20 74 68 65 20 75 73 61 62  owever, the usab
188f0 6c 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61  le size is not a
18900 6c 6c 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a  llowed to.    **
18910 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38   be less than 48
18920 30 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  0. In other word
18930 73 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 73  s, if the page s
18940 69 7a 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e  ize is 512, then
18950 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65   the.    ** rese
18960 72 76 65 64 20 73 70 61 63 65 20 73 69 7a 65 20  rved space size 
18970 63 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32  cannot exceed 32
18980 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61  . */.    if( usa
18990 62 6c 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20  bleSize<480 ){. 
189a0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
189b0 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
189c0 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65   }.    pBt->page
189d0 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
189e0 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
189f0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
18a00 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e;.#ifndef SQLIT
18a10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
18a20 4d 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  M.    pBt->autoV
18a30 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
18a40 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a  e(&page1[36 + 4*
18a50 34 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42  4])?1:0);.    pB
18a60 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
18a70 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
18a80 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29  [36 + 7*4])?1:0)
18a90 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
18aa0 2f 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74  /* maxLocal is t
18ab0 68 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e  he maximum amoun
18ac0 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20  t of payload to 
18ad0 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f  store locally fo
18ae0 72 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20  r.  ** a cell.  
18af0 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20  Make sure it is 
18b00 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20  small enough so 
18b10 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69  that at least mi
18b20 6e 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c  nFanout.  ** cel
18b30 6c 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20  ls can will fit 
18b40 6f 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65  on one page.  We
18b50 20 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74   assume a 10-byt
18b60 65 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20  e page header.. 
18b70 20 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20   ** Besides the 
18b80 70 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c  payload, the cel
18b90 6c 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20  l must store:.  
18ba0 2a 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f  **     2-byte po
18bb0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c  inter to the cel
18bc0 6c 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74  l.  **     4-byt
18bd0 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a  e child pointer.
18be0 20 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20    **     9-byte 
18bf0 6e 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20  nKey value.  ** 
18c00 20 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61      4-byte nData
18c10 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
18c20 34 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20  4-byte overflow 
18c30 70 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a  page pointer.  *
18c40 2a 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73  * So a cell cons
18c50 69 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65  ists of a 2-byte
18c60 20 70 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64   pointer, a head
18c70 65 72 20 77 68 69 63 68 20 69 73 20 61 73 20 6d  er which is as m
18c80 75 63 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62  uch as.  ** 17 b
18c90 79 74 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20  ytes long, 0 to 
18ca0 4e 20 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f  N bytes of paylo
18cb0 61 64 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f  ad, and an optio
18cc0 6e 61 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66  nal 4 byte overf
18cd0 6c 6f 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f  low.  ** page po
18ce0 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42  inter..  */.  pB
18cf0 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75  t->maxLocal = (u
18d00 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65  16)((pBt->usable
18d10 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20  Size-12)*64/255 
18d20 2d 20 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69  - 23);.  pBt->mi
18d30 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28  nLocal = (u16)((
18d40 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d  pBt->usableSize-
18d50 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29  12)*32/255 - 23)
18d60 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
18d70 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73   = (u16)(pBt->us
18d80 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a  ableSize - 35);.
18d90 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
18da0 20 28 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61   (u16)((pBt->usa
18db0 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
18dc0 35 35 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20  55 - 23);.  if( 
18dd0 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32  pBt->maxLocal>12
18de0 37 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61  7 ){.    pBt->ma
18df0 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20  x1bytePayload = 
18e00 31 32 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  127;.  }else{.  
18e10 20 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50    pBt->max1byteP
18e20 61 79 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74  ayload = (u8)pBt
18e30 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a  ->maxLocal;.  }.
18e40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d    assert( pBt->m
18e50 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d  axLeaf + 23 <= M
18e60 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
18e70 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65   );.  pBt->pPage
18e80 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42  1 = pPage1;.  pB
18e90 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65  t->nPage = nPage
18ea0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18eb0 45 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69  E_OK;..page1_ini
18ec0 74 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65  t_failed:.  rele
18ed0 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18ee0 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d  .  pBt->pPage1 =
18ef0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
18f00 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
18f10 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
18f20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75  the number of cu
18f30 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42  rsors open on pB
18f40 74 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  t. This is for u
18f50 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
18f60 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
18f70 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
18f80 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
18f90 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
18fa0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72  d..**.** Only wr
18fb0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
18fc0 63 6f 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c  counted if wrOnl
18fd0 79 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 77  y is true.  If w
18fe0 72 4f 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73  rOnly is.** fals
18ff0 65 20 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f  e then all curso
19000 72 73 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a  rs are counted..
19010 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
19020 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72  rposes of this r
19030 6f 75 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72  outine, a cursor
19040 20 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74   is any cursor t
19050 68 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c  hat.** is capabl
19060 65 20 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20  e of reading or 
19070 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
19080 61 74 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72  atabase.  Cursor
19090 73 20 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62  s that.** have b
190a0 65 65 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f  een tripped into
190b0 20 74 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c   the CURSOR_FAUL
190c0 54 20 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20  T state are not 
190d0 63 6f 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  counted..*/.stat
190e0 69 63 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69  ic int countVali
190f0 64 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65  dCursors(BtShare
19100 64 20 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e  d *pBt, int wrOn
19110 6c 79 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  ly){.  BtCursor 
19120 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
19130 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
19140 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
19150 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
19160 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77  ext){.    if( (w
19170 72 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75  rOnly==0 || (pCu
19180 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
19190 43 46 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30  CF_WriteFlag)!=0
191a0 29 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e  ).     && pCur->
191b0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46  eState!=CURSOR_F
191c0 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d  AULT ) r++; .  }
191d0 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23  .  return r;.}.#
191e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
191f0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
19200 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
19210 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
19220 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
19230 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
19240 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
19250 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
19260 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
19270 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
19280 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
19290 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
192a0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
192b0 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
192c0 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
192d0 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
192e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
192f0 69 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  is a transaction
19300 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68   in progress, th
19310 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
19320 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
19330 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65   void unlockBtre
19340 65 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72  eIfUnused(BtShar
19350 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65  ed *pBt){.  asse
19360 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
19370 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
19380 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
19390 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
193a0 73 28 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70  s(pBt,0)==0 || p
193b0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
193c0 6e 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a  n>TRANS_NONE );.
193d0 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
193e0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
193f0 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61  NONE && pBt->pPa
19400 67 65 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65  ge1!=0 ){.    Me
19410 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
19420 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20  pBt->pPage1;.   
19430 20 61 73 73 65 72 74 28 20 70 50 61 67 65 31 2d   assert( pPage1-
19440 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73  >aData );.    as
19450 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
19460 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
19470 70 50 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20  pPager)==1 );.  
19480 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
19490 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  0;.    releasePa
194a0 67 65 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31  geNotNull(pPage1
194b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
194c0 49 66 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f  If pBt points to
194d0 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74   an empty file t
194e0 68 65 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74  hen convert that
194f0 20 65 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69   empty file.** i
19500 6e 74 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20  nto a new empty 
19510 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
19520 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
19530 73 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68  st page of.** th
19540 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
19550 74 61 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74  tatic int newDat
19560 61 62 61 73 65 28 42 74 53 68 61 72 65 64 20 2a  abase(BtShared *
19570 70 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  pBt){.  MemPage 
19580 2a 70 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  *pP1;.  unsigned
19590 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69   char *data;.  i
195a0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
195b0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
195c0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
195d0 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e   );.  if( pBt->n
195e0 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65  Page>0 ){.    re
195f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19600 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d    }.  pP1 = pBt-
19610 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72  >pPage1;.  asser
19620 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64  t( pP1!=0 );.  d
19630 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61  ata = pP1->aData
19640 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
19650 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e  PagerWrite(pP1->
19660 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
19670 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
19680 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a    memcpy(data, z
19690 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a  MagicHeader, siz
196a0 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
196b0 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69  ));.  assert( si
196c0 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
196d0 72 29 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61  r)==16 );.  data
196e0 5b 31 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74  [16] = (u8)((pBt
196f0 2d 3e 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30  ->pageSize>>8)&0
19700 78 66 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d  xff);.  data[17]
19710 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
19720 67 65 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66  geSize>>16)&0xff
19730 29 3b 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20  );.  data[18] = 
19740 31 3b 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20  1;.  data[19] = 
19750 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  1;.  assert( pBt
19760 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42  ->usableSize<=pB
19770 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70  t->pageSize && p
19780 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32  Bt->usableSize+2
19790 35 35 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  55>=pBt->pageSiz
197a0 65 29 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d  e);.  data[20] =
197b0 20 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53   (u8)(pBt->pageS
197c0 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c  ize - pBt->usabl
197d0 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32  eSize);.  data[2
197e0 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
197f0 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
19800 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
19810 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
19820 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
19830 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
19840 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
19850 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
19860 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
19870 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
19880 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
19890 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
198a0 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70  CUUM.  assert( p
198b0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
198c0 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61  1 || pBt->autoVa
198d0 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73  cuum==0 );.  ass
198e0 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61  ert( pBt->incrVa
198f0 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e  cuum==1 || pBt->
19900 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b  incrVacuum==0 );
19910 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74  .  put4byte(&dat
19920 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74  a[36 + 4*4], pBt
19930 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
19940 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
19950 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 7*4], pBt->
19960 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e  incrVacuum);.#en
19970 64 69 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65  dif.  pBt->nPage
19980 20 3d 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d   = 1;.  data[31]
19990 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
199a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
199b0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
199c0 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
199d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
199e0 65 20 28 63 72 65 61 74 69 6e 67 20 61 20 64 61  e (creating a da
199f0 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73  tabase.** consis
19a00 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
19a10 20 70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68   page and no sch
19a20 65 6d 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65  ema objects). Re
19a30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
19a40 2a 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * if successful,
19a50 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
19a60 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
19a70 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
19a80 65 33 42 74 72 65 65 4e 65 77 44 62 28 42 74 72  e3BtreeNewDb(Btr
19a90 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
19aa0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
19ab0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
19ac0 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  Bt->nPage = 0;. 
19ad0 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73   rc = newDatabas
19ae0 65 28 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c  e(p->pBt);.  sql
19af0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
19b00 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
19b10 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
19b20 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
19b30 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77  transaction. A w
19b40 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19b50 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69  .** is started i
19b60 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
19b70 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f  ument is nonzero
19b80 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65  , otherwise a re
19b90 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ad-.** transacti
19ba0 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f  on.  If the seco
19bb0 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32  nd argument is 2
19bc0 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63   or more and exc
19bd0 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61  lusive.** transa
19be0 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
19bf0 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e  , meaning that n
19c00 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  o other process 
19c10 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f  is allowed.** to
19c20 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61   access the data
19c30 62 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73  base.  A preexis
19c40 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ting transaction
19c50 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75   may not be.** u
19c60 70 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75  pgraded to exclu
19c70 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  sive by calling 
19c80 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73  this routine a s
19c90 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65  econd time - the
19ca0 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20  .** exclusivity 
19cb0 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  flag only works 
19cc0 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61  for a new transa
19cd0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77  ction..**.** A w
19ce0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
19cf0 20 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64   must be started
19d00 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69   before attempti
19d10 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67  ng any .** chang
19d20 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
19d30 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65  se.  None of the
19d40 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
19d50 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72  nes .** will wor
19d60 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73  k unless a trans
19d70 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65  action is starte
19d80 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20  d first:.**.**  
19d90 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19da0 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a  CreateTable().**
19db0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19dc0 65 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a  eeCreateIndex().
19dd0 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
19de0 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29  treeClearTable()
19df0 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19e00 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29  BtreeDropTable()
19e10 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
19e20 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a  BtreeInsert().**
19e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
19e40 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20  eeDelete().**   
19e50 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55     sqlite3BtreeU
19e60 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a  pdateMeta().**.*
19e70 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20  * If an initial 
19e80 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69  attempt to acqui
19e90 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c  re the lock fail
19ea0 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63  s because of loc
19eb0 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20  k contention.** 
19ec0 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
19ed0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
19ee0 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69  unlocked, then i
19ef0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
19f00 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65  andler.** if the
19f10 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20  re is one.  But 
19f20 69 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65  if there was pre
19f30 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c  viously a read-l
19f40 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69  ock, do not.** i
19f50 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
19f60 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65  andler - just re
19f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
19f80 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  .  SQLITE_BUSY i
19f90 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77  s .** returned w
19fa0 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72  hen there is alr
19fb0 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
19fc0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
19fd0 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a  id a deadlock..*
19fe0 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65  *.** Suppose the
19ff0 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65  re are two proce
1a000 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41  sses A and B.  A
1a010 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
1a020 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20   and B has.** a 
1a030 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20  reserved lock.  
1a040 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f  B tries to promo
1a050 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  te to exclusive 
1a060 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62  but is blocked b
1a070 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73  ecause.** of A's
1a080 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74   read lock.  A t
1a090 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20  ries to promote 
1a0a0 74 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20  to reserved but 
1a0b0 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e  is blocked by B.
1a0c0 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f  .** One or the o
1a0d0 74 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20  ther of the two 
1a0e0 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67  processes must g
1a0f0 69 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65  ive way or there
1a100 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72   can be.** no pr
1a110 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75  ogress.  By retu
1a120 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53  rning SQLITE_BUS
1a130 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69  Y and not invoki
1a140 6e 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ng the busy call
1a150 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61  back.** when A a
1a160 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61  lready has a rea
1a170 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75  d lock, we encou
1a180 72 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75  rage A to give u
1a190 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70  p and let B.** p
1a1a0 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  roceed..*/.int s
1a1b0 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
1a1c0 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20  Trans(Btree *p, 
1a1d0 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42  int wrflag){.  B
1a1e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1a1f0 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
1a200 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1a210 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a220 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74  r(p);.  btreeInt
1a230 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
1a240 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73   If the btree is
1a250 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72   already in a wr
1a260 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
1a270 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61   or it.  ** is a
1a280 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64  lready in a read
1a290 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64  -transaction and
1a2a0 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74   a read-transact
1a2b0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75  ion.  ** is requ
1a2c0 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61  ested, this is a
1a2d0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
1a2e0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
1a2f0 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70  RANS_WRITE || (p
1a300 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1a310 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67  _READ && !wrflag
1a320 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72  ) ){.    goto tr
1a330 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20  ans_begun;.  }. 
1a340 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
1a350 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
1a360 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f  NS_WRITE || IfNo
1a370 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f  tOmitAV(pBt->bDo
1a380 54 72 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a  Truncate)==0 );.
1a390 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
1a3a0 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
1a3b0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
1a3c0 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
1a3d0 65 20 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d  e */.  if( (pBt-
1a3e0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1a3f0 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26  READ_ONLY)!=0 &&
1a400 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72   wrflag ){.    r
1a410 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
1a420 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72  NLY;.    goto tr
1a430 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a  ans_begun;.  }..
1a440 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a450 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1a460 0a 20 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  .  {.    sqlite3
1a470 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20   *pBlock = 0;.  
1a480 20 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20    /* If another 
1a490 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1a4a0 68 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  has already open
1a4b0 65 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73  ed a write trans
1a4c0 61 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f  action .    ** o
1a4d0 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d 62 74  n this shared-bt
1a4e0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  ree structure an
1a4f0 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65  d a second write
1a500 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a   transaction is.
1a510 20 20 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64      ** requested
1a520 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1a530 4c 4f 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20  LOCKED..    */. 
1a540 20 20 20 69 66 28 20 28 77 72 66 6c 61 67 20 26     if( (wrflag &
1a550 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1a560 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
1a570 45 29 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d  E).     || (pBt-
1a580 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
1a590 50 45 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20  PENDING)!=0.    
1a5a0 29 7b 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20  ){.      pBlock 
1a5b0 3d 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e  = pBt->pWriter->
1a5c0 64 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  db;.    }else if
1a5d0 28 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20  ( wrflag>1 ){.  
1a5e0 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65      BtLock *pIte
1a5f0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74  r;.      for(pIt
1a600 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1a610 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
1a620 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1a630 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42     if( pIter->pB
1a640 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20  tree!=p ){.     
1a650 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49       pBlock = pI
1a660 74 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  ter->pBtree->db;
1a670 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
1a680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a690 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1a6a0 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  ( pBlock ){.    
1a6b0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
1a6c0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
1a6d0 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  , pBlock);.     
1a6e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43   rc = SQLITE_LOC
1a6f0 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b  KED_SHAREDCACHE;
1a700 0a 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  .      goto tran
1a710 73 5f 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20  s_begun;.    }. 
1a720 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
1a730 41 6e 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72  Any read-only or
1a740 20 72 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e   read-write tran
1a750 73 61 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20  saction implies 
1a760 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a  a read-lock on .
1a770 20 20 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20    ** page 1. So 
1a780 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68  if some other sh
1a790 61 72 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e  ared-cache clien
1a7a0 74 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  t already has a 
1a7b0 77 72 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a  write-lock .  **
1a7c0 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20   on page 1, the 
1a7d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e  transaction cann
1a7e0 6f 74 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f  ot be opened. */
1a7f0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 53 68 61  .  rc = querySha
1a800 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1a810 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54  k(p, MASTER_ROOT
1a820 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
1a830 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
1a840 63 20 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62  c ) goto trans_b
1a850 65 67 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74  egun;..  pBt->bt
1a860 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49  sFlags &= ~BTS_I
1a870 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a  NITIALLY_EMPTY;.
1a880 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1a890 3d 3d 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  ==0 ) pBt->btsFl
1a8a0 61 67 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49  ags |= BTS_INITI
1a8b0 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f  ALLY_EMPTY;.  do
1a8c0 20 7b 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c   {.    /* Call l
1a8d0 6f 63 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c  ockBtree() until
1a8e0 20 65 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61   either pBt->pPa
1a8f0 67 65 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ge1 is populated
1a900 20 6f 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42   or.    ** lockB
1a910 74 72 65 65 28 29 20 72 65 74 75 72 6e 73 20 73  tree() returns s
1a920 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74  omething other t
1a930 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c  han SQLITE_OK. l
1a940 6f 63 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a  ockBtree().    *
1a950 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  * may return SQL
1a960 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65  ITE_OK but leave
1a970 20 70 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74   pBt->pPage1 set
1a980 20 74 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20   to 0 if after. 
1a990 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61     ** reading pa
1a9a0 67 65 20 31 20 69 74 20 64 69 73 63 6f 76 65 72  ge 1 it discover
1a9b0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 2d  s that the page-
1a9c0 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1a9d0 62 61 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c  base .    ** fil
1a9e0 65 20 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61  e is not pBt->pa
1a9f0 67 65 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20  geSize. In this 
1aa00 63 61 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29  case lockBtree()
1aa10 20 77 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20   will update.   
1aa20 20 2a 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   ** pBt->pageSiz
1aa30 65 20 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69  e to the page-si
1aa40 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f  ze of the file o
1aa50 6e 20 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20  n disk..    */. 
1aa60 20 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70     while( pBt->p
1aa70 50 61 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49  Page1==0 && SQLI
1aa80 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63  TE_OK==(rc = loc
1aa90 6b 42 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a  kBtree(pBt)) );.
1aaa0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1aab0 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67  ITE_OK && wrflag
1aac0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70   ){.      if( (p
1aad0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1aae0 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1aaf0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ab00 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
1ab10 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1ab20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ab30 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 42  te3PagerBegin(pB
1ab40 74 2d 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67  t->pPager,wrflag
1ab50 3e 31 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  >1,sqlite3TempIn
1ab60 4d 65 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a  Memory(p->db));.
1ab70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ab80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab90 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44         rc = newD
1aba0 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
1abb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1abc0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
1abd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1abe0 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74  {.      unlockBt
1abf0 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1ac00 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65  ;.    }.  }while
1ac10 28 20 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c  ( (rc&0xFF)==SQL
1ac20 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
1ac30 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1ac40 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
1ac50 20 20 20 20 20 20 20 20 62 74 72 65 65 49 6e 76          btreeInv
1ac60 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
1ac70 42 74 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  Bt) );..  if( rc
1ac80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ac90 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1aca0 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s==TRANS_NONE ){
1acb0 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61  .      pBt->nTra
1acc0 6e 73 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e  nsaction++;.#ifn
1acd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1ace0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20  SHARED_CACHE.   
1acf0 20 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62     if( p->sharab
1ad00 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  le ){.        as
1ad10 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42  sert( p->lock.pB
1ad20 74 72 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f  tree==p && p->lo
1ad30 63 6b 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a  ck.iTable==1 );.
1ad40 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e          p->lock.
1ad50 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
1ad60 4b 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f  K;.        p->lo
1ad70 63 6b 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  ck.pNext = pBt->
1ad80 70 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70  pLock;.        p
1ad90 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e  Bt->pLock = &p->
1ada0 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  lock;.      }.#e
1adb0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
1adc0 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66  ->inTrans = (wrf
1add0 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a  lag?TRANS_WRITE:
1ade0 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20  TRANS_READ);.   
1adf0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e   if( p->inTrans>
1ae00 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1ae10 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
1ae20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
1ae30 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20   p->inTrans;.   
1ae40 20 7d 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61   }.    if( wrfla
1ae50 67 20 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61  g ){.      MemPa
1ae60 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74  ge *pPage1 = pBt
1ae70 2d 3e 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65  ->pPage1;.#ifnde
1ae80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1ae90 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1aea0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
1aeb0 57 72 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20  Writer );.      
1aec0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70  pBt->pWriter = p
1aed0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  ;.      pBt->bts
1aee0 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58  Flags &= ~BTS_EX
1aef0 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69  CLUSIVE;.      i
1af00 66 28 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42  f( wrflag>1 ) pB
1af10 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42  t->btsFlags |= B
1af20 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65  TS_EXCLUSIVE;.#e
1af30 6e 64 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ndif..      /* I
1af40 66 20 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65  f the db-size he
1af50 61 64 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e  ader field is in
1af60 63 6f 72 72 65 63 74 20 28 61 73 20 69 74 20 6d  correct (as it m
1af70 61 79 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a  ay be if an old.
1af80 20 20 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20        ** client 
1af90 68 61 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67  has been writing
1afa0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1afb0 6c 65 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e  le), update it n
1afc0 6f 77 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20  ow. Doing.      
1afd0 2a 2a 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72  ** this sooner r
1afe0 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
1aff0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
1b000 61 73 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66  ase size can saf
1b010 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65  ely .      ** re
1b020 2d 72 65 61 64 20 74 68 65 20 64 61 74 61 62 61  -read the databa
1b030 73 65 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67  se size from pag
1b040 65 20 31 20 69 66 20 61 20 73 61 76 65 70 6f 69  e 1 if a savepoi
1b050 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
1b060 6e 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62  n.      ** rollb
1b070 61 63 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69  ack occurs withi
1b080 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
1b090 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
1b0a0 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
1b0b0 21 3d 67 65 74 34 62 79 74 65 28 26 70 50 61 67  !=get4byte(&pPag
1b0c0 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29  e1->aData[28]) )
1b0d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
1b0e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1b0f0 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1b100 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b110 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b120 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79            put4by
1b130 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1b140 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67  a[28], pBt->nPag
1b150 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
1b160 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1b170 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20  ..trans_begun:. 
1b180 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b190 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a  OK && wrflag ){.
1b1a0 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
1b1b0 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
1b1c0 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
1b1d0 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
1b1e0 72 20 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e  r of.    ** open
1b1f0 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20   savepoints. If 
1b200 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d  the second param
1b210 65 74 65 72 20 69 73 20 67 72 65 61 74 65 72 20  eter is greater 
1b220 74 68 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a  than 0 and.    *
1b230 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  * the sub-journa
1b240 6c 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  l is not already
1b250 20 6f 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77   open, then it w
1b260 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65  ill be opened he
1b270 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  re..    */.    r
1b280 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1b290 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
1b2a0 74 2d 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62  t->pPager, p->db
1b2b0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->nSavepoint);. 
1b2c0 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67   }..  btreeInteg
1b2d0 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
1b2e0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1b2f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b300 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b310 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b320 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
1b330 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
1b340 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
1b350 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
1b360 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
1b370 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
1b380 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
1b390 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1b3a0 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
1b3b0 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
1b3c0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
1b3d0 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
1b3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1b3f0 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
1b400 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
1b410 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
1b440 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
1b450 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
1b480 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
1b490 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1b4c0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
1b4d0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
1b4e0 61 67 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69  age->pBt;.  u8 i
1b4f0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
1b500 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e  e->isInit;.  Pgn
1b510 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  o pgno = pPage->
1b520 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28  pgno;..  assert(
1b530 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b540 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1b550 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1b560 20 62 74 72 65 65 49 6e 69 74 50 61 67 65 28 70   btreeInitPage(p
1b570 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Page);.  if( rc!
1b580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b590 20 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64    goto set_child
1b5a0 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20  _ptrmaps_out;.  
1b5b0 7d 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67  }.  nCell = pPag
1b5c0 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72  e->nCell;..  for
1b5d0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
1b5e0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
1b5f0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1b600 61 67 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74  age, i);..    pt
1b610 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
1b620 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63  Page, pCell, &rc
1b630 29 3b 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61  );..    if( !pPa
1b640 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
1b650 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
1b660 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
1b670 6c 29 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70  l);.      ptrmap
1b680 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
1b690 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
1b6a0 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20  , pgno, &rc);.  
1b6b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21    }.  }..  if( !
1b6c0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1b6d0 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e     Pgno childPgn
1b6e0 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
1b6f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1b700 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1b710 0a 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70  .    ptrmapPut(p
1b720 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50  Bt, childPgno, P
1b730 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e  TRMAP_BTREE, pgn
1b740 6f 2c 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65  o, &rc);.  }..se
1b750 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f  t_child_ptrmaps_
1b760 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73  out:.  pPage->is
1b770 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69  Init = isInitOri
1b780 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  g;.  return rc;.
1b790 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65  }../*.** Somewhe
1b7a0 72 65 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61  re on pPage is a
1b7b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   pointer to page
1b7c0 20 69 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20   iFrom.  Modify 
1b7d0 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a  this pointer so.
1b7e0 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1b7f0 73 20 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65  s to iTo. Parame
1b800 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
1b810 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
1b820 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65  pointer to.** be
1b830 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66   modified, as  f
1b840 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
1b850 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
1b860 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1b870 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1b880 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
1b890 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
1b8a0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
1b8b0 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
1b8c0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
1b8d0 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
1b8e0 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
1b8f0 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
1b900 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
1b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b920 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
1b930 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
1b940 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
1b950 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
1b960 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
1b970 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
1b980 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
1b990 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
1b9a0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b9b0 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
1b9c0 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
1b9d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1b9e0 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
1b9f0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
1ba00 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
1ba10 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
1ba20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ba30 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
1ba40 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
1ba50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1ba60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1ba70 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
1ba80 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65  Page) );.  if( e
1ba90 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1baa0 52 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a  RFLOW2 ){.    /*
1bab0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
1bac0 61 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  always the first
1bad0 20 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   4 bytes of the 
1bae0 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
1baf0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  e.  */.    if( g
1bb00 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61  et4byte(pPage->a
1bb10 44 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a  Data)!=iFrom ){.
1bb20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1bb30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1bb40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34  ;.    }.    put4
1bb50 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
1bb60 61 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65  a, iTo);.  }else
1bb70 7b 0a 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f  {.    u8 isInitO
1bb80 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
1bb90 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
1bba0 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20      int nCell;. 
1bbb0 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
1bbc0 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61  rc = btreeInitPa
1bbd0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  ge(pPage);.    i
1bbe0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1bbf0 63 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  c;.    nCell = p
1bc00 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
1bc10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
1bc20 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
1bc30 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
1bc40 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
1bc50 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
1bc60 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1bc70 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
1bc80 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
1bc90 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73      pPage->xPars
1bca0 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  eCell(pPage, pCe
1bcb0 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20  ll, &info);.    
1bcc0 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f      if( info.nLo
1bcd0 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
1bce0 64 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 43  d.         && pC
1bcf0 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31  ell+info.nSize-1
1bd00 3c 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70  <=pPage->aData+p
1bd10 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20  Page->maskPage. 
1bd20 20 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d          && iFrom
1bd30 3d 3d 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ==get4byte(pCell
1bd40 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 0a 20  +info.nSize-4). 
1bd50 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
1bd60 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
1bd70 6c 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c  ll+info.nSize-4,
1bd80 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
1bd90 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1bda0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
1bdb0 20 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62         if( get4b
1bdc0 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f  yte(pCell)==iFro
1bdd0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  m ){.          p
1bde0 75 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69  ut4byte(pCell, i
1bdf0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1be00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1be10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1be20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c  .    if( i==nCel
1be30 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  l ){.      if( e
1be40 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52  Type!=PTRMAP_BTR
1be50 45 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  EE || .         
1be60 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1be70 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1be80 64 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46  drOffset+8])!=iF
1be90 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rom ){.        r
1bea0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1beb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1bec0 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74   }.      put4byt
1bed0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1bee0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1bef0 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d  +8], iTo);.    }
1bf00 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
1bf10 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
1bf20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1bf30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
1bf40 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65  .** Move the ope
1bf50 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
1bf60 70 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74  pDbPage to locat
1bf70 69 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e  ion iFreePage in
1bf80 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73   the .** databas
1bf90 65 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72  e. The pDbPage r
1bfa0 65 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73  eference remains
1bfb0 20 76 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68   valid..**.** Th
1bfc0 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
1bfd0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
1bfe0 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
1bff0 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  to remember that
1c000 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1c010 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63  needs to be sync
1c020 28 29 65 64 20 62 65 66 6f 72 65 20 64 61 74 61  ()ed before data
1c030 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67  base page pDbPag
1c040 65 2d 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20  e->pgno .** can 
1c050 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54  be written to. T
1c060 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1c070 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e  ready promised n
1c080 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ot to write to t
1c090 68 61 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a  hat.** page..*/.
1c0a0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
1c0b0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
1c0c0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
1c0d0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
1c0e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
1c0f0 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
1c100 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
1c110 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c130 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
1c140 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
1c150 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1c160 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
1c170 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
1c180 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
1c190 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
1c1a0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
1c1b0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
1c1c0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
1c1d0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
1c1e0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
1c1f0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1c200 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70   isCommit flag p
1c210 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33  assed to sqlite3
1c220 50 61 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f  PagerMovepage */
1c230 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
1c240 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
1c250 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
1c260 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
1c270 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
1c280 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
1c290 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
1c2a0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1c2b0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
1c2c0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
1c2d0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
1c2e0 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
1c2f0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
1c300 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
1c310 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
1c320 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
1c330 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
1c340 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1c350 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
1c360 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
1c370 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
1c380 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
1c390 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
1c3a0 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
1c3b0 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
1c3c0 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
1c3d0 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
1c3e0 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
1c3f0 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
1c400 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
1c410 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
1c420 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
1c430 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
1c440 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
1c450 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1c460 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
1c470 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
1c480 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c  Page, iFreePage,
1c490 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66   isCommit);.  if
1c4a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c4b0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1c4c0 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d  ;.  }.  pDbPage-
1c4d0 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67  >pgno = iFreePag
1c4e0 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50  e;..  /* If pDbP
1c4f0 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65 2d  age was a btree-
1c500 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61  page, then it ma
1c510 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61 67  y have child pag
1c520 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a  es and/or cells.
1c530 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20    ** that point 
1c540 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
1c550 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  s. The pointer m
1c560 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61  ap entries for a
1c570 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61  ll these.  ** pa
1c580 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63  ges need to be c
1c590 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  hanged..  **.  *
1c5a0 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73 20  * If pDbPage is 
1c5b0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
1c5c0 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74  , then the first
1c5d0 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f   4 bytes may sto
1c5e0 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  re a.  ** pointe
1c5f0 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e  r to a subsequen
1c600 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  t overflow page.
1c610 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1c620 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  case, then.  ** 
1c630 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
1c640 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1c650 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62 73  ted for the subs
1c660 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20  equent overflow 
1c670 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  page..  */.  if(
1c680 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
1c690 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
1c6a0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
1c6b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43 68  {.    rc = setCh
1c6c0 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50 61  ildPtrmaps(pDbPa
1c6d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1c6e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c6f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1c700 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1c710 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20    Pgno nextOvfl 
1c720 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50 61  = get4byte(pDbPa
1c730 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
1c740 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20  if( nextOvfl!=0 
1c750 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50  ){.      ptrmapP
1c760 75 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c  ut(pBt, nextOvfl
1c770 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  , PTRMAP_OVERFLO
1c780 57 32 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26  W2, iFreePage, &
1c790 72 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  rc);.      if( r
1c7a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1c7b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c7c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1c7d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74  .  }..  /* Fix t
1c7e0 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e  he database poin
1c7f0 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72  ter on page iPtr
1c800 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65  Page that pointe
1c810 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a  d at iDbPage so.
1c820 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69    ** that it poi
1c830 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67 65  nts at iFreePage
1c840 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70  . Also fix the p
1c850 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
1c860 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61   for.  ** iPtrPa
1c870 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1c880 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type!=PTRMAP_ROO
1c890 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1c8a0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
1c8b0 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70  Bt, iPtrPage, &p
1c8c0 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20  PtrPage, 0);.   
1c8d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c8e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
1c8f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1c900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c910 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67 65  erWrite(pPtrPage
1c920 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1c930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c940 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
1c950 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
1c960 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c970 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1c980 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  = modifyPagePoin
1c990 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69 44  ter(pPtrPage, iD
1c9a0 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
1c9b0 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65  , eType);.    re
1c9c0 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50 61  leasePage(pPtrPa
1c9d0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
1c9e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c9f0 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
1ca00 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54  t, iFreePage, eT
1ca10 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26  ype, iPtrPage, &
1ca20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rc);.    }.  }. 
1ca30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1ca40 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1ca50 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62  ation required b
1ca60 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  y incrVacuumStep
1ca70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  (). */.static in
1ca80 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
1ca90 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20  age(BtShared *, 
1caa0 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f  MemPage **, Pgno
1cab0 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a   *, Pgno, u8);..
1cac0 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20  /*.** Perform a 
1cad0 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61  single step of a
1cae0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61  n incremental-va
1caf0 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73  cuum. If success
1cb00 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ful, return.** S
1cb10 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65  QLITE_OK. If the
1cb20 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f  re is no work to
1cb30 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f   do (and therefo
1cb40 72 65 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a  re no point in .
1cb50 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** calling this 
1cb60 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
1cb70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
1cb80 4f 4e 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ONE. Or, if an e
1cb90 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1cba0 20 72 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68   return some oth
1cbb0 65 72 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  er error code..*
1cbc0 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66  *.** More specif
1cbd0 69 63 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e  ically, this fun
1cbe0 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
1cbf0 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68  o re-organize th
1cc00 65 20 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a  e database so .*
1cc10 2a 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  * that the last 
1cc20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65  page of the file
1cc30 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73   currently in us
1cc40 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  e is no longer i
1cc50 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  n use..**.** Par
1cc60 61 6d 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74  ameter nFin is t
1cc70 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
1cc80 65 73 20 74 68 61 74 20 74 68 69 73 20 64 61 74  es that this dat
1cc90 61 62 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74  abase would cont
1cca0 61 69 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73  ain.** were this
1ccb0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
1ccc0 20 75 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e   until it return
1ccd0 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a  s SQLITE_DONE..*
1cce0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d  *.** If the bCom
1ccf0 6d 69 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  mit parameter is
1cd00 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20   non-zero, this 
1cd10 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
1cd20 20 74 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61   that the .** ca
1cd30 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
1cd40 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
1cd50 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74  mStep() until it
1cd60 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cd70 44 4f 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65  DONE .** or an e
1cd80 72 72 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73  rror. bCommit is
1cd90 20 70 61 73 73 65 64 20 74 72 75 65 20 66 6f 72   passed true for
1cda0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d   an auto-vacuum-
1cdb0 6f 6e 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70  on-commit .** op
1cdc0 65 72 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73  eration, or fals
1cdd0 65 20 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65  e for an increme
1cde0 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a  ntal vacuum..*/.
1cdf0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
1ce00 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
1ce10 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
1ce20 69 6e 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67  in, Pgno iLastPg
1ce30 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
1ce40 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74    Pgno nFreeList
1ce50 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
1ce60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1ce70 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65  till on the free
1ce80 2d 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72  -list */.  int r
1ce90 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
1cea0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1ceb0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
1cec0 20 20 61 73 73 65 72 74 28 20 69 4c 61 73 74 50    assert( iLastP
1ced0 67 3e 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28  g>nFin );..  if(
1cee0 20 21 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28   !PTRMAP_ISPAGE(
1cef0 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26  pBt, iLastPg) &&
1cf00 20 69 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e   iLastPg!=PENDIN
1cf10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1cf20 20 29 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65   ){.    u8 eType
1cf30 3b 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50  ;.    Pgno iPtrP
1cf40 61 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c  age;..    nFreeL
1cf50 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26  ist = get4byte(&
1cf60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1cf70 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28  ta[36]);.    if(
1cf80 20 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b   nFreeList==0 ){
1cf90 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1cfa0 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1cfb0 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
1cfc0 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
1cfd0 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
1cfe0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1cff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d000 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d010 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
1d020 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1d030 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
1d040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1d050 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1d060 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
1d070 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
1d080 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43   ){.      if( bC
1d090 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ommit==0 ){.    
1d0a0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1d0b0 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
1d0c0 66 69 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e  files free-list.
1d0d0 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
1d0e0 75 69 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  uired.        **
1d0f0 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e   if bCommit is n
1d100 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
1d110 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
1d120 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
1d130 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
1d140 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
1d150 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
1d160 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
1d170 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
1d180 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
1d190 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
1d1a0 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
1d1b0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1d1c0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1d1d0 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
1d1e0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
1d1f0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
1d200 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
1d210 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
1d220 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42  eePg, iLastPg, B
1d230 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20  TALLOC_EXACT);. 
1d240 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1d250 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d260 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d270 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1d280 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1d290 50 67 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20  Pg==iLastPg );. 
1d2a0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1d2b0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1d2c0 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20     }.    } else 
1d2d0 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72  {.      Pgno iFr
1d2e0 65 65 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  eePg;           
1d2f0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72    /* Index of fr
1d300 65 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ee page to move 
1d310 70 4c 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20  pLastPg to */.  
1d320 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61      MemPage *pLa
1d330 73 74 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65  stPg;.      u8 e
1d340 4d 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41  Mode = BTALLOC_A
1d350 4e 59 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61  NY;   /* Mode pa
1d360 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f  rameter for allo
1d370 63 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20  cateBtreePage() 
1d380 2a 2f 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e  */.      Pgno iN
1d390 65 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ear = 0;        
1d3a0 20 20 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72     /* nearby par
1d3b0 61 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63  ameter for alloc
1d3c0 61 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a  ateBtreePage() *
1d3d0 2f 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74  /..      rc = bt
1d3e0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1d3f0 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
1d400 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
1d410 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d420 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d430 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
1d440 20 20 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69      /* If bCommi
1d450 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  t is zero, this 
1d460 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
1d470 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
1d480 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
1d490 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
1d4a0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
1d4b0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
1d4c0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
1d4d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1d4e0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
1d4f0 6e 64 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69  nd, if bCommit i
1d500 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
1d510 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20  ero, then keep. 
1d520 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20       ** looping 
1d530 75 6e 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67  until a free-pag
1d540 65 20 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e  e located within
1d550 20 74 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20   the first nFin 
1d560 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f  pages.      ** o
1d570 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f  f the file is fo
1d580 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  und..      */.  
1d590 20 20 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d      if( bCommit=
1d5a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d  =0 ){.        eM
1d5b0 6f 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45  ode = BTALLOC_LE
1d5c0 3b 0a 20 20 20 20 20 20 20 20 69 4e 65 61 72 20  ;.        iNear 
1d5d0 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a  = nFin;.      }.
1d5e0 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20        do {.     
1d5f0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1d600 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1d610 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1d620 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1d630 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65  g, &iFreePg, iNe
1d640 61 72 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20  ar, eMode);.    
1d650 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d670 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1d680 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
1d690 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1d6a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d6b0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
1d6c0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
1d6d0 6c 65 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69  le( bCommit && i
1d6e0 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
1d6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
1d700 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
1d710 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
1d720 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
1d730 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
1d740 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
1d750 72 65 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b  reePg, bCommit);
1d760 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
1d770 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
1d780 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d7a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1d7b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
1d7c0 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29  if( bCommit==0 )
1d7d0 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  {.    do {.     
1d7e0 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20   iLastPg--;.    
1d7f0 7d 77 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d  }while( iLastPg=
1d800 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d810 47 45 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41  GE(pBt) || PTRMA
1d820 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
1d830 61 73 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42  astPg) );.    pB
1d840 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d  t->bDoTruncate =
1d850 20 31 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61   1;.    pBt->nPa
1d860 67 65 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20  ge = iLastPg;.  
1d870 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1d880 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1d890 68 65 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e  he database open
1d8a0 65 64 20 62 79 20 74 68 65 20 66 69 72 73 74 20  ed by the first 
1d8b0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61  argument is an a
1d8c0 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
1d8d0 61 73 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67  ase.** nOrig pag
1d8e0 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
1d8f0 69 6e 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65  ining nFree free
1d900 20 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74   pages. Return t
1d910 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20  he expected .** 
1d920 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
1d930 62 61 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f  base in pages fo
1d940 6c 6c 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d  llowing an auto-
1d950 76 61 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e  vacuum operation
1d960 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f  ..*/.static Pgno
1d970 20 66 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53   finalDbSize(BtS
1d980 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
1d990 20 6e 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72   nOrig, Pgno nFr
1d9a0 65 65 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72  ee){.  int nEntr
1d9b0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1d9c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d9d0 20 6f 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f   of entries on o
1d9e0 6e 65 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a  ne ptrmap page *
1d9f0 2f 0a 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70  /.  Pgno nPtrmap
1da00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1da10 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1da20 20 50 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f   PtrMap pages to
1da30 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50   be freed */.  P
1da40 67 6e 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20  gno nFin;       
1da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1da60 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1da70 2f 0a 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42  /..  nEntry = pB
1da80 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b  t->usableSize/5;
1da90 0a 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46  .  nPtrmap = (nF
1daa0 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50  ree-nOrig+PTRMAP
1dab0 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72  _PAGENO(pBt, nOr
1dac0 69 67 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74  ig)+nEntry)/nEnt
1dad0 72 79 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72  ry;.  nFin = nOr
1dae0 69 67 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74  ig - nFree - nPt
1daf0 72 6d 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69  rmap;.  if( nOri
1db00 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
1db10 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
1db20 3c 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  <PENDING_BYTE_PA
1db30 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e  GE(pBt) ){.    n
1db40 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69  Fin--;.  }.  whi
1db50 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  le( PTRMAP_ISPAG
1db60 45 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20  E(pBt, nFin) || 
1db70 6e 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  nFin==PENDING_BY
1db80 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
1db90 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a      nFin--;.  }.
1dba0 0a 20 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a  .  return nFin;.
1dbb0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65  }../*.** A write
1dbc0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1dbd0 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f  t be opened befo
1dbe0 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  re calling this 
1dbf0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20  function..** It 
1dc00 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c  performs a singl
1dc10 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74  e unit of work t
1dc20 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d  owards an increm
1dc30 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a  ental vacuum..**
1dc40 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65  .** If the incre
1dc50 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73  mental vacuum is
1dc60 20 66 69 6e 69 73 68 65 64 20 61 66 74 65 72 20   finished after 
1dc70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61  this function ha
1dc80 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45  s run,.** SQLITE
1dc90 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
1dca0 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  d. If it is not 
1dcb0 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f  finished, but no
1dcc0 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c   error occurred,
1dcd0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1dce0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1dcf0 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65  wise an SQLite e
1dd00 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69  rror code. .*/.i
1dd10 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
1dd20 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65 20  ncrVacuum(Btree 
1dd30 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
1dd40 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1dd50 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
1dd60 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1dd70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
1dd80 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1dd90 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
1dda0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1ddb0 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
1ddc0 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
1ddd0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1dde0 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
1ddf0 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69  e{.    Pgno nOri
1de00 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1de10 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e  nt(pBt);.    Pgn
1de20 6f 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79  o nFree = get4by
1de30 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1de40 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20  >aData[36]);.   
1de50 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e   Pgno nFin = fin
1de60 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f  alDbSize(pBt, nO
1de70 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20  rig, nFree);..  
1de80 20 20 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e    if( nOrig<nFin
1de90 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1dea0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1deb0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  PT;.    }else if
1dec0 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
1ded0 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43     rc = saveAllC
1dee0 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
1def0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1df00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1df10 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65        invalidate
1df20 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
1df30 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72  (pBt);.        r
1df40 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
1df50 65 70 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f  ep(pBt, nFin, nO
1df60 72 69 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  rig, 0);.      }
1df70 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1df80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1df90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1dfa0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1dfb0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1dfc0 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
1dfd0 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
1dfe0 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d  >aData[28], pBt-
1dff0 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  >nPage);.      }
1e000 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e010 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f    rc = SQLITE_DO
1e020 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  NE;.    }.  }.  
1e030 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
1e040 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
1e050 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e060 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1e070 65 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69  ed prior to sqli
1e080 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77  te3PagerCommit w
1e090 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
1e0a0 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65  n.** is committe
1e0b0 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61  d for an auto-va
1e0c0 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a  cuum database..*
1e0d0 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f  *.** If SQLITE_O
1e0e0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  K is returned, t
1e0f0 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20  hen *pnTrunc is 
1e100 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
1e110 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68  r of pages.** th
1e120 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1e130 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61  should be trunca
1e140 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68  ted to during th
1e150 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73  e commit process
1e160 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64  . .** i.e. the d
1e170 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1e180 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20   reorganized so 
1e190 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69  that only the fi
1e1a0 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20  rst *pnTrunc.** 
1e1b0 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73 65  pages are in use
1e1c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e1d0 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
1e1e0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
1e1f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e200 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1e210 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
1e220 61 67 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59  ager;.  VVA_ONLY
1e230 28 20 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c  ( int nRef = sql
1e240 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
1e250 74 28 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20  t(pPager); )..  
1e260 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1e270 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1e280 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
1e290 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1e2a0 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
1e2b0 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
1e2c0 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
1e2d0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
1e2e0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b  {.    Pgno nFin;
1e2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e300 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
1e310 61 74 61 62 61 73 65 20 61 66 74 65 72 20 61 75  atabase after au
1e320 74 6f 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20  tovacuuming */. 
1e330 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20     Pgno nFree;  
1e340 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1e350 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
1e360 66 72 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c  freelist initial
1e370 6c 79 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69  ly */.    Pgno i
1e380 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1e390 54 68 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f  The next page to
1e3a0 20 62 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20   be freed */.   
1e3b0 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20   Pgno nOrig;    
1e3c0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1e3d0 73 69 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65  size before free
1e3e0 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69  ing */..    nOri
1e3f0 67 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75  g = btreePagecou
1e400 6e 74 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28  nt(pBt);.    if(
1e410 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
1e420 42 74 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f  Bt, nOrig) || nO
1e430 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  rig==PENDING_BYT
1e440 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
1e450 20 20 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f       /* It is no
1e460 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72  t possible to cr
1e470 65 61 74 65 20 61 20 64 61 74 61 62 61 73 65 20  eate a database 
1e480 66 6f 72 20 77 68 69 63 68 20 74 68 65 20 66 69  for which the fi
1e490 6e 61 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a  nal page.      *
1e4a0 2a 20 69 73 20 65 69 74 68 65 72 20 61 20 70 6f  * is either a po
1e4b0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f  inter-map page o
1e4c0 72 20 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79  r the pending-by
1e4d0 74 65 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a  te page. If one.
1e4e0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f        ** is enco
1e4f0 75 6e 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e  untered, this in
1e500 64 69 63 61 74 65 73 20 63 6f 72 72 75 70 74 69  dicates corrupti
1e510 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on..      */.   
1e520 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e530 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e540 20 20 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20     }..    nFree 
1e550 3d 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d  = get4byte(&pBt-
1e560 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1e570 36 5d 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20  6]);.    nFin = 
1e580 66 69 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c  finalDbSize(pBt,
1e590 20 6e 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a   nOrig, nFree);.
1e5a0 20 20 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72      if( nFin>nOr
1e5b0 69 67 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ig ) return SQLI
1e5c0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1e5d0 0a 20 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f  .    if( nFin<nO
1e5e0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20  rig ){.      rc 
1e5f0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
1e600 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  (pBt, 0, 0);.   
1e610 20 7d 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65   }.    for(iFree
1e620 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
1e630 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
1e640 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
1e650 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
1e660 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
1e670 69 6e 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20  in, iFree, 1);. 
1e680 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63     }.    if( (rc
1e690 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c  ==SQLITE_DONE ||
1e6a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
1e6b0 26 26 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20  && nFree>0 ){.  
1e6c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e6d0 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
1e6e0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
1e6f0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
1e700 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e710 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20  Data[32], 0);.  
1e720 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42      put4byte(&pB
1e730 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1e740 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  [36], 0);.      
1e750 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
1e760 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d  Page1->aData[28]
1e770 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70  , nFin);.      p
1e780 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1e790 3d 20 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  = 1;.      pBt->
1e7a0 6e 50 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20  nPage = nFin;.  
1e7b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
1e7c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e7d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
1e7e0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
1e7f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1e800 73 65 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69  sert( nRef>=sqli
1e810 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1e820 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
1e830 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73  turn rc;.}..#els
1e840 65 20 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49  e /* ifndef SQLI
1e850 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1e860 55 4d 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73  UM */.# define s
1e870 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78  etChildPtrmaps(x
1e880 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64  ) SQLITE_OK.#end
1e890 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
1e8a0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
1e8b0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
1e8c0 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
1e8d0 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
1e8e0 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
1e8f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
1e900 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
1e910 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
1e920 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
1e930 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
1e940 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
1e950 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
1e960 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
1e970 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
1e980 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
1e990 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
1e9a0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
1e9b0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
1e9c0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
1e9d0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1e9e0 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
1e9f0 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
1ea00 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
1ea10 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
1ea20 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
1ea30 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
1ea40 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
1ea50 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
1ea60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1ea70 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
1ea80 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
1ea90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
1eaa0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
1eab0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
1eac0 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
1ead0 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
1eae0 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
1eaf0 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
1eb00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
1eb10 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
1eb20 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
1eb30 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
1eb40 54 77 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65  Two() for the se
1eb50 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
1eb60 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
1eb70 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
1eb80 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
1eb90 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
1eba0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
1ebb0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
1ebc0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
1ebd0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
1ebe0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
1ebf0 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
1ec00 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1ec10 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
1ec20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1ec30 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1ec40 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1ec50 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
1ec60 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
1ec70 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
1ec80 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
1ec90 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
1eca0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
1ecb0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1ecc0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
1ecd0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
1ece0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
1ecf0 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
1ed00 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
1ed10 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
1ed20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
1ed30 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
1ed40 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
1ed50 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
1ed60 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
1ed70 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
1ed80 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
1ed90 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
1eda0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1edb0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
1edc0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
1edd0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1ede0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
1edf0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
1ee00 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
1ee10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
1ee20 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1ee30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
1ee40 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1ee50 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
1ee60 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1ee70 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
1ee80 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
1ee90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1eea0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1eeb0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
1eec0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
1eed0 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75    rc = autoVacuu
1eee0 6d 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20  mCommit(pBt);.  
1eef0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ef00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1ef10 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1ef20 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
1ef30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ef40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1ef50 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
1ef60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ef70 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
1ef80 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
1ef90 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20   pBt->nPage);.  
1efa0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
1efb0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1efc0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
1efd0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
1efe0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  ter, 0);.    sql
1eff0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
1f000 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1f010 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1f020 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1f030 6c 6c 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42  lled from both B
1f040 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
1f050 77 6f 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f  wo() and BtreeRo
1f060 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74  llback().** at t
1f070 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66  he conclusion of
1f080 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a   a transaction..
1f090 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1f0a0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
1f0b0 6f 6e 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  on(Btree *p){.  
1f0c0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f0d0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
1f0e0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
1f0f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1f100 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1f110 70 29 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  p) );..#ifndef S
1f120 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f130 41 43 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f  ACUUM.  pBt->bDo
1f140 54 72 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65  Truncate = 0;.#e
1f150 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e  ndif.  if( p->in
1f160 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45  Trans>TRANS_NONE
1f170 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61   && db->nVdbeRea
1f180 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  d>1 ){.    /* If
1f190 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65 72   there are other
1f1a0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
1f1b0 74 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74  ts that belong t
1f1c0 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 0a  o this database.
1f1d0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64      ** handle, d
1f1e0 6f 77 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65  owngrade to a re
1f1f0 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
1f200 69 6f 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73  ion. The other s
1f210 74 61 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a  tatements.    **
1f220 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65   may still be re
1f230 61 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64  ading from the d
1f240 61 74 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20  atabase.  */.   
1f250 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
1f260 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1f270 6b 73 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e  ks(p);.    p->in
1f280 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45  Trans = TRANS_RE
1f290 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1f2a0 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
1f2b0 65 20 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f  e had any kind o
1f2c0 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
1f2d0 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
1f2e0 65 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  e .    ** transa
1f2f0 63 74 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74  ction count of t
1f300 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 2e  he shared btree.
1f310 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1f320 69 6f 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a  ion count .    *
1f330 2a 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  * reaches 0, set
1f340 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
1f350 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
1f360 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
1f370 49 66 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a  IfUnused().    *
1f380 2a 20 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c  * call below wil
1f390 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  l unlock the pag
1f3a0 65 72 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  er.  */.    if( 
1f3b0 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
1f3c0 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  S_NONE ){.      
1f3d0 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61  clearAllSharedCa
1f3e0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29  cheTableLocks(p)
1f3f0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72  ;.      pBt->nTr
1f400 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20  ansaction--;.   
1f410 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e     if( 0==pBt->n
1f420 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20  Transaction ){. 
1f430 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72         pBt->inTr
1f440 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
1f450 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  S_NONE;.      }.
1f460 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
1f470 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
1f480 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20  ansaction state 
1f490 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e  to TRANS_NONE an
1f4a0 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20  d unlock the .  
1f4b0 20 20 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68    ** pager if th
1f4c0 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74  is call closed t
1f4d0 68 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20  he only read or 
1f4e0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
1f4f0 6e 2e 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e  n.  */.    p->in
1f500 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
1f510 4e 45 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  NE;.    unlockBt
1f520 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
1f530 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e  ;.  }..  btreeIn
1f540 74 65 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f  tegrity(p);.}../
1f550 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
1f560 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
1f570 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
1f580 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1f590 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
1f5a0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1f5b0 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
1f5c0 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
1f5d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1f5e0 74 50 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74  tPhaseOne() rout
1f5f0 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72  ine does the fir
1f600 73 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f  st phase and sho
1f610 75 6c 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  uld.** be invoke
1f620 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69  d prior to calli
1f630 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  ng this routine.
1f640 20 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72    The sqlite3Btr
1f650 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1f660 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69  ().** routine di
1f670 64 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  d all the work o
1f680 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
1f690 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
1f6a0 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
1f6b0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
1f6c0 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
1f6d0 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
1f6e0 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
1f6f0 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
1f700 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
1f710 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
1f720 61 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20  ate or zero the 
1f730 68 65 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a  header in the.**
1f740 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1f750 75 72 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75  urnal (which cau
1f760 73 65 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  ses the transact
1f770 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61  ion to commit) a
1f780 6e 64 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73  nd.** drop locks
1f790 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79  ..**.** Normally
1f7a0 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  , if an error oc
1f7b0 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20 70  curs while the p
1f7c0 61 67 65 72 20 6c 61 79 65 72 20 69 73 20 61 74  ager layer is at
1f7d0 74 65 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20  tempting to .** 
1f7e0 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64  finalize the und
1f7f0 65 72 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  erlying journal 
1f800 66 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  file, this funct
1f810 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
1f820 72 72 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20  rror and.** the 
1f830 75 70 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c  upper layer will
1f840 20 61 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62   attempt a rollb
1f850 61 63 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ack. However, if
1f860 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1f870 6d 65 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a  ment.** is non-z
1f880 65 72 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d  ero then this b-
1f890 74 72 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tree transaction
1f8a0 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75   is part of a mu
1f8b0 6c 74 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61  lti-file .** tra
1f8c0 6e 73 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69  nsaction. In thi
1f8d0 73 20 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e  s case, the tran
1f8e0 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  saction has alre
1f8f0 61 64 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74  ady been committ
1f900 65 64 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74  ed .** (by delet
1f910 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ing a master jou
1f920 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74  rnal file) and t
1f930 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69  he caller will i
1f940 67 6e 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66  gnore this .** f
1f950 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
1f960 63 6f 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69  code. So, even i
1f970 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1f980 73 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c  s in the pager l
1f990 61 79 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74  ayer,.** reset t
1f9a0 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
1f9b0 73 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65  s internal state
1f9c0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
1f9d0 74 20 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74  t the write.** t
1f9e0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62  ransaction has b
1f9f0 65 65 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73  een closed. This
1fa00 20 69 73 20 71 75 69 74 65 20 73 61 66 65 2c 20   is quite safe, 
1fa10 61 73 20 74 68 65 20 70 61 67 65 72 20 77 69 6c  as the pager wil
1fa20 6c 20 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69  l have.** transi
1fa30 74 69 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72  tioned to the er
1fa40 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ror state..**.**
1fa50 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
1fa60 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1fa70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1fa80 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
1fa90 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
1faa0 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
1fab0 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
1fac0 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
1fad0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
1fae0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74  ommitPhaseTwo(Bt
1faf0 72 65 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65  ree *p, int bCle
1fb00 61 6e 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d  anup){..  if( p-
1fb10 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
1fb20 4e 4f 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51  NONE ) return SQ
1fb30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
1fb40 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
1fb50 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74  .  btreeIntegrit
1fb60 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  y(p);..  /* If t
1fb70 68 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20  he handle has a 
1fb80 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
1fb90 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74  n open, commit t
1fba0 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 73  he shared-btrees
1fbb0 20 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69   .  ** transacti
1fbc0 6f 6e 20 61 6e 64 20 73 65 74 20 74 68 65 20 73  on and set the s
1fbd0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
1fbe0 52 41 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a  RANS_READ..  */.
1fbf0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1fc00 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  ==TRANS_WRITE ){
1fc10 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1fc20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
1fc30 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73   p->pBt;.    ass
1fc40 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
1fc50 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
1fc60 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
1fc70 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
1fc80 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
1fc90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fca0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
1fcb0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
1fcc0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1fcd0 4f 4b 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d  OK && bCleanup==
1fce0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
1fcf0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1fd00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1fd10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
1fd20 44 61 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20  DataVersion--;  
1fd30 2f 2a 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f  /* Compensate fo
1fd40 72 20 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56  r pPager->iDataV
1fd50 65 72 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20  ersion++; */.   
1fd60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
1fd70 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ion = TRANS_READ
1fd80 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61 72  ;.    btreeClear
1fd90 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b  HasContent(pBt);
1fda0 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64  .  }..  btreeEnd
1fdb0 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a  Transaction(p);.
1fdc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
1fdd0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
1fde0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1fdf0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
1fe00 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
1fe10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1fe20 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
1fe30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
1fe40 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
1fe50 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
1fe60 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
1fe70 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
1fe80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1fe90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
1fea0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1feb0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30  mitPhaseTwo(p, 0
1fec0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1fed0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1fee0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1fef0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ff00 65 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  e sets the state
1ff10 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54   to CURSOR_FAULT
1ff20 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a   and the error.*
1ff30 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64  * code to errCod
1ff40 65 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73  e for every curs
1ff50 6f 72 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72  or on any BtShar
1ff60 65 64 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a  ed that pBtree.*
1ff70 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f  * references.  O
1ff80 72 20 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e  r if the writeOn
1ff90 6c 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ly flag is set t
1ffa0 6f 20 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a  o 1, then only.*
1ffb0 2a 20 74 72 69 70 20 77 72 69 74 65 20 63 75 72  * trip write cur
1ffc0 73 6f 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72  sors and leave r
1ffd0 65 61 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68  ead cursors unch
1ffe0 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  anged..**.** Eve
1fff0 72 79 20 63 75 72 73 6f 72 20 69 73 20 61 20 63  ry cursor is a c
20000 61 6e 64 69 64 61 74 65 20 74 6f 20 62 65 20 74  andidate to be t
20010 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
20020 67 20 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61  g cursors.** tha
20030 74 20 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65  t belong to othe
20040 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
20050 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
20060 65 6e 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72  en to be.** shar
20070 69 6e 67 20 74 68 65 20 63 61 63 68 65 20 77 69  ing the cache wi
20080 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
20090 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
200a0 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
200b0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
200c0 2e 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e  . If the writeOn
200d0 6c 79 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72  ly.** flag is tr
200e0 75 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72  ue, then only wr
200f0 69 74 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64  ite-cursors need
20100 20 62 65 20 74 72 69 70 70 65 64 20 2d 20 72 65   be tripped - re
20110 61 64 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f  ad-only.** curso
20120 72 73 20 73 61 76 65 20 74 68 65 69 72 20 63 75  rs save their cu
20130 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20  rrent positions 
20140 73 6f 20 74 68 61 74 20 74 68 65 79 20 6d 61 79  so that they may
20150 20 63 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f   continue .** fo
20160 6c 6c 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c  llowing the roll
20170 62 61 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69  back. Or, if wri
20180 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c  teOnly is false,
20190 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
201a0 20 0a 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e   .** tripped. In
201b0 20 67 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f   general, writeO
201c0 6e 6c 79 20 69 73 20 66 61 6c 73 65 20 69 66 20  nly is false if 
201d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
201e0 62 65 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20  being.** rolled 
201f0 62 61 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68  back modified th
20200 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
20210 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  a. In this case 
20220 62 2d 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70  b-tree root.** p
20230 61 67 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65  ages may be move
20240 64 20 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f  d or deleted fro
20250 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  m the database a
20260 6c 74 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e  ltogether, makin
20270 67 0a 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66  g.** it unsafe f
20280 6f 72 20 72 65 61 64 20 63 75 72 73 6f 72 73 20  or read cursors 
20290 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a  to continue..**.
202a0 2a 2a 20 49 66 20 74 68 65 20 77 72 69 74 65 4f  ** If the writeO
202b0 6e 6c 79 20 66 6c 61 67 20 69 73 20 74 72 75 65  nly flag is true
202c0 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73   and an error is
202d0 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69   encountered whi
202e0 6c 65 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68  le .** saving th
202f0 65 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69  e current positi
20300 6f 6e 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c  on of a read-onl
20310 79 20 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75  y cursor, all cu
20320 72 73 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75  rsors, .** inclu
20330 64 69 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75  ding all read-cu
20340 72 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65  rsors are trippe
20350 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  d..**.** SQLITE_
20360 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
20370 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
20380 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
20390 75 72 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76  urs while.** sav
203a0 69 6e 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73  ing a cursor pos
203b0 69 74 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65  ition, an SQLite
203c0 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
203d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
203e0 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42  TripAllCursors(B
203f0 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e  tree *pBtree, in
20400 74 20 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77  t errCode, int w
20410 72 69 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43  riteOnly){.  BtC
20420 75 72 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20  ursor *p;.  int 
20430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20440 0a 20 20 61 73 73 65 72 74 28 20 28 77 72 69 74  .  assert( (writ
20450 65 4f 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74  eOnly==0 || writ
20460 65 4f 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43  eOnly==1) && BTC
20470 46 5f 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29  F_WriteFlag==1 )
20480 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
20490 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
204a0 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
204b0 0a 20 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65  .    for(p=pBtre
204c0 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  e->pBt->pCursor;
204d0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
204e0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
204f0 20 20 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c      if( writeOnl
20500 79 20 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67  y && (p->curFlag
20510 73 20 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c  s & BTCF_WriteFl
20520 61 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ag)==0 ){.      
20530 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d    if( p->eState=
20540 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c  =CURSOR_VALID ||
20550 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53   p->eState==CURS
20560 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20  OR_SKIPNEXT ){. 
20570 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 61           rc = sa
20580 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
20590 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  (p);.          i
205a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
205b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
205c0 28 76 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72  (void)sqlite3Btr
205d0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
205e0 28 70 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b  (pBtree, rc, 0);
205f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
20600 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
20610 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
20630 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
20640 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20  Cursor(p);.     
20650 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
20660 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
20670 20 20 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74       p->skipNext
20680 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20   = errCode;.    
20690 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
206a0 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20  0; i<=p->iPage; 
206b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65  i++){.        re
206c0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
206d0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  age[i]);.       
206e0 20 70 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20   p->apPage[i] = 
206f0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
20700 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
20710 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
20720 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
20740 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
20750 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a  on in progress..
20760 2a 2a 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64  **.** If tripCod
20770 65 20 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f  e is not SQLITE_
20780 4f 4b 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20  OK then cursors 
20790 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
207a0 74 65 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a  ted (tripped)..*
207b0 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72  * Only write cur
207c0 73 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64  sors are tripped
207d0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
207e0 20 74 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75   true but all cu
207f0 72 73 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69  rsors are.** tri
20800 70 70 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c  pped if writeOnl
20810 79 20 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79  y is false.  Any
20820 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a   attempt to use.
20830 2a 2a 20 61 20 74 72 69 70 70 65 64 20 63 75 72  ** a tripped cur
20840 73 6f 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  sor will result 
20850 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a  in an error..**.
20860 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c  ** This will rel
20870 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
20880 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
20890 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68  ase file.  If th
208a0 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63  ere.** are no ac
208b0 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74  tive cursors, it
208c0 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74   also releases t
208d0 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f  he read lock..*/
208e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
208f0 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20  eRollback(Btree 
20900 2a 70 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65  *p, int tripCode
20910 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
20920 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
20930 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
20940 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  >pBt;.  MemPage 
20950 2a 70 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65  *pPage1;..  asse
20960 72 74 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31  rt( writeOnly==1
20970 20 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30   || writeOnly==0
20980 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72   );.  assert( tr
20990 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41  ipCode==SQLITE_A
209a0 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  BORT_ROLLBACK ||
209b0 20 74 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54   tripCode==SQLIT
209c0 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65  E_OK );.  sqlite
209d0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
209e0 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d    if( tripCode==
209f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20a00 20 72 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d   rc = tripCode =
20a10 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
20a20 70 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  pBt, 0, 0);.    
20a30 69 66 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e  if( rc ) writeOn
20a40 6c 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ly = 0;.  }else{
20a50 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
20a60 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  _OK;.  }.  if( t
20a70 72 69 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  ripCode ){.    i
20a80 6e 74 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33  nt rc2 = sqlite3
20a90 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
20aa0 6f 72 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c  ors(p, tripCode,
20ab0 20 77 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20   writeOnly);.   
20ac0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
20ad0 49 54 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65  ITE_OK || (write
20ae0 4f 6e 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d  Only==0 && rc2==
20af0 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
20b00 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54    if( rc2!=SQLIT
20b10 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b  E_OK ) rc = rc2;
20b20 0a 20 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65  .  }.  btreeInte
20b30 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28  grity(p);..  if(
20b40 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
20b50 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
20b60 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73  int rc2;..    as
20b70 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
20b80 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
20b90 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
20ba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
20bb0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
20bc0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
20bd0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
20be0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
20bf0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
20c00 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
20c10 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
20c20 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
20c30 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
20c40 2a 20 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50  * call btreeGetP
20c50 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
20c60 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
20c70 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
20c80 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
20c90 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
20ca0 20 69 66 28 20 62 74 72 65 65 47 65 74 50 61 67   if( btreeGetPag
20cb0 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
20cc0 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1, 0)==SQLITE_OK
20cd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
20ce0 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 32  age = get4byte(2
20cf0 38 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  8+(u8*)pPage1->a
20d00 44 61 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73  Data);.      tes
20d10 74 63 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20  tcase( nPage==0 
20d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61  );.      if( nPa
20d30 67 65 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50  ge==0 ) sqlite3P
20d40 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
20d50 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
20d60 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
20d70 73 65 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  se( pBt->nPage!=
20d80 6e 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70  nPage );.      p
20d90 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67  Bt->nPage = nPag
20da0 65 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  e;.      release
20db0 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
20dc0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
20dd0 63 6f 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72  countValidCursor
20de0 73 28 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a  s(pBt, 1)==0 );.
20df0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
20e00 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
20e10 45 41 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c  EAD;.    btreeCl
20e20 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
20e30 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
20e40 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  EndTransaction(p
20e50 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20e60 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
20e70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20e80 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d 65   Start a stateme
20e90 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
20ea0 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  n. The subtransa
20eb0 63 74 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c  ction can be rol
20ec0 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65  led.** back inde
20ed0 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65  pendently of the
20ee0 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f   main transactio
20ef0 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72  n. You must star
20f00 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
20f10 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74  .** before start
20f20 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61 63  ing a subtransac
20f30 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61  tion. The subtra
20f40 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
20f50 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
20f60 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20  .** if the main 
20f70 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d  transaction comm
20f80 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63  its or rolls bac
20f90 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65  k..**.** Stateme
20fa0 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
20fb0 6e 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75  ns are used arou
20fc0 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51  nd individual SQ
20fd0 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20  L statements.** 
20fe0 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e  that are contain
20ff0 65 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49  ed within a BEGI
21000 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b  N...COMMIT block
21010 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69  .  If a constrai
21020 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  nt.** error occu
21030 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  rs within the st
21040 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66  atement, the eff
21050 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20  ect of that one 
21060 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e  statement.** can
21070 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
21080 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
21090 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65  o rollback the e
210a0 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f  ntire transactio
210b0 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65  n..**.** A state
210c0 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63  ment sub-transac
210d0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
210e0 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d  ted as an anonym
210f0 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54  ous savepoint. T
21100 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73  he.** value pass
21110 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
21120 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
21130 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
21140 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a  f savepoints,.**
21150 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e   including the n
21160 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76  ew anonymous sav
21170 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20  epoint, open on 
21180 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e  the B-Tree. i.e.
21190 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   if there.** are
211a0 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76 65 70   no active savep
211b0 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68  oints and no oth
211c0 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61  er statement-tra
211d0 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a  nsactions open,.
211e0 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73  ** iStatement is
211f0 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f   1. This anonymo
21200 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e  us savepoint can
21210 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20   be released or 
21220 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75  rolled back.** u
21230 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  sing the sqlite3
21240 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29  BtreeSavepoint()
21250 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e   function..*/.in
21260 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
21270 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
21280 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74  , int iStatement
21290 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
212a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
212b0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
212c0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
212d0 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
212e0 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
212f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   );.  assert( (p
21300 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
21310 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
21320 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53   );.  assert( iS
21330 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
21340 61 73 73 65 72 74 28 20 69 53 74 61 74 65 6d 65  assert( iStateme
21350 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70  nt>p->db->nSavep
21360 6f 69 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74  oint );.  assert
21370 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
21380 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
21390 45 20 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65  E );.  /* At the
213a0 20 70 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20   pager level, a 
213b0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
213c0 63 74 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70  ction is a savep
213d0 6f 69 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61  oint with.  ** a
213e0 6e 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20  n index greater 
213f0 74 68 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69  than all savepoi
21400 6e 74 73 20 63 72 65 61 74 65 64 20 65 78 70 6c  nts created expl
21410 69 63 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a  icitly using.  *
21420 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
21430 2e 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20  . It is illegal 
21440 74 6f 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65  to open, release
21450 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79   or rollback any
21460 0a 20 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70  .  ** such savep
21470 6f 69 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20  oints while the 
21480 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
21490 63 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20  ction savepoint 
214a0 69 73 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a  is active..  */.
214b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
214c0 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74  gerOpenSavepoint
214d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53  (pBt->pPager, iS
214e0 74 61 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c  tatement);.  sql
214f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
21500 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
21510 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
21520 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
21530 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
21540 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
21550 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
21560 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
21570 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
21580 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
21590 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
215a0 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
215b0 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
215c0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
215d0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
215e0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
215f0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
21600 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
21610 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
21620 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
21630 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
21640 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
21650 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
21660 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
21670 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
21680 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
21690 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
216a0 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
216b0 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
216c0 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
216d0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
216e0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
216f0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
21700 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
21710 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
21720 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
21730 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
21740 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21750 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
21760 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
21770 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
21780 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21790 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
217a0 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
217b0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
217c0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
217d0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
217e0 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f  sert( op==SAVEPO
217f0 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f  INT_RELEASE || o
21800 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
21810 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  LBACK );.    ass
21820 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e  ert( iSavepoint>
21830 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e  =0 || (iSavepoin
21840 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56  t==-1 && op==SAV
21850 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29  EPOINT_ROLLBACK)
21860 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
21870 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
21880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21890 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74  gerSavepoint(pBt
218a0 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53  ->pPager, op, iS
218b0 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69  avepoint);.    i
218c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
218d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53   ){.      if( iS
218e0 61 76 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70  avepoint<0 && (p
218f0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
21900 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50  TS_INITIALLY_EMP
21910 54 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  TY)!=0 ){.      
21920 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30    pBt->nPage = 0
21930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21940 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
21950 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74  (pBt);.      pBt
21960 2d 3e 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79  ->nPage = get4by
21970 74 65 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61  te(28 + pBt->pPa
21980 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20  ge1->aData);..  
21990 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
219a0 61 73 65 20 73 69 7a 65 20 77 61 73 20 77 72 69  ase size was wri
219b0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66  tten into the of
219c0 66 73 65 74 20 32 38 20 6f 66 20 74 68 65 20 68  fset 28 of the h
219d0 65 61 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77  eader.      ** w
219e0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
219f0 69 6f 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20  ion started, so 
21a00 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
21a10 20 76 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74   value at offset
21a20 0a 20 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20  .      ** 28 is 
21a30 6e 6f 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20  nonzero. */.    
21a40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e    assert( pBt->n
21a50 50 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a  Page>0 );.    }.
21a60 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
21a70 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
21a80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21a90 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
21aa0 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
21ab0 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74  BTree whose root
21ac0 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a   is on the page.
21ad0 2a 2a 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20  ** iTable. If a 
21ae0 72 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72  read-only cursor
21af0 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69   is requested, i
21b00 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
21b10 74 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20  t.** the caller 
21b20 61 6c 72 65 61 64 79 20 68 61 73 20 61 74 20 6c  already has at l
21b30 65 61 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79  east a read-only
21b40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
21b50 6e 0a 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61  n.** on the data
21b60 62 61 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66  base already. If
21b70 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
21b80 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
21b90 65 6e 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72  en.** the caller
21ba0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68   is assumed to h
21bb0 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
21bc0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
21bd0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45  *.** If the BTRE
21be0 45 5f 57 52 43 53 52 20 62 69 74 20 6f 66 20 77  E_WRCSR bit of w
21bf0 72 46 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20  rFlag is clear, 
21c00 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
21c10 63 61 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75  can only.** be u
21c20 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
21c30 20 20 49 66 20 74 68 65 20 42 54 52 45 45 5f 57    If the BTREE_W
21c40 52 43 53 52 20 62 69 74 20 69 73 20 73 65 74 2c  RCSR bit is set,
21c50 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
21c60 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20  .** can be used 
21c70 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
21c80 6f 72 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74  or writing if ot
21c90 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66  her conditions f
21ca0 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72  or writing.** ar
21cb0 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
21cc0 73 65 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69  se are the condi
21cd0 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20  tions that must 
21ce0 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a  be met in order.
21cf0 2a 2a 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  ** for writing t
21d00 6f 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a  o be allowed:.**
21d10 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73  .** 1:  The curs
21d20 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  or must have bee
21d30 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72  n opened with wr
21d40 46 6c 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Flag containing 
21d50 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a  BTREE_WRCSR.**.*
21d60 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
21d70 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
21d80 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
21d90 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
21da0 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
21db0 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
21dc0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
21dd0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
21de0 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
21df0 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
21e00 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
21e10 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
21e20 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
21e30 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
21e40 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
21e50 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
21e60 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
21e70 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
21e80 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
21e90 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
21ea0 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
21eb0 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
21ec0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
21ed0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
21ee0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
21ef0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
21f00 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
21f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45  .**.** The BTREE
21f20 5f 46 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f  _FORDELETE bit o
21f30 66 20 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74  f wrFlag may opt
21f40 69 6f 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69  ionally be set i
21f50 66 20 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a  f BTREE_WRCSR.**
21f60 20 69 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52   is set.  If FOR
21f70 44 45 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74  DELETE is set, t
21f80 68 61 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f  hat is a hint to
21f90 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
21fa0 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  ion that.** this
21fb0 20 63 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c   cursor will onl
21fc0 79 20 62 65 20 75 73 65 64 20 74 6f 20 73 65 65  y be used to see
21fd0 6b 20 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20  k to and delete 
21fe0 65 6e 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e  entries of an in
21ff0 64 65 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  dex.** as part o
22000 66 20 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54  f a larger DELET
22010 45 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  E statement.  Th
22020 65 20 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74  e FORDELETE hint
22030 20 69 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a   is not used by.
22040 2a 2a 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e  ** this implemen
22050 74 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20  tation.  But in 
22060 61 20 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61  a hypothetical a
22070 6c 74 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61  lternative stora
22080 67 65 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e  ge engine .** in
22090 20 77 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74   which index ent
220a0 72 69 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  ries are automat
220b0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
220c0 68 65 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  hen correspondin
220d0 67 20 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20  g table.** rows 
220e0 61 72 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65  are deleted, the
220f0 20 46 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20   FORDELETE flag 
22100 69 73 20 61 20 68 69 6e 74 20 74 68 61 74 20 61  is a hint that a
22110 6c 6c 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45  ll SEEK and DELE
22120 54 45 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73  TE.** operations
22130 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20   on this cursor 
22140 63 61 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e  can be no-ops an
22150 64 20 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61  d all READ opera
22160 74 69 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65  tions can .** re
22170 74 75 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20  turn a null row 
22180 28 32 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30  (2-bytes: 0x01 0
22190 78 30 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  x00)..**.** No c
221a0 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
221b0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
221c0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
221d0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
221e0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
221f0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
22200 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
22210 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
22220 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
22230 6f 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20  orrectly..**.** 
22240 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
22250 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  at the sqlite3Bt
22260 72 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20  reeCursorZero() 
22270 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a  has been called.
22280 2a 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e  ** on pCur to in
22290 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d  itialize the mem
222a0 6f 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20  ory space prior 
222b0 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73  to invoking this
222c0 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
222d0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
222e0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22310 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
22320 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
22330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22340 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
22350 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
22360 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
22370 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
223a0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
223b0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
223c0 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
223d0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
223e0 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
223f0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
22400 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
22410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22420 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
22430 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
22440 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64  */.){.  BtShared
22450 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20   *pBt = p->pBt; 
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22470 2a 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20  * Shared b-tree 
22480 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75  handle */.  BtCu
22490 72 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20  rsor *pX;       
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76     /* Looping ov
224c0 65 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72  er other all cur
224d0 73 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  sors */..  asser
224e0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
224f0 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
22500 20 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67    assert( wrFlag
22510 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77  ==0 .       || w
22520 72 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43  rFlag==BTREE_WRC
22530 53 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  SR .       || wr
22540 46 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43  Flag==(BTREE_WRC
22550 53 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45  SR|BTREE_FORDELE
22560 54 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  TE) .  );..  /* 
22570 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
22580 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20  sert statements 
22590 76 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74  verify that if t
225a0 68 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c  his is a sharabl
225b0 65 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64  e .  ** b-tree d
225c0 61 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e  atabase, the con
225d0 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
225e0 6e 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20  ng the required 
225f0 74 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20  table locks, .  
22600 2a 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f  ** and that no o
22610 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
22620 68 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  has any open cur
22630 73 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63  sor that conflic
22640 74 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68  ts with .  ** th
22650 69 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61  is lock.  */.  a
22660 73 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64  ssert( hasShared
22670 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70  CacheTableLock(p
22680 2c 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e  , iTable, pKeyIn
22690 66 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32  fo!=0, (wrFlag?2
226a0 3a 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  :1)) );.  assert
226b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21  ( wrFlag==0 || !
226c0 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  hasReadConflicts
226d0 28 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a  (p, iTable) );..
226e0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
226f0 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
22700 6f 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69  opened the requi
22710 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  red transaction.
22720 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
22730 3e 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e  >inTrans>TRANS_N
22740 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ONE );.  assert(
22750 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d   wrFlag==0 || p-
22760 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
22770 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
22780 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26  t( pBt->pPage1 &
22790 26 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  & pBt->pPage1->a
227a0 44 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  Data );.  assert
227b0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28  ( wrFlag==0 || (
227c0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
227d0 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d  BTS_READ_ONLY)==
227e0 30 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c  0 );..  if( wrFl
227f0 61 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61  ag ){.    alloca
22800 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
22810 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
22820 54 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65  TmpSpace==0 ) re
22830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
22840 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  M_BKPT;.  }.  if
22850 28 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62  ( iTable==1 && b
22860 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
22870 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  t)==0 ){.    ass
22880 65 72 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29  ert( wrFlag==0 )
22890 3b 0a 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30  ;.    iTable = 0
228a0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
228b0 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72  that no other er
228c0 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20  rors can occur, 
228d0 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69  finish filling i
228e0 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20  n the BtCursor. 
228f0 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e   ** variables an
22900 64 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  d link the curso
22910 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
22920 72 65 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20  red list.  */.  
22930 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
22940 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
22950 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
22960 31 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49  1;.  pCur->pKeyI
22970 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a  nfo = pKeyInfo;.
22980 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d    pCur->pBtree =
22990 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20   p;.  pCur->pBt 
229a0 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63  = pBt;.  pCur->c
229b0 75 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67  urFlags = wrFlag
229c0 20 3f 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61   ? BTCF_WriteFla
229d0 67 20 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63  g : 0;.  pCur->c
229e0 75 72 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77  urPagerFlags = w
229f0 72 46 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45  rFlag ? 0 : PAGE
22a00 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a  R_GET_READONLY;.
22a10 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
22a20 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75  e two or more cu
22a30 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  rsors on the sam
22a40 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c  e btree, then al
22a50 6c 20 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73  l such.  ** curs
22a60 6f 72 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20  ors *must* have 
22a70 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
22a80 65 20 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20  e flag set. */. 
22a90 20 66 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75   for(pX=pBt->pCu
22aa0 72 73 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d  rsor; pX; pX=pX-
22ab0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
22ac0 20 70 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28   pX->pgnoRoot==(
22ad0 50 67 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20  Pgno)iTable ){. 
22ae0 20 20 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67       pX->curFlag
22af0 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70  s |= BTCF_Multip
22b00 6c 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  le;.      pCur->
22b10 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
22b20 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d  _Multiple;.    }
22b30 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65  .  }.  pCur->pNe
22b40 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
22b50 72 3b 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f  r;.  pBt->pCurso
22b60 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72  r = pCur;.  pCur
22b70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
22b80 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74  R_INVALID;.  ret
22b90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22ba0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
22bb0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
22bc0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
22bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22be0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
22bf0 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
22c00 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
22c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
22c30 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
22c40 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
22c50 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
22c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c70 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
22c80 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
22c90 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
22ca0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
22cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22cc0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
22cd0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
22ce0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
22cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
22d10 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
22d20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
22d30 20 72 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c   rc;.  if( iTabl
22d40 65 3c 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  e<1 ){.    rc = 
22d50 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22d60 4b 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  KPT;.  }else{.  
22d70 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22d80 74 65 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d  ter(p);.    rc =
22d90 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20   btreeCursor(p, 
22da0 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20  iTable, wrFlag, 
22db0 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b  pKeyInfo, pCur);
22dc0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22dd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
22de0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
22df0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
22e00 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73  size of a BtCurs
22e10 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74  or object in byt
22e20 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
22e30 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65 65  nterfaces is nee
22e40 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65 72  ded so that user
22e50 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e  s of cursors can
22e60 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20   preallocate.** 
22e70 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61  sufficient stora
22e80 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72  ge to hold a cur
22e90 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72 73  sor.  The BtCurs
22ea0 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61  or object is opa
22eb0 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20  que.** to users 
22ec0 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64  so they cannot d
22ed0 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74  o the sizeof() t
22ee0 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79  hemselves - they
22ef0 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68   must call.** th
22f00 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69  is routine..*/.i
22f10 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
22f20 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b  ursorSize(void){
22f30 0a 20 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38  .  return ROUND8
22f40 28 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72  (sizeof(BtCursor
22f50 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  ));.}../*.** Ini
22f60 74 69 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74  tialize memory t
22f70 68 61 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76  hat will be conv
22f80 65 72 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43  erted into a BtC
22f90 75 72 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a  ursor object..**
22fa0 0a 2a 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61  .** The simple a
22fb0 70 70 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75  pproach here wou
22fc0 6c 64 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28  ld be to memset(
22fd0 29 20 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a  ) the entire obj
22fe0 65 63 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20  ect.** to zero. 
22ff0 20 42 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75   But it turns ou
23000 74 20 74 68 61 74 20 74 68 65 20 61 70 50 61 67  t that the apPag
23010 65 5b 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20  e[] and aiIdx[] 
23020 61 72 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74  arrays.** do not
23030 20 6e 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f   need to be zero
23040 65 64 20 61 6e 64 20 74 68 65 79 20 61 72 65 20  ed and they are 
23050 6c 61 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e  large, so we can
23060 20 73 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f   save a lot.** o
23070 66 20 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b  f run-time by sk
23080 69 70 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69  ipping the initi
23090 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f  alization of tho
230a0 73 65 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a  se elements..*/.
230b0 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
230c0 65 43 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75  eCursorZero(BtCu
230d0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  rsor *p){.  mems
230e0 65 74 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f  et(p, 0, offseto
230f0 66 28 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67  f(BtCursor, iPag
23100 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  e));.}../*.** Cl
23110 6f 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54  ose a cursor.  T
23120 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20  he read lock on 
23130 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23140 65 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a  e is released.**
23150 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63   when the last c
23160 75 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e  ursor is closed.
23170 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
23180 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28  treeCloseCursor(
23190 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
231a0 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65  .  Btree *pBtree
231b0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
231c0 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b  .  if( pBtree ){
231d0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
231e0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
231f0 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73  pCur->pBt;.    s
23200 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
23210 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71  (pBtree);.    sq
23220 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43  lite3BtreeClearC
23230 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20  ursor(pCur);.   
23240 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43   assert( pBt->pC
23250 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
23260 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
23270 3d 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20  ==pCur ){.      
23280 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
23290 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
232a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43  }else{.      BtC
232b0 75 72 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70  ursor *pPrev = p
232c0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20  Bt->pCursor;.   
232d0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69     do{.        i
232e0 66 28 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  f( pPrev->pNext=
232f0 3d 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =pCur ){.       
23300 20 20 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20     pPrev->pNext 
23310 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
23320 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
23330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23340 20 20 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d    pPrev = pPrev-
23350 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77  >pNext;.      }w
23360 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72  hile( ALWAYS(pPr
23370 65 76 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ev) );.    }.   
23380 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
23390 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
233a0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
233b0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  e(pCur->apPage[i
233c0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e  ]);.    }.    un
233d0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
233e0 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  d(pBt);.    sqli
233f0 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61  te3_free(pCur->a
23400 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f  Overflow);.    /
23410 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  * sqlite3_free(p
23420 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c  Cur); */.    sql
23430 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23440 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65  Btree);.  }.  re
23450 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
23460 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
23470 72 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a  re the BtCursor*
23480 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
23490 67 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c  gument has a val
234a0 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  id.** BtCursor.i
234b0 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20  nfo structure.  
234c0 49 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  If it is not alr
234d0 65 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c  eady valid, call
234e0 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65 43 65  .** btreeParseCe
234f0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
23500 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
23510 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
23520 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
23530 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
23540 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
23550 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
23560 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
23570 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74  r of calls to bt
23580 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a  reeParseCell()..
23590 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
235a0 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
235b0 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42  assertCellInfo(B
235c0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
235d0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
235e0 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65  o;.    int iPage
235f0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a   = pCur->iPage;.
23600 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
23610 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
23620 29 29 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72  ));.    btreePar
23630 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
23640 61 67 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72  age[iPage], pCur
23650 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20  ->aiIdx[iPage], 
23660 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
23670 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c  rt( CORRUPT_DB |
23680 7c 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  | memcmp(&info, 
23690 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
236a0 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
236b0 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
236c0 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
236d0 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74  nfo(x).#endif.st
236e0 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
236f0 4c 49 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c  LINE void getCel
23700 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
23710 70 43 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75  pCur){.  if( pCu
23720 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
23730 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67   ){.    int iPag
23740 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
23750 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  .    pCur->curFl
23760 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
23770 64 4e 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65  dNKey;.    btree
23780 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
23790 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43  apPage[iPage],pC
237a0 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d  ur->aiIdx[iPage]
237b0 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20  ,&pCur->info);. 
237c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
237d0 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
237e0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
237f0 20 4e 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20   NDEBUG  /* The 
23800 6e 65 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65  next routine use
23810 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73  d only within as
23820 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
23830 73 20 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  s */./*.** Retur
23840 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 67 69  n true if the gi
23850 76 65 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20  ven BtCursor is 
23860 76 61 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20  valid.  A valid 
23870 63 75 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a  cursor is one.**
23880 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74   that is current
23890 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  ly pointing to a
238a0 20 72 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65   row in a (non-e
238b0 6d 70 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20  mpty) table..** 
238c0 54 68 69 73 20 69 73 20 61 20 76 65 72 69 66 69  This is a verifi
238d0 63 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69  cation routine i
238e0 73 20 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68  s used only with
238f0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74  in assert() stat
23900 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ements..*/.int s
23910 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23920 72 49 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f  rIsValid(BtCurso
23930 72 20 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75  r *pCur){.  retu
23940 72 6e 20 70 43 75 72 20 26 26 20 70 43 75 72 2d  rn pCur && pCur-
23950 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
23960 56 41 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20  VALID;.}.#endif 
23970 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a  /* NDEBUG */../*
23980 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
23990 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
239a0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
239b0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
239c0 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
239d0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
239e0 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
239f0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
23a00 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
23a10 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
23a20 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
23a30 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
23a40 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
23a50 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
23a60 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
23a70 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
23a80 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
23a90 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
23aa0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  he key..**.** Th
23ab0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 70 6f  e caller must po
23ac0 73 69 74 69 6f 6e 20 74 68 65 20 63 75 72 73 6f  sition the curso
23ad0 72 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  r prior to invok
23ae0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
23af0 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
23b00 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
23b10 6c 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  l.  It always re
23b20 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
23b30 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65    .*/.int sqlite
23b40 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42 74  3BtreeKeySize(Bt
23b50 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36  Cursor *pCur, i6
23b60 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73  4 *pSize){.  ass
23b70 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
23b80 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
23b90 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23ba0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23bb0 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
23bc0 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70  Info(pCur);.  *p
23bd0 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66  Size = pCur->inf
23be0 6f 2e 6e 4b 65 79 3b 0a 20 20 72 65 74 75 72 6e  o.nKey;.  return
23bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23c00 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
23c10 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
23c20 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
23c30 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
23c40 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
23c50 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
23c60 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20  *.** The caller 
23c70 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 20 74  must guarantee t
23c80 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
23c90 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
23ca0 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 76 61 6c 69  non-NULL.** vali
23cb0 64 20 65 6e 74 72 79 2e 20 20 49 6e 20 6f 74 68  d entry.  In oth
23cc0 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20 63 61  er words, the ca
23cd0 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  lling procedure 
23ce0 6d 75 73 74 20 67 75 61 72 61 6e 74 65 65 0a 2a  must guarantee.*
23cf0 2a 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  * that the curso
23d00 72 20 68 61 73 20 43 75 72 73 6f 72 2e 65 53 74  r has Cursor.eSt
23d10 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
23d20 44 2e 0a 2a 2a 0a 2a 2a 20 46 61 69 6c 75 72 65  D..**.** Failure
23d30 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
23d40 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
23d50 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
23d60 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 49 74  SQLITE_OK..** It
23d70 20 6d 69 67 68 74 20 6a 75 73 74 20 61 73 20 77   might just as w
23d80 65 6c 6c 20 62 65 20 61 20 70 72 6f 63 65 64 75  ell be a procedu
23d90 72 65 20 28 72 65 74 75 72 6e 69 6e 67 20 76 6f  re (returning vo
23da0 69 64 29 20 62 75 74 20 77 65 20 63 6f 6e 74 69  id) but we conti
23db0 6e 75 65 0a 2a 2a 20 74 6f 20 72 65 74 75 72 6e  nue.** to return
23dc0 20 61 6e 20 69 6e 74 65 67 65 72 20 72 65 73 75   an integer resu
23dd0 6c 74 20 63 6f 64 65 20 66 6f 72 20 68 69 73 74  lt code for hist
23de0 6f 72 69 63 61 6c 20 72 65 61 73 6f 6e 73 2e 0a  orical reasons..
23df0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
23e00 72 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75  reeDataSize(BtCu
23e10 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
23e20 2a 70 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  *pSize){.  asser
23e30 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
23e40 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
23e50 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
23e60 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23e70 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
23e80 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
23e90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23ea0 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
23eb0 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
23ec0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
23ed0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
23ee0 65 5d 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 3d 3d  e]->intKeyLeaf==
23ef0 31 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e  1 );.  getCellIn
23f00 66 6f 28 70 43 75 72 29 3b 0a 20 20 2a 70 53 69  fo(pCur);.  *pSi
23f10 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
23f20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75  nPayload;.  retu
23f30 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23f40 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
23f50 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
23f60 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
23f70 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
23f80 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
23f90 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
23fa0 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
23fb0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
23fc0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
23fd0 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
23fe0 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
23ff0 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
24000 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
24010 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
24020 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
24030 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
24040 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
24050 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
24060 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
24070 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
24080 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
24090 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
240a0 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
240b0 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
240c0 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65   of the next ove
240d0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68  rflow page in th
240e0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73  e linked list is
240f0 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20   .** written to 
24100 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70  *pPgnoNext. If p
24110 61 67 65 20 6f 76 66 6c 20 69 73 20 74 68 65 20  age ovfl is the 
24120 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74 73  last page in its
24130 20 6c 69 6e 6b 65 64 20 0a 2a 2a 20 6c 69 73 74   linked .** list
24140 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  , *pPgnoNext is 
24150 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a  set to zero. .**
24160 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69 73  .** If ppPage is
24170 20 6e 6f 74 20 4e 55 4c 4c 2c 20 61 6e 64 20 61   not NULL, and a
24180 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
24190 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
241a0 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
241b0 2a 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65 72  * to page number
241c0 20 70 4f 76 66 6c 20 77 61 73 20 6f 62 74 61 69   pOvfl was obtai
241d0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 70 50 61 67  ned, then *ppPag
241e0 65 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e  e is set to poin
241f0 74 20 74 6f 20 74 68 61 74 0a 2a 2a 20 72 65 66  t to that.** ref
24200 65 72 65 6e 63 65 2e 20 49 74 20 69 73 20 74 68  erence. It is th
24210 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
24220 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
24230 6f 20 63 61 6c 6c 20 72 65 6c 65 61 73 65 50 61  o call releasePa
24240 67 65 28 29 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61  ge().** on *ppPa
24250 67 65 20 74 6f 20 66 72 65 65 20 74 68 65 20 72  ge to free the r
24260 65 66 65 72 65 6e 63 65 2e 20 49 6e 20 6e 6f 20  eference. In no 
24270 72 65 66 65 72 65 6e 63 65 20 77 61 73 20 6f 62  reference was ob
24280 74 61 69 6e 65 64 20 28 62 65 63 61 75 73 65 0a  tained (because.
24290 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  ** the pointer-m
242a0 61 70 20 77 61 73 20 75 73 65 64 20 74 6f 20 6f  ap was used to o
242b0 62 74 61 69 6e 20 74 68 65 20 76 61 6c 75 65 20  btain the value 
242c0 66 6f 72 20 2a 70 50 67 6e 6f 4e 65 78 74 29 2c  for *pPgnoNext),
242d0 20 74 68 65 6e 0a 2a 2a 20 2a 70 70 50 61 67 65   then.** *ppPage
242e0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
242f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
24300 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
24310 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
24320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24330 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
24340 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76  ile */.  Pgno ov
24350 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
24360 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
24370 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
24380 75 6d 62 65 72 20 2a 2f 0a 20 20 4d 65 6d 50 61  umber */.  MemPa
24390 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
243a0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
243b0 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 28  MemPage handle (
243c0 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a  may be NULL) */.
243d0 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78    Pgno *pPgnoNex
243e0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t              /
243f0 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72  * OUT: Next over
24400 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72  flow page number
24410 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65   */.){.  Pgno ne
24420 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  xt = 0;.  MemPag
24430 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20  e *pPage = 0;.  
24440 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
24450 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  OK;..  assert( s
24460 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
24470 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
24480 0a 20 20 61 73 73 65 72 74 28 70 50 67 6e 6f 4e  .  assert(pPgnoN
24490 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  ext);..#ifndef S
244a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
244b0 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74  ACUUM.  /* Try t
244c0 6f 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20  o find the next 
244d0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
244e0 66 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20  flow list using 
244f0 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63  the.  ** autovac
24500 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  uum pointer-map 
24510 70 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61  pages. Guess tha
24520 74 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  t the next page 
24530 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65  in .  ** the ove
24540 72 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61  rflow list is pa
24550 67 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b  ge number (ovfl+
24560 31 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73  1). If that gues
24570 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75  s turns .  ** ou
24580 74 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66  t to be wrong, f
24590 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64  all back to load
245a0 69 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20  ing the data of 
245b0 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65  page .  ** numbe
245c0 72 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d  r ovfl to determ
245d0 69 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ine the next pag
245e0 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20  e number..  */. 
245f0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
24600 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f  cuum ){.    Pgno
24610 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20   pgno;.    Pgno 
24620 69 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b  iGuess = ovfl+1;
24630 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a  .    u8 eType;..
24640 20 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41      while( PTRMA
24650 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47  P_ISPAGE(pBt, iG
24660 75 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d  uess) || iGuess=
24670 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
24680 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
24690 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d   iGuess++;.    }
246a0 0a 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73  ..    if( iGuess
246b0 3c 3d 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  <=btreePagecount
246c0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 72  (pBt) ){.      r
246d0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
246e0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
246f0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
24700 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
24710 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d 50 54 52  OK && eType==PTR
24720 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
24730 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
24740 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
24750 75 65 73 73 3b 0a 20 20 20 20 20 20 20 20 72 63  uess;.        rc
24760 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
24770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
24780 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
24790 72 74 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 72  rt( next==0 || r
247a0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
247b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
247c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
247d0 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
247e0 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65  Bt, ovfl, &pPage
247f0 2c 20 28 70 70 50 61 67 65 3d 3d 30 29 20 3f 20  , (ppPage==0) ? 
24800 50 41 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e  PAGER_GET_READON
24810 4c 59 20 3a 20 30 29 3b 0a 20 20 20 20 61 73 73  LY : 0);.    ass
24820 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
24830 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 20 29  OK || pPage==0 )
24840 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
24850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24860 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79 74 65   next = get4byte
24870 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a  (pPage->aData);.
24880 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50      }.  }..  *pP
24890 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a  gnoNext = next;.
248a0 20 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a    if( ppPage ){.
248b0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50      *ppPage = pP
248c0 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
248d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
248e0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
248f0 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 44  rn (rc==SQLITE_D
24900 4f 4e 45 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  ONE ? SQLITE_OK 
24910 3a 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  : rc);.}../*.** 
24920 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61  Copy data from a
24930 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61 67   buffer to a pag
24940 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67  e, or from a pag
24950 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a  e to a buffer..*
24960 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73  *.** pPayload is
24970 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
24980 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74  ta stored on dat
24990 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50 61  abase page pDbPa
249a0 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65  ge..** If argume
249b0 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c  nt eOp is false,
249c0 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65   then nByte byte
249d0 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f  s of data are co
249e0 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61  pied.** from pPa
249f0 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66  yload to the buf
24a00 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62  fer pointed at b
24a10 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69  y pBuf. If eOp i
24a20 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
24a30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
24a40 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
24a50 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79   pDbPage and nBy
24a60 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64  te bytes.** of d
24a70 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20 66  ata are copied f
24a80 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
24a90 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e  Buf to pPayload.
24aa0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
24ab0 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
24ac0 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69  success, otherwi
24ad0 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  se an error code
24ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24af0 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76  copyPayload(.  v
24b00 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20  oid *pPayload,  
24b10 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
24b20 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74 61  ter to page data
24b30 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
24b40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24b50 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
24b60 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  ffer */.  int nB
24b70 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  yte,            
24b80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24b90 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a   bytes to copy *
24ba0 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20  /.  int eOp,    
24bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24bc0 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20   0 -> copy from 
24bd0 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20  page, 1 -> copy 
24be0 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50  to page */.  DbP
24bf0 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20 20  age *pDbPage    
24c00 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
24c10 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f  ontaining pPaylo
24c20 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65  ad */.){.  if( e
24c30 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70  Op ){.    /* Cop
24c40 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66  y data from buff
24c50 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77 72  er to page (a wr
24c60 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ite operation) *
24c70 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  /.    int rc = s
24c80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
24c90 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
24ca0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24cb0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
24cc0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d   rc;.    }.    m
24cd0 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20  emcpy(pPayload, 
24ce0 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20  pBuf, nByte);.  
24cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f  }else{.    /* Co
24d00 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67  py data from pag
24d10 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20 72  e to buffer (a r
24d20 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a  ead operation) *
24d30 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75  /.    memcpy(pBu
24d40 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79  f, pPayload, nBy
24d50 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  te);.  }.  retur
24d60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
24d70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24d80 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72  ion is used to r
24d90 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65  ead or overwrite
24da0 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61   payload informa
24db0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20  tion.** for the 
24dc0 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 70  entry that the p
24dd0 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f  Cur cursor is po
24de0 69 6e 74 69 6e 67 20 74 6f 2e 20 54 68 65 20 65  inting to. The e
24df0 4f 70 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  Op.** argument i
24e00 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
24e10 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
24e20 20 20 30 3a 20 54 68 65 20 6f 70 65 72 61 74 69    0: The operati
24e30 6f 6e 20 69 73 20 61 20 72 65 61 64 2e 20 50 6f  on is a read. Po
24e40 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
24e50 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20  low cache..**   
24e60 31 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e  1: The operation
24e70 20 69 73 20 61 20 77 72 69 74 65 2e 20 50 6f 70   is a write. Pop
24e80 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
24e90 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 20 20 20 32  ow cache..**   2
24ea0 3a 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  : The operation 
24eb0 69 73 20 61 20 72 65 61 64 2e 20 44 6f 20 6e 6f  is a read. Do no
24ec0 74 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  t populate the o
24ed0 76 65 72 66 6c 6f 77 20 63 61 63 68 65 2e 0a 2a  verflow cache..*
24ee0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
24ef0 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65 20  "amt" bytes are 
24f00 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20  read or written 
24f10 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66  beginning at "of
24f20 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69  fset"..** Data i
24f30 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f  s read to or fro
24f40 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
24f50 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e  f..**.** The con
24f60 74 65 6e 74 20 62 65 69 6e 67 20 72 65 61 64 20  tent being read 
24f70 6f 72 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  or written might
24f80 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
24f90 61 69 6e 20 70 61 67 65 0a 2a 2a 20 6f 72 20 62  ain page.** or b
24fa0 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74 20  e scattered out 
24fb0 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  on multiple over
24fc0 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a  flow pages..**.*
24fd0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
24fe0 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
24ff0 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
25000 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 6e  verflow pages an
25010 64 20 74 68 65 0a 2a 2a 20 65 4f 70 20 61 72 67  d the.** eOp arg
25020 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 32 2c 20  ument is not 2, 
25030 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
25040 79 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  y allocate space
25050 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20   for and lazily 
25060 0a 2a 2a 20 70 6f 70 75 6c 61 74 65 73 20 74 68  .** populates th
25070 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
25080 6c 69 73 74 20 63 61 63 68 65 20 61 72 72 61 79  list cache array
25090 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72   (BtCursor.aOver
250a0 66 6c 6f 77 29 2e 20 0a 2a 2a 20 53 75 62 73 65  flow). .** Subse
250b0 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20  quent calls use 
250c0 74 68 69 73 20 63 61 63 68 65 20 74 6f 20 6d 61  this cache to ma
250d0 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68  ke seeking to th
250e0 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65  e supplied offse
250f0 74 20 0a 2a 2a 20 6d 6f 72 65 20 65 66 66 69 63  t .** more effic
25100 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  ient..**.** Once
25110 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
25120 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
25130 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
25140 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e   it may be.** in
25150 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d  validated if som
25160 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77  e other cursor w
25170 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d  rites to the sam
25180 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a  e table, or if.*
25190 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  * the cursor is 
251a0 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66 65  moved to a diffe
251b0 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69  rent row. Additi
251c0 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d  onally, in auto-
251d0 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20  vacuum.** mode, 
251e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76  the following ev
251f0 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64  ents may invalid
25200 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ate an overflow 
25210 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e  page-list cache.
25220 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e  .**.**   * An in
25230 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
25240 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69  ,.**   * A commi
25250 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d  t in auto_vacuum
25260 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a  ="full" mode,.**
25270 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20     * Creating a 
25280 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69  table (may requi
25290 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65  re moving an ove
252a0 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a  rflow page)..*/.
252b0 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65 73  static int acces
252c0 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75  sPayload(.  BtCu
252d0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
252e0 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74   /* Cursor point
252f0 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20  ing to entry to 
25300 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
25310 33 32 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20  32 offset,      
25320 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61      /* Begin rea
25330 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e  ding this far in
25340 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20  to payload */.  
25350 75 33 32 20 61 6d 74 2c 20 20 20 20 20 20 20 20  u32 amt,        
25360 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69       /* Read thi
25370 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a  s many bytes */.
25380 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25390 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20  *pBuf, /* Write 
253a0 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74  the bytes into t
253b0 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20  his buffer */ . 
253c0 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
253d0 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
253e0 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
253f0 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
25400 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
25410 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
25420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
25430 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
25440 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25450 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
25460 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f  [pCur->iPage]; /
25470 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f 66 20  * Btree page of 
25480 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f  current entry */
25490 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
254a0 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 20 20 20   = pCur->pBt;   
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
254c0 2a 20 42 74 72 65 65 20 74 68 69 73 20 63 75 72  * Btree this cur
254d0 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a  sor belongs to *
254e0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
254f0 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f  DIRECT_OVERFLOW_
25500 52 45 41 44 0a 20 20 75 6e 73 69 67 6e 65 64 20  READ.  unsigned 
25510 63 68 61 72 20 2a 20 63 6f 6e 73 74 20 70 42 75  char * const pBu
25520 66 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  fStart = pBuf;. 
25530 20 69 6e 74 20 62 45 6e 64 3b 20 20 20 20 20 20   int bEnd;      
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25560 75 65 20 69 66 20 72 65 61 64 69 6e 67 20 74 6f  ue if reading to
25570 20 65 6e 64 20 6f 66 20 64 61 74 61 20 2a 2f 0a   end of data */.
25580 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
25590 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73  ( pPage );.  ass
255a0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
255b0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
255c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
255d0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
255e0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
255f0 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
25600 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
25610 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
25620 72 74 28 20 65 4f 70 21 3d 32 20 7c 7c 20 6f 66  rt( eOp!=2 || of
25630 66 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a  fset==0 );    /*
25640 20 41 6c 77 61 79 73 20 73 74 61 72 74 20 66 72   Always start fr
25650 6f 6d 20 62 65 67 69 6e 6e 69 6e 67 20 66 6f 72  om beginning for
25660 20 65 4f 70 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65   eOp==2 */..  ge
25670 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
25680 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
25690 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
256a0 64 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  d;.#ifdef SQLITE
256b0 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
256c0 5f 52 45 41 44 0a 20 20 62 45 6e 64 20 3d 20 6f  _READ.  bEnd = o
256d0 66 66 73 65 74 2b 61 6d 74 3d 3d 70 43 75 72 2d  ffset+amt==pCur-
256e0 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a  >info.nPayload;.
256f0 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
25700 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
25710 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25720 61 64 20 29 3b 0a 0a 20 20 69 66 28 20 26 61 50  ad );..  if( &aP
25730 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66  ayload[pCur->inf
25740 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20 26 70 50 61  o.nLocal] > &pPa
25750 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e 75  ge->aData[pBt->u
25760 73 61 62 6c 65 53 69 7a 65 5d 20 29 7b 0a 20 20  sableSize] ){.  
25770 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20 72    /* Trying to r
25780 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61 73  ead or write pas
25790 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
257a0 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72 6f   data is an erro
257b0 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  r */.    return 
257c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
257d0 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
257e0 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73  heck if data mus
257f0 74 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65  t be read/writte
25800 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74  n to/from the bt
25810 72 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e  ree page itself.
25820 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
25830 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  <pCur->info.nLoc
25840 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  al ){.    int a 
25850 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61  = amt;.    if( a
25860 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e  +offset>pCur->in
25870 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
25880 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66     a = pCur->inf
25890 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65  o.nLocal - offse
258a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
258b0 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61  = copyPayload(&a
258c0 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c  Payload[offset],
258d0 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26   pBuf, a, (eOp &
258e0 20 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70   0x01), pPage->p
258f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66  DbPage);.    off
25900 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75  set = 0;.    pBu
25910 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20  f += a;.    amt 
25920 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  -= a;.  }else{. 
25930 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75     offset -= pCu
25940 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a  r->info.nLocal;.
25950 20 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d    }...  if( rc==
25960 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
25970 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
25980 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
25990 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
259a0 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
259b0 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
259c0 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
259d0 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
259e0 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
259f0 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
25a00 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
25a10 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
25a20 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
25a30 6c 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65  low[] has not be
25a40 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
25a50 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20  locate it now.. 
25a60 20 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f     ** Except, do
25a70 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f   not allocate aO
25a80 76 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f  verflow[] for eO
25a90 70 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  p==2..    **.   
25aa0 20 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f   ** The aOverflo
25ab0 77 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a  w[] array is siz
25ac0 65 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20  ed at one entry 
25ad0 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f  for each overflo
25ae0 77 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e  w page.    ** in
25af0 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
25b00 61 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75  ain. The page nu
25b10 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73  mber of the firs
25b20 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
25b30 69 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64  is.    ** stored
25b40 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d   in aOverflow[0]
25b50 2c 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f  , etc. A value o
25b60 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72  f 0 in the aOver
25b70 66 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20  flow[] array.   
25b80 20 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79   ** means "not y
25b90 65 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63  et known" (the c
25ba0 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70  ache is lazily p
25bb0 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a  opulated)..    *
25bc0 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32  /.    if( eOp!=2
25bd0 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c   && (pCur->curFl
25be0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
25bf0 4f 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Ovfl)==0 ){.    
25c00 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70    int nOvfl = (p
25c10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f  Cur->info.nPaylo
25c20 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  ad-pCur->info.nL
25c30 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29  ocal+ovflSize-1)
25c40 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20  /ovflSize;.     
25c50 20 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d   if( nOvfl>pCur-
25c60 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20  >nOvflAlloc ){. 
25c70 20 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65         Pgno *aNe
25c80 77 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74  w = (Pgno*)sqlit
25c90 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
25ca0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
25cb0 65 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a  erflow, nOvfl*2*
25cc0 73 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20  sizeof(Pgno).   
25cd0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
25ce0 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
25cf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25d00 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
25d10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
25d20 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
25d30 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76  nOvflAlloc = nOv
25d40 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20  fl*2;.          
25d50 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
25d60 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  = aNew;.        
25d70 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
25d80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25d90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  K ){.        mem
25da0 73 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66  set(pCur->aOverf
25db0 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69  low, 0, nOvfl*si
25dc0 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20  zeof(Pgno));.   
25dd0 20 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c       pCur->curFl
25de0 61 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69  ags |= BTCF_Vali
25df0 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  dOvfl;.      }. 
25e00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
25e10 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
25e20 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73  e-list cache has
25e30 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
25e40 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65  and the.    ** e
25e50 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72  ntry for the fir
25e60 73 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72  st required over
25e70 66 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c  flow page is val
25e80 69 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20  id, skip.    ** 
25e90 64 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a  directly to it..
25ea0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
25eb0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
25ec0 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29   BTCF_ValidOvfl)
25ed0 21 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72  !=0.     && pCur
25ee0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
25ef0 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20  et/ovflSize].   
25f00 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d   ){.      iIdx =
25f10 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a   (offset/ovflSiz
25f20 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61  e);.      nextPa
25f30 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72  ge = pCur->aOver
25f40 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20  flow[iIdx];.    
25f50 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73    offset = (offs
25f60 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et%ovflSize);.  
25f70 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20    }..    for( ; 
25f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
25f90 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
25fa0 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20  ge; iIdx++){..  
25fb0 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
25fc0 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
25fd0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
25fe0 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
25ff0 20 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63      if( (pCur->c
26000 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56  urFlags & BTCF_V
26010 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a  alidOvfl)!=0 ){.
26020 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26030 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
26040 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20  iIdx]==0.       
26050 20 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72           || pCur
26060 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
26070 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20  ]==nextPage.    
26080 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43              || C
26090 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
260a0 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72       pCur->aOver
260b0 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78  flow[iIdx] = nex
260c0 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tPage;.      }..
260d0 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
260e0 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
260f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
26100 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
26110 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
26120 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
26130 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
26140 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
26150 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
26160 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
26170 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
26180 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
26190 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
261a0 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
261b0 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
261c0 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
261d0 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
261e0 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
261f0 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
26200 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
26210 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
26220 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
26230 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61   Note that the a
26240 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79  Overflow[] array
26250 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74   must be allocat
26260 65 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d  ed because eOp!=
26270 32 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72  2.        ** her
26280 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74  e.  If eOp==2, t
26290 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e  hen offset==0 an
262a0 64 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73  d this branch is
262b0 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20   never taken..  
262c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
262d0 20 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20   assert( eOp!=2 
262e0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
262f0 74 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  t( pCur->curFlag
26300 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
26310 66 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  fl );.        as
26320 73 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72  sert( pCur->pBtr
26330 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20  ee->db==pBt->db 
26340 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
26350 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26360 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
26370 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
26380 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26390 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
263a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
263b0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
263c0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
263d0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
263e0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
263f0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20        offset -= 
26400 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
26410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
26420 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74  * Need to read t
26430 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c  his page properl
26440 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73  y. It contains s
26450 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ome of the.     
26460 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64     ** range of d
26470 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e  ata that is bein
26480 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20  g read (eOp==0) 
26490 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21  or written (eOp!
264a0 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  =0)..        */.
264b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
264c0 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45  RECT_OVERFLOW_RE
264d0 41 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  AD.        sqlit
264e0 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e  e3_file *fd;.#en
264f0 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20  dif.        int 
26500 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20  a = amt;.       
26510 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
26520 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
26530 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
26540 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
26550 20 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66         }..#ifdef
26560 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
26570 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20  VERFLOW_READ.   
26580 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74       /* If all t
26590 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
265a0 20 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a   true:.        *
265b0 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31  *.        **   1
265c0 29 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  ) this is a read
265d0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20   operation, and 
265e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29  .        **   2)
265f0 20 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65   data is require
26600 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74  d from the start
26610 20 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f   of this overflo
26620 77 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20  w page, and.    
26630 20 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20      **   3) the 
26640 64 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65  database is file
26650 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20  -backed, and.   
26660 20 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65       **   4) the
26670 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72  re is no open wr
26680 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite-transaction,
26690 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
266a0 20 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73    5) the databas
266b0 65 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64  e is not a WAL d
266c0 61 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20  atabase,.       
266d0 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74   **   6) all dat
266e0 61 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  a from the page 
266f0 69 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20  is being read.. 
26700 20 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61         **   7) a
26710 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20  t least 4 bytes 
26720 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
26730 6e 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20  n read into the 
26740 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20  output buffer . 
26750 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
26760 20 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63    ** then data c
26770 61 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63  an be read direc
26780 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74  tly from the dat
26790 61 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20  abase file into 
267a0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  the.        ** o
267b0 75 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79  utput buffer, by
267c0 70 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65  passing the page
267d0 2d 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65  -cache altogethe
267e0 72 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20  r. This speeds. 
267f0 20 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61         ** up loa
26800 64 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72  ding large recor
26810 64 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e  ds that span man
26820 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  y overflow pages
26830 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
26840 20 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78       if( (eOp&0x
26850 30 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  01)==0          
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26880 31 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  1) */.         &
26890 26 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20  & offset==0     
268a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
268c0 20 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20       /* (2) */. 
268d0 20 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64          && (bEnd
268e0 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29   || a==ovflSize)
268f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26910 20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20   (6) */.        
26920 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73   && pBt->inTrans
26930 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45  action==TRANS_RE
26940 41 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  AD              
26950 20 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f         /* (4) */
26960 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64  .         && (fd
26970 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
26980 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
26990 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20  )->pMethods     
269a0 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20  /* (3) */.      
269b0 20 20 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65     && pBt->pPage
269c0 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d 3d 30 78  1->aData[19]==0x
269d0 30 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  01              
269e0 20 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20           /* (5) 
269f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26  */.         && &
26a00 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74  pBuf[-4]>=pBufSt
26a10 61 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20  art             
26a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a30 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20    /* (7) */.    
26a40 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
26a50 20 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20   u8 aSave[4];.  
26a60 20 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69          u8 *aWri
26a70 74 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a  te = &pBuf[-4];.
26a80 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26a90 28 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74  ( aWrite>=pBufSt
26aa0 61 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20  art );          
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ac0 2a 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20  * hence (7) */. 
26ad0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
26ae0 61 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34  aSave, aWrite, 4
26af0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
26b00 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
26b10 66 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c  fd, aWrite, a+4,
26b20 20 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53   (i64)pBt->pageS
26b30 69 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29  ize*(nextPage-1)
26b40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
26b50 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
26b60 28 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20  (aWrite);.      
26b70 20 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74      memcpy(aWrit
26b80 65 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20  e, aSave, 4);.  
26b90 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64        }else.#end
26ba0 69 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  if..        {.  
26bb0 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a          DbPage *
26bc0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20  pDbPage;.       
26bd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26be0 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61  agerGet(pBt->pPa
26bf0 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26  ger, nextPage, &
26c00 70 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20  pDbPage,.       
26c10 20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30         ((eOp&0x0
26c20 31 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45  1)==0 ? PAGER_GE
26c30 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a  T_READONLY : 0).
26c40 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
26c50 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
26c60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26c70 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64          aPayload
26c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
26c90 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
26ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78  .            nex
26cb0 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
26cc0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
26cd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
26ce0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
26cf0 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
26d00 75 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31  uf, a, (eOp&0x01
26d10 29 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ), pDbPage);.   
26d20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
26d30 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
26d40 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
26d50 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20   offset = 0;.   
26d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26d70 20 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d   }.        amt -
26d80 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75  = a;.        pBu
26d90 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a  f += a;.      }.
26da0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
26db0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26dc0 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72  & amt>0 ){.    r
26dd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
26de0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
26df0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26e00 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f  *.** Read part o
26e10 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69  f the key associ
26e20 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72  ated with cursor
26e30 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a   pCur.  Exactly.
26e40 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20 77  ** "amt" bytes w
26e50 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72 72  ill be transferr
26e60 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
26e70 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
26e80 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
26e90 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  et"..**.** The c
26ea0 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72  aller must ensur
26eb0 65 20 74 68 61 74 20 70 43 75 72 20 69 73 20 70  e that pCur is p
26ec0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 76 61 6c  ointing to a val
26ed0 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20 74 68 65  id row.** in the
26ee0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   table..**.** Re
26ef0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
26f00 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
26f10 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
26f20 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
26f30 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
26f40 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
26f50 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
26f60 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
26f70 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
26f80 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
26f90 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43 75  te3BtreeKey(BtCu
26fa0 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
26fb0 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
26fc0 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
26fd0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
26fe0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
26ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
27000 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
27010 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
27020 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
27030 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
27040 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
27050 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27060 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27070 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
27080 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27090 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72 65 74 75  >nCell );.  retu
270a0 72 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  rn accessPayload
270b0 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61  (pCur, offset, a
270c0 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  mt, (unsigned ch
270d0 61 72 2a 29 70 42 75 66 2c 20 30 29 3b 0a 7d 0a  ar*)pBuf, 0);.}.
270e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74  ./*.** Read part
270f0 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73 73   of the data ass
27100 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
27110 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
27120 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
27130 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
27140 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d  ered into pBuf[]
27150 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a  .  The transfer.
27160 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66  ** begins at "of
27170 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  fset"..**.** Ret
27180 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
27190 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
271a0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79  rror code if any
271b0 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
271c0 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69  ong.  An error i
271d0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f  s returned if "o
271e0 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61  ffset+amt" is la
271f0 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65  rger than.** the
27200 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f   available paylo
27210 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ad..*/.int sqlit
27220 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43 75  e3BtreeData(BtCu
27230 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
27240 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c  offset, u32 amt,
27250 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20 20   void *pBuf){.  
27260 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65 66  int rc;..#ifndef
27270 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
27280 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43 75  RBLOB.  if ( pCu
27290 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
272a0 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
272b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
272c0 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  BORT;.  }.#endif
272d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
272e0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
272f0 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
27300 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
27310 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
27320 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27330 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
27340 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27350 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
27360 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
27370 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
27380 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
27390 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65  age] );.    asse
273a0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
273b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
273c0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
273d0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
273e0 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
273f0 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
27400 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c  fset, amt, pBuf,
27410 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
27420 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
27430 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
27440 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72  to payload infor
27450 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
27460 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a  entry that the .
27470 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69  ** pCur cursor i
27480 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
27490 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74  The pointer is t
274a0 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
274b0 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66  of.** the key if
274c0 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28 70   index btrees (p
274d0 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 29  Page->intKey==0)
274e0 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74 61   and is the data
274f0 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62 74   for.** table bt
27500 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74  rees (pPage->int
27510 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75 6d  Key==1). The num
27520 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
27530 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65 79  available.** key
27540 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
27550 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66   into *pAmt.  If
27560 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20   *pAmt==0, then 
27570 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65 74  the value.** ret
27580 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
27590 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65  e a valid pointe
275a0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  r..**.** This ro
275b0 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69  utine is an opti
275c0 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73  mization.  It is
275d0 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20   common for the 
275e0 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e  entire key.** an
275f0 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e  d data to fit on
27600 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20   the local page 
27610 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f  and for there to
27620 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a   be no overflow.
27630 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20  ** pages.  When 
27640 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73  that is so, this
27650 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20   routine can be 
27660 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74  used to access t
27670 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61  he.** key and da
27680 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e  ta without makin
27690 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68  g a copy.  If th
276a0 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74  e key and/or dat
276b0 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f  a spills.** onto
276c0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c   overflow pages,
276d0 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c   then accessPayl
276e0 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73  oad() must be us
276f0 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65  ed to reassemble
27700 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61  .** the key/data
27710 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74   and copy it int
27720 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  o a preallocated
27730 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   buffer..**.** T
27740 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72  he pointer retur
27750 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74  ned by this rout
27760 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74  ine looks direct
27770 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68  ly into the cach
27780 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68  ed.** page of th
27790 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
277a0 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e   data might chan
277b0 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e  ge or move the n
277c0 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20  ext time.** any 
277d0 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73  btree routine is
277e0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
277f0 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 66  ic const void *f
27800 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42  etchPayload(.  B
27810 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20  tCursor *pCur,  
27820 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f      /* Cursor po
27830 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20  inting to entry 
27840 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
27850 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20 20    u32 *pAmt     
27860 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
27870 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
27880 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65  ailable bytes he
27890 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 61  re */.){.  u32 a
278a0 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  mt;.  assert( pC
278b0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  ur!=0 && pCur->i
278c0 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d  Page>=0 && pCur-
278d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
278e0 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  age]);.  assert(
278f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
27900 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
27910 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
27920 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
27930 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
27940 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
27950 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
27960 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
27970 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69  assert( pCur->ai
27980 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
27990 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43  <pCur->apPage[pC
279a0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
279b0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
279c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e  Cur->info.nSize>
279d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
279e0 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
279f0 61 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad>pCur->apPage[
27a00 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27a10 61 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  ata || CORRUPT_D
27a20 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
27a30 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27a40 61 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ad<pCur->apPage[
27a50 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27a60 61 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54  ataEnd ||CORRUPT
27a70 5f 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69  _DB);.  amt = (i
27a80 6e 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65  nt)(pCur->apPage
27a90 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61  [pCur->iPage]->a
27aa0 44 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e  DataEnd - pCur->
27ab0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a  info.pPayload);.
27ac0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
27ad0 2e 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d  .nLocal<amt ) am
27ae0 74 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  t = pCur->info.n
27af0 4c 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d  Local;.  *pAmt =
27b00 20 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28   amt;.  return (
27b10 76 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f  void*)pCur->info
27b20 2e 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f  .pPayload;.}.../
27b30 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74  *.** For the ent
27b40 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70  ry that cursor p
27b50 43 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c  Cur is point to,
27b60 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61   return as.** ma
27b70 6e 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  ny bytes of the 
27b80 6b 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61  key or data as a
27b90 72 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  re available on 
27ba0 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74  the local.** b-t
27bb0 72 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65  ree page.  Write
27bc0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27bd0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69  vailable bytes i
27be0 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a  nto *pAmt..**.**
27bf0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
27c00 75 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72  urned is ephemer
27c10 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74  al.  The key/dat
27c20 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72  a may move.** or
27c30 20 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e   be destroyed on
27c40 20 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74   the next call t
27c50 6f 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74  o any Btree rout
27c60 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  ine,.** includin
27c70 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68  g calls from oth
27c80 65 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e  er threads again
27c90 73 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68  st the same cach
27ca0 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d  e..** Hence, a m
27cb0 75 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68  utex on the BtSh
27cc0 61 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68  ared should be h
27cd0 65 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c  eld prior to cal
27ce0 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ling.** this rou
27cf0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73  tine..**.** Thes
27d00 65 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73  e routines is us
27d10 65 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20  ed to get quick 
27d20 61 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e  access to key an
27d30 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65  d data.** in the
27d40 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
27d50 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70  re no overflow p
27d60 61 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a  ages are used..*
27d70 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  /.const void *sq
27d80 6c 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74  lite3BtreeKeyFet
27d90 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
27da0 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20  r, u32 *pAmt){. 
27db0 20 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79   return fetchPay
27dc0 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29  load(pCur, pAmt)
27dd0 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
27de0 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
27df0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
27e00 70 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29  pCur, u32 *pAmt)
27e10 7b 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68  {.  return fetch
27e20 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41  Payload(pCur, pA
27e30 6d 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d  mt);.}.../*.** M
27e40 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64  ove the cursor d
27e50 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69  own to a new chi
27e60 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65  ld page.  The ne
27e70 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69  wPgno argument i
27e80 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75  s the.** page nu
27e90 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  mber of the chil
27ea0 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74  d page to move t
27eb0 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  o..**.** This fu
27ec0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
27ed0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
27ee0 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72   the page-header
27ef0 20 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a   flags field of.
27f00 2a 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64  ** the new child
27f10 20 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d   page does not m
27f20 61 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66  atch the flags f
27f30 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65  ield of the pare
27f40 6e 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61  nt (i.e..** if a
27f50 6e 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70  n intkey page ap
27f60 70 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20  pears to be the 
27f70 70 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d  parent of a non-
27f80 69 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a  intkey page, or.
27f90 2a 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a  ** vice-versa)..
27fa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
27fb0 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
27fc0 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
27fd0 77 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72  wPgno){.  BtShar
27fe0 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
27ff0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
28000 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28010 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28020 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
28030 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
28040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
28050 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53  ur->iPage<BTCURS
28060 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a  OR_MAX_DEPTH );.
28070 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
28080 69 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66  iPage>=0 );.  if
28090 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28  ( pCur->iPage>=(
280a0 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
280b0 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72 65 74  TH-1) ){.    ret
280c0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
280d0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70  PT_BKPT;.  }.  p
280e0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
280f0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
28100 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
28110 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
28120 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75  alidOvfl);.  pCu
28130 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43  r->iPage++;.  pC
28140 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28150 69 50 61 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65  iPage] = 0;.  re
28160 74 75 72 6e 20 67 65 74 41 6e 64 49 6e 69 74 50  turn getAndInitP
28170 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f  age(pBt, newPgno
28180 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  , &pCur->apPage[
28190 70 43 75 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20  pCur->iPage],.  
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281b0 20 20 20 20 20 20 70 43 75 72 2c 20 70 43 75 72        pCur, pCur
281c0 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67 73 29  ->curPagerFlags)
281d0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
281e0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
281f0 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
28200 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
28210 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
28220 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
28230 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
28240 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
28250 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
28260 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
28270 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
28280 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
28290 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
282a0 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
282b0 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
282c0 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
282d0 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
282e0 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
282f0 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
28300 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
28310 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
28320 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
28330 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
28340 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
28350 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
28360 42 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  B ) return;  /* 
28370 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  The conditions t
28380 65 73 74 65 64 20 62 65 6c 6f 77 20 6d 69 67 68  ested below migh
28390 74 20 6e 6f 74 20 62 65 20 74 72 75 65 0a 20 20  t not be true.  
283a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20            ** in 
283c0 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
283d0 73 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  se */.  assert( 
283e0 69 49 64 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e  iIdx<=pParent->n
283f0 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 69 49  Cell );.  if( iI
28400 64 78 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65  dx==pParent->nCe
28410 6c 6c 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ll ){.    assert
28420 28 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  ( get4byte(&pPar
28430 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
28440 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
28450 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d  )==iChild );.  }
28460 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
28470 28 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  ( get4byte(findC
28480 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 69 49 64  ell(pParent, iId
28490 78 29 29 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20  x))==iChild );. 
284a0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65   }.}.#else.#  de
284b0 66 69 6e 65 20 61 73 73 65 72 74 50 61 72 65 6e  fine assertParen
284c0 74 49 6e 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23  tIndex(x,y,z) .#
284d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  endif../*.** Mov
284e0 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
284f0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
28500 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
28510 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
28520 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
28530 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
28540 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
28550 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
28560 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
28570 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
28580 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
28590 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
285a0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
285b0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
285c0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
285d0 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
285e0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
285f0 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
28600 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
28610 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
28620 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
28630 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
28640 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
28650 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
28660 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
28670 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
28680 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
28690 72 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61  r->iPage] );.  a
286a0 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78  ssertParentIndex
286b0 28 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  (.    pCur->apPa
286c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31  ge[pCur->iPage-1
286d0 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ], .    pCur->ai
286e0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  Idx[pCur->iPage-
286f0 31 5d 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61  1], .    pCur->a
28700 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28710 65 5d 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20  e]->pgno.  );.  
28720 74 65 73 74 63 61 73 65 28 20 70 43 75 72 2d 3e  testcase( pCur->
28730 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
28740 65 2d 31 5d 20 3e 20 70 43 75 72 2d 3e 61 70 50  e-1] > pCur->apP
28750 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28760 31 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  1]->nCell );.  p
28770 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
28780 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
28790 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
287a0 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56  ValidNKey|BTCF_V
287b0 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 72 65 6c  alidOvfl);.  rel
287c0 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
287d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
287e0 72 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 7d 0a  r->iPage--]);.}.
287f0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
28800 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
28810 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
28820 20 6f 66 20 69 74 73 20 62 2d 74 72 65 65 20 73   of its b-tree s
28830 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
28840 49 66 20 74 68 65 20 74 61 62 6c 65 20 68 61 73  If the table has
28850 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20   a virtual root 
28860 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 63  page, then the c
28870 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
28880 6f 20 70 6f 69 6e 74 0a 2a 2a 20 74 6f 20 74 68  o point.** to th
28890 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  e virtual root p
288a0 61 67 65 20 69 6e 73 74 65 61 64 20 6f 66 20 74  age instead of t
288b0 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70  he actual root p
288c0 61 67 65 2e 20 41 20 74 61 62 6c 65 20 68 61 73  age. A table has
288d0 20 61 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f   a.** virtual ro
288e0 6f 74 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  ot page when the
288f0 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 70 61 67   actual root pag
28900 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65  e contains no ce
28910 6c 6c 73 20 61 6e 64 20 61 20 0a 2a 2a 20 73 69  lls and a .** si
28920 6e 67 6c 65 20 63 68 69 6c 64 20 70 61 67 65 2e  ngle child page.
28930 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68   This can only h
28940 61 70 70 65 6e 20 77 69 74 68 20 74 68 65 20 74  appen with the t
28950 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70  able rooted at p
28960 61 67 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  age 1..**.** If 
28970 74 68 65 20 62 2d 74 72 65 65 20 73 74 72 75 63  the b-tree struc
28980 74 75 72 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ture is empty, t
28990 68 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 20  he cursor state 
289a0 69 73 20 73 65 74 20 74 6f 20 0a 2a 2a 20 43 55  is set to .** CU
289b0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 2e 20 4f 74  RSOR_INVALID. Ot
289c0 68 65 72 77 69 73 65 2c 20 74 68 65 20 63 75 72  herwise, the cur
289d0 73 6f 72 20 69 73 20 73 65 74 20 74 6f 20 70 6f  sor is set to po
289e0 69 6e 74 20 74 6f 20 74 68 65 20 66 69 72 73 74  int to the first
289f0 0a 2a 2a 20 63 65 6c 6c 20 6c 6f 63 61 74 65 64  .** cell located
28a00 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 28 6f 72   on the root (or
28a10 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 29 20 70   virtual root) p
28a20 61 67 65 20 61 6e 64 20 74 68 65 20 63 75 72 73  age and the curs
28a30 6f 72 20 73 74 61 74 65 0a 2a 2a 20 69 73 20 73  or state.** is s
28a40 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 56 41 4c  et to CURSOR_VAL
28a50 49 44 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ID..**.** If thi
28a60 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
28a70 6e 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ns successfully,
28a80 20 69 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d   it may be assum
28a90 65 64 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 70  ed that the.** p
28aa0 61 67 65 2d 68 65 61 64 65 72 20 66 6c 61 67 73  age-header flags
28ab0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
28ac0 68 65 20 5b 76 69 72 74 75 61 6c 5d 20 72 6f 6f  he [virtual] roo
28ad0 74 2d 70 61 67 65 20 69 73 20 74 68 65 20 65 78  t-page is the ex
28ae0 70 65 63 74 65 64 20 0a 2a 2a 20 6b 69 6e 64 20  pected .** kind 
28af0 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 20 28  of b-tree page (
28b00 69 2e 65 2e 20 69 66 20 77 68 65 6e 20 6f 70 65  i.e. if when ope
28b10 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
28b20 74 68 65 20 63 61 6c 6c 65 72 20 64 69 64 20 6e  the caller did n
28b30 6f 74 0a 2a 2a 20 73 70 65 63 69 66 79 20 61 20  ot.** specify a 
28b40 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
28b50 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
28b60 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 35 20   is set to 0x05 
28b70 6f 72 20 30 78 30 44 2c 0a 2a 2a 20 69 6e 64 69  or 0x0D,.** indi
28b80 63 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 62  cating a table b
28b90 2d 74 72 65 65 2c 20 6f 72 20 69 66 20 74 68 65  -tree, or if the
28ba0 20 63 61 6c 6c 65 72 20 64 69 64 20 73 70 65 63   caller did spec
28bb0 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 0a 2a  ify a KeyInfo .*
28bc0 2a 20 73 74 72 75 63 74 75 72 65 20 74 68 65 20  * structure the 
28bd0 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73 65  flags byte is se
28be0 74 20 74 6f 20 30 78 30 32 20 6f 72 20 30 78 30  t to 0x02 or 0x0
28bf0 41 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 61 6e  A, indicating an
28c00 20 69 6e 64 65 78 0a 2a 2a 20 62 2d 74 72 65 65   index.** b-tree
28c10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
28c20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
28c30 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
28c40 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
28c50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28c60 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
28c70 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
28c80 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
28c90 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
28ca0 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
28cb0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
28cc0 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
28cd0 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
28ce0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
28cf0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
28d00 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
28d10 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
28d20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
28d30 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
28d40 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
28d50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
28d60 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
28d70 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
28d80 72 2d 3e 73 6b 69 70 4e 65 78 74 21 3d 53 51 4c  r->skipNext!=SQL
28d90 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
28da0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
28db0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
28dc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
28dd0 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
28de0 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d    }..  if( pCur-
28df0 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  >iPage>=0 ){.   
28e00 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 50   while( pCur->iP
28e10 61 67 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  age ){.      ass
28e20 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
28e30 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d  e[pCur->iPage]!=
28e40 30 20 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61  0 );.      relea
28e50 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43  sePageNotNull(pC
28e60 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
28e70 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20 20  >iPage--]);.    
28e80 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43  }.  }else if( pC
28e90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
28ea0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  ){.    pCur->eSt
28eb0 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
28ec0 41 4c 49 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ALID;.    return
28ed0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
28ee0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
28ef0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 28 2d   pCur->iPage==(-
28f00 31 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 67  1) );.    rc = g
28f10 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 43  etAndInitPage(pC
28f20 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70 42 74 2c  ur->pBtree->pBt,
28f30 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
28f40 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
28f50 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
28f60 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 70 43             0, pC
28f70 75 72 2d 3e 63 75 72 50 61 67 65 72 46 6c 61 67  ur->curPagerFlag
28f80 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  s);.    if( rc!=
28f90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28fa0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
28fb0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
28fc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
28fd0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  c;.    }.    pCu
28fe0 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
28ff0 20 20 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65    pCur->curIntKe
29000 79 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  y = pCur->apPage
29010 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b 0a 20 20 7d  [0]->intKey;.  }
29020 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d  .  pRoot = pCur-
29030 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73  >apPage[0];.  as
29040 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
29050 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  o==pCur->pgnoRoo
29060 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43  t );..  /* If pC
29070 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 69 73 20  ur->pKeyInfo is 
29080 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74  not NULL, then t
29090 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 6f  he caller that o
290a0 70 65 6e 65 64 20 74 68 69 73 20 63 75 72 73 6f  pened this curso
290b0 72 0a 20 20 2a 2a 20 65 78 70 65 63 74 65 64 20  r.  ** expected 
290c0 74 6f 20 6f 70 65 6e 20 69 74 20 6f 6e 20 61 6e  to open it on an
290d0 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e 20 4f   index b-tree. O
290e0 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 4b 65  therwise, if pKe
290f0 79 49 6e 66 6f 20 69 73 0a 20 20 2a 2a 20 4e 55  yInfo is.  ** NU
29100 4c 4c 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 65  LL, the caller e
29110 78 70 65 63 74 73 20 61 20 74 61 62 6c 65 20 62  xpects a table b
29120 2d 74 72 65 65 2e 20 49 66 20 74 68 69 73 20 69  -tree. If this i
29130 73 20 6e 6f 74 20 74 68 65 20 63 61 73 65 2c 0a  s not the case,.
29140 20 20 2a 2a 20 72 65 74 75 72 6e 20 61 6e 20 53    ** return an S
29150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
29160 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ror. .  **.  ** 
29170 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
29180 20 6f 66 20 53 51 4c 69 74 65 20 61 73 73 75 6d   of SQLite assum
29190 65 64 20 74 68 61 74 20 74 68 69 73 20 74 65 73  ed that this tes
291a0 74 20 63 6f 75 6c 64 20 6e 6f 74 20 66 61 69 6c  t could not fail
291b0 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 72 6f 6f  .  ** if the roo
291c0 74 20 70 61 67 65 20 77 61 73 20 61 6c 72 65 61  t page was alrea
291d0 64 79 20 6c 6f 61 64 65 64 20 77 68 65 6e 20 74  dy loaded when t
291e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  his function was
291f0 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e 0a 20 20   called (i.e..  
29200 2a 2a 20 69 66 20 70 43 75 72 2d 3e 69 50 61 67  ** if pCur->iPag
29210 65 3e 3d 30 29 2e 20 42 75 74 20 74 68 69 73 20  e>=0). But this 
29220 69 73 20 6e 6f 74 20 73 6f 20 69 66 20 74 68 65  is not so if the
29230 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6f 72   database is cor
29240 72 75 70 74 65 64 20 0a 20 20 2a 2a 20 69 6e 20  rupted .  ** in 
29250 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
29260 70 61 67 65 20 70 52 6f 6f 74 20 69 73 20 6c 69  page pRoot is li
29270 6e 6b 65 64 20 69 6e 74 6f 20 61 20 73 65 63 6f  nked into a seco
29280 6e 64 20 62 2d 74 72 65 65 20 74 61 62 6c 65 20  nd b-tree table 
29290 0a 20 20 2a 2a 20 28 6f 72 20 74 68 65 20 66 72  .  ** (or the fr
292a0 65 65 6c 69 73 74 29 2e 20 20 2a 2f 0a 20 20 61  eelist).  */.  a
292b0 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 6e  ssert( pRoot->in
292c0 74 4b 65 79 3d 3d 31 20 7c 7c 20 70 52 6f 6f 74  tKey==1 || pRoot
292d0 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20  ->intKey==0 );. 
292e0 20 69 66 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e   if( pRoot->isIn
292f0 69 74 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e  it==0 || (pCur->
29300 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 21 3d 70 52  pKeyInfo==0)!=pR
29310 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  oot->intKey ){. 
29320 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29330 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
29340 20 7d 0a 0a 20 20 70 43 75 72 2d 3e 61 69 49 64   }..  pCur->aiId
29350 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72  x[0] = 0;.  pCur
29360 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
29370 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
29380 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74 4c  gs &= ~(BTCF_AtL
29390 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b  ast|BTCF_ValidNK
293a0 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66  ey|BTCF_ValidOvf
293b0 6c 29 3b 0a 0a 20 20 69 66 28 20 70 52 6f 6f 74  l);..  if( pRoot
293c0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
293d0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
293e0 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
293f0 7d 65 6c 73 65 20 69 66 28 20 21 70 52 6f 6f 74  }else if( !pRoot
29400 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
29410 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
29420 69 66 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21  if( pRoot->pgno!
29430 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
29440 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
29450 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
29460 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
29470 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
29480 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
29490 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
294a0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
294b0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
294c0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
294d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
294e0 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
294f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
29500 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
29510 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
29520 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
29530 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
29540 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
29550 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
29560 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
29570 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
29580 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
29590 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
295a0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
295b0 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
295c0 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
295d0 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
295e0 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
295f0 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
29600 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
29610 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
29620 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
29630 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
29640 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
29650 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
29660 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
29670 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
29680 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
29690 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
296a0 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
296b0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
296c0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e  [pCur->iPage])->
296d0 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65  leaf ){.    asse
296e0 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
296f0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61  pCur->iPage]<pPa
29700 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
29710 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
29720 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
29730 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
29740 72 2d 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20  r->iPage]));.   
29750 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
29760 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20  d(pCur, pgno);. 
29770 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29780 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
29790 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
297a0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
297b0 6c 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61  leaf entry benea
297c0 74 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74  th the.** page t
297d0 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
297e0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
297f0 2e 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69  .  Notice the di
29800 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77  fference.** betw
29810 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  een moveToLeftmo
29820 73 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52  st() and moveToR
29830 69 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76  ightmost().  mov
29840 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a  eToLeftmost().**
29850 20 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d   finds the left-
29860 6d 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61  most entry benea
29870 74 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77  th the *entry* w
29880 68 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67  hereas moveToRig
29890 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64  htmost().** find
298a0 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
298b0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
298c0 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a  he *page*..**.**
298d0 20 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   The right-most 
298e0 65 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65  entry is the one
298f0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
29900 74 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74  t key - the last
29910 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e  .** key in ascen
29920 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
29930 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
29940 52 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73  Rightmost(BtCurs
29950 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e  or *pCur){.  Pgn
29960 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63  o pgno;.  int rc
29970 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29980 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
29990 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
299a0 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
299b0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
299c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
299d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
299e0 29 3b 0a 20 20 77 68 69 6c 65 28 20 21 28 70 50  );.  while( !(pP
299f0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
29a00 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
29a10 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
29a20 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
29a30 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
29a40 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
29a50 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ;.    pCur->aiId
29a60 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
29a70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20   pPage->nCell;. 
29a80 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
29a90 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b  ild(pCur, pgno);
29aa0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
29ab0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
29ac0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
29ad0 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d  >iPage] = pPage-
29ae0 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 61 73 73 65  >nCell-1;.  asse
29af0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
29b00 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Size==0 );.  ass
29b10 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
29b20 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
29b30 64 4e 4b 65 79 29 3d 3d 30 20 29 3b 0a 20 20 72  dNKey)==0 );.  r
29b40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29b50 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
29b60 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
29b70 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
29b80 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
29b90 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
29ba0 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
29bb0 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
29bc0 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
29bd0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
29be0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
29bf0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
29c00 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
29c10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
29c20 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
29c30 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
29c40 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
29c50 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
29c60 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43 75  OwnsBtShared(pCu
29c70 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
29c80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
29c90 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
29ca0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
29cb0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
29cc0 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
29cd0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29ce0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
29cf0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
29d00 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73  LID ){.      ass
29d10 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
29d20 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
29d30 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
29d40 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
29d50 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
29d60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29d70 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29d80 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29d90 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  age]->nCell>0 );
29da0 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
29db0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
29dc0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
29dd0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
29de0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
29df0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
29e00 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
29e10 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
29e20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
29e30 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
29e40 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
29e50 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
29e60 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
29e70 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
29e80 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
29e90 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
29ea0 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
29eb0 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
29ec0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
29ed0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
29ee0 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
29ef0 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68  ( cursorOwnsBtSh
29f00 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20  ared(pCur) );.  
29f10 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
29f20 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
29f30 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
29f40 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
29f50 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65 61  the cursor alrea
29f60 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  dy points to the
29f70 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68 69   last entry, thi
29f80 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f  s is a no-op. */
29f90 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56 41  .  if( CURSOR_VA
29fa0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
29fb0 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46  e && (pCur->curF
29fc0 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
29fd0 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65 66  st)!=0 ){.#ifdef
29fe0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
29ff0 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
2a000 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72 74  serves to assert
2a010 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72 73  () that the curs
2a020 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 70  or really does p
2a030 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f 20  oint .    ** to 
2a040 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2a050 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a 2f  n the b-tree. */
2a060 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
2a070 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 43   for(ii=0; ii<pC
2a080 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b 29  ur->iPage; ii++)
2a090 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2a0a0 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d 3d  pCur->aiIdx[ii]=
2a0b0 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 69  =pCur->apPage[ii
2a0c0 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  ]->nCell );.    
2a0d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2a0e0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2a0f0 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61 70  iPage]==pCur->ap
2a100 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2a110 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20 20  ]->nCell-1 );.  
2a120 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a130 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a140 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65 6e  ge]->leaf );.#en
2a150 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
2a160 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2a170 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2a180 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2a190 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a1a0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
2a1b0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2a1c0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
2a1d0 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ert( pCur->pgnoR
2a1e0 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  oot==0 || pCur->
2a1f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2a200 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
2a210 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2a220 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a230 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a240 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2a250 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
2a260 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
2a270 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
2a280 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2a290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2a2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2a2b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
2a2c0 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20 20   BTCF_AtLast;.  
2a2d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a2e0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
2a2f0 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61 73  s &= ~BTCF_AtLas
2a300 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a 20  t;.      }.   . 
2a310 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a320 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2a330 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
2a340 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
2a350 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20 74   an entry near t
2a360 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69  he key .** speci
2a370 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79 20  fied by pIdxKey 
2a380 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65 74  or intKey.   Ret
2a390 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
2a3a0 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
2a3b0 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68 65  TKEY tables, the
2a3c0 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74 65   intKey paramete
2a3d0 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64 78  r is used.  pIdx
2a3e0 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Key .** must be 
2a3f0 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78  NULL.  For index
2a400 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65 79   tables, pIdxKey
2a410 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e 74   is used and int
2a420 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  Key.** is ignore
2a430 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
2a440 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
2a450 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
2a460 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
2a470 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
2a480 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
2a490 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
2a4a0 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
2a4b0 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
2a4c0 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
2a4d0 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
2a4e0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
2a4f0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
2a500 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
2a510 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65 72  **.** An integer
2a520 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
2a530 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73 20   *pRes which is 
2a540 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a  the result of.**
2a550 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 6b   comparing the k
2a560 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74 72  ey with the entr
2a570 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  y to which the c
2a580 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f 69  ursor is .** poi
2a590 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61 6e  nting.  The mean
2a5a0 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65 67  ing of the integ
2a5b0 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a  er written into.
2a5c0 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20 66  ** *pRes is as f
2a5d0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
2a5e0 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54    *pRes<0      T
2a5f0 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a600 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a610 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a630 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
2a640 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20 6f  intKey/pIdxKey o
2a650 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
2a660 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
2a670 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
2a680 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
2a690 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
2a6a0 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
2a6b0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
2a6c0 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
2a6d0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2a6e0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
2a6f0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
2a700 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
2a710 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70 49  atches intKey/pI
2a720 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  dxKey..**.**    
2a730 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
2a740 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
2a750 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
2a760 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2a780 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69 6e  s larger than in
2a790 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a  tKey/pIdxKey..**
2a7a0 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74 61  .** For index ta
2a7b0 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b 65  bles, the pIdxKe
2a7c0 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64 20  y->eqSeen field 
2a7d0 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20 74  is set to 1 if t
2a7e0 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20 61  here.** exists a
2a7f0 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  n entry in the t
2a800 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74 6c  able that exactl
2a810 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b 65  y matches pIdxKe
2a820 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  y.  .*/.int sqli
2a830 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
2a840 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72 73  packed(.  BtCurs
2a850 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2a860 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
2a870 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a   to be moved */.
2a880 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
2a890 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55 6e   *pIdxKey, /* Un
2a8a0 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
2a8b0 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65 79   */.  i64 intKey
2a8c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2a8d0 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79 20  * The table key 
2a8e0 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69 67  */.  int biasRig
2a8f0 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ht,           /*
2a900 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74   If true, bias t
2a910 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  he search to the
2a920 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
2a930 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
2a940 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2a950 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73 20   search results 
2a960 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
2a970 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f 6d   rc;.  RecordCom
2a980 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d 70  pare xRecordComp
2a990 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  are;..  assert( 
2a9a0 63 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72  cursorOwnsBtShar
2a9b0 65 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ed(pCur) );.  as
2a9c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2a9d0 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
2a9e0 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
2a9f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
2aa00 52 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Res );.  assert(
2aa10 20 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28   (pIdxKey==0)==(
2aa20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d  pCur->pKeyInfo==
2aa30 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  0) );..  /* If t
2aa40 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
2aa50 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20  eady positioned 
2aa60 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20  at the point we 
2aa70 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20  are trying.  ** 
2aa80 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e  to move to, then
2aa90 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74   just return wit
2aaa0 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77  hout doing any w
2aab0 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75  ork */.  if( pCu
2aac0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2aad0 52 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72  R_VALID && (pCur
2aae0 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
2aaf0 46 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a  F_ValidNKey)!=0.
2ab00 20 20 20 26 26 20 70 43 75 72 2d 3e 63 75 72 49     && pCur->curI
2ab10 6e 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20  ntKey .  ){.    
2ab20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
2ab30 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20  Key==intKey ){. 
2ab40 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
2ab50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2ab60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
2ab70 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72    if( (pCur->cur
2ab80 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2ab90 61 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d  ast)!=0 && pCur-
2aba0 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
2abb0 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
2abc0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
2abd0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2abe0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
2abf0 70 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78  pIdxKey ){.    x
2ac00 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2ac10 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43  sqlite3VdbeFindC
2ac20 6f 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b  ompare(pIdxKey);
2ac30 0a 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72  .    pIdxKey->er
2ac40 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61  rCode = 0;.    a
2ac50 73 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e  ssert( pIdxKey->
2ac60 64 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20  default_rc==1 . 
2ac70 20 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b          || pIdxK
2ac80 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2ac90 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  0 .         || p
2aca0 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2acb0 72 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20  rc==-1.    );.  
2acc0 7d 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f  }else{.    xReco
2acd0 72 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f  rdCompare = 0; /
2ace0 2a 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69  * All keys are i
2acf0 6e 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a  ntegers */.  }..
2ad00 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2ad10 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2ad20 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
2ad30 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2ad40 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2ad50 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2ad60 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2ad70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2ad80 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2ad90 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2ada0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
2adb0 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74  Init );.  assert
2adc0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2add0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
2ade0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2adf0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
2ae00 6c 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43  ll>0 );.  if( pC
2ae10 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ae20 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
2ae30 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
2ae40 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2ae50 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70  pgnoRoot==0 || p
2ae60 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2ae70 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d  ->iPage]->nCell=
2ae80 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
2ae90 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
2aea0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2aeb0 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65  apPage[0]->intKe
2aec0 79 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b  y==pCur->curIntK
2aed0 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ey );.  assert( 
2aee0 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
2aef0 7c 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20  || pIdxKey );.  
2af00 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74  for(;;){.    int
2af10 20 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20   lwr, upr, idx, 
2af20 63 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  c;.    Pgno chld
2af30 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
2af40 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61  *pPage = pCur->a
2af50 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2af60 65 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  e];.    u8 *pCel
2af70 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2af80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2af90 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
2afa0 74 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20  t cell in pPage 
2afb0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65  */..    /* pPage
2afc0 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20  ->nCell must be 
2afd0 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
2afe0 6f 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  o. If this is th
2aff0 65 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  e root-page.    
2b000 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f  ** the cursor wo
2b010 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e  uld have been IN
2b020 56 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20  VALID above and 
2b030 74 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f  this for(;;) loo
2b040 70 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e  p.    ** not run
2b050 2e 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74  . If this is not
2b060 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20   the root-page, 
2b070 74 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43  then the moveToC
2b080 68 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20  hild() routine. 
2b090 20 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65     ** would have
2b0a0 20 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65   already detecte
2b0b0 64 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d db corruption.
2b0c0 20 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67   Similarly, pPag
2b0d0 65 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65  e must.    ** be
2b0e0 20 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20   the right kind 
2b0f0 28 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29  (index or table)
2b100 20 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e   of b-tree page.
2b110 20 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a   Otherwise.    *
2b120 2a 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  * a moveToChild(
2b130 29 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28  ) or moveToRoot(
2b140 29 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76  ) call would hav
2b150 65 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75  e detected corru
2b160 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61  ption.  */.    a
2b170 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2b180 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ell>0 );.    ass
2b190 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2b1a0 65 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29  ey==(pIdxKey==0)
2b1b0 20 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b   );.    lwr = 0;
2b1c0 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65  .    upr = pPage
2b1d0 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61  ->nCell-1;.    a
2b1e0 73 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74  ssert( biasRight
2b1f0 3d 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74  ==0 || biasRight
2b200 3d 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  ==1 );.    idx =
2b210 20 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67   upr>>(1-biasRig
2b220 68 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69  ht); /* idx = bi
2b230 61 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20  asRight ? upr : 
2b240 28 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a  (lwr+upr)/2; */.
2b250 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2b260 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2b270 75 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28  u16)idx;.    if(
2b280 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d   xRecordCompare=
2b290 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
2b2a0 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ;;){.        i64
2b2b0 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20   nCellKey;.     
2b2c0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
2b2d0 65 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65  ellPastPtr(pPage
2b2e0 2c 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20  , idx);.        
2b2f0 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
2b300 79 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  yLeaf ){.       
2b310 20 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c     while( 0x80 <
2b320 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a  = *(pCell++) ){.
2b330 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2b340 70 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44  pCell>=pPage->aD
2b350 61 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20  ataEnd ) return 
2b360 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2b370 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  KPT;.          }
2b380 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b390 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65     getVarint(pCe
2b3a0 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c  ll, (u64*)&nCell
2b3b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Key);.        if
2b3c0 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65  ( nCellKey<intKe
2b3d0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c  y ){.          l
2b3e0 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
2b3f0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2b400 72 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65  r ){ c = -1; bre
2b410 61 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65  ak; }.        }e
2b420 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
2b430 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
2b440 20 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31       upr = idx-1
2b450 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b460 6c 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b  lwr>upr ){ c = +
2b470 31 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20  1; break; }.    
2b480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b490 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65       assert( nCe
2b4a0 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b  llKey==intKey );
2b4b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2b4c0 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2b4d0 46 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20  F_ValidNKey;.   
2b4e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
2b4f0 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
2b500 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  y;.          pCu
2b510 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2b520 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2b530 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2b540 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2b550 20 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20              lwr 
2b560 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20  = idx;.         
2b570 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e     goto moveto_n
2b580 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20  ext_layer;.     
2b590 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2b5a0 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
2b5b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  0;.            r
2b5c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2b5d0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2b5e0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2b5f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2b610 65 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20  ert( lwr+upr>=0 
2b620 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d  );.        idx =
2b630 20 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20   (lwr+upr)>>1;  
2b640 2f 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70  /* idx = (lwr+up
2b650 72 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d  r)/2; */.      }
2b660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b670 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
2b680 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f     int nCell;  /
2b690 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43  * Size of the pC
2b6a0 65 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65  ell cell in byte
2b6b0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65  s */.        pCe
2b6c0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73  ll = findCellPas
2b6d0 74 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29  tPtr(pPage, idx)
2b6e0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
2b6f0 65 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72  e maximum suppor
2b700 74 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73  ted page-size is
2b710 20 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68   65536 bytes. Th
2b720 69 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20  is means that.  
2b730 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78        ** the max
2b740 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72  imum number of r
2b750 65 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72  ecord bytes stor
2b760 65 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42  ed on an index B
2b770 2d 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a  -Tree.        **
2b780 20 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68   page is less th
2b790 61 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61  an 16384 bytes a
2b7a0 6e 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  nd may be stored
2b7b0 20 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20   as a 2-byte.   
2b7c0 20 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20       ** varint. 
2b7d0 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
2b7e0 20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65   is used to atte
2b7f0 6d 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72  mpt to avoid par
2b800 73 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  sing .        **
2b810 20 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c   the entire cell
2b820 20 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72   by checking for
2b830 20 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65   the cases where
2b840 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a   the record is .
2b850 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
2b860 64 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69  d entirely withi
2b870 6e 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67  n the b-tree pag
2b880 65 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20  e by inspecting 
2b890 74 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20  the first .     
2b8a0 20 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66     ** 2 bytes of
2b8b0 20 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20   the cell..     
2b8c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43     */.        nC
2b8d0 65 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a  ell = pCell[0];.
2b8e0 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c          if( nCel
2b8f0 6c 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79  l<=pPage->max1by
2b900 74 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20  tePayload ){.   
2b910 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62         /* This b
2b920 72 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68  ranch runs if th
2b930 65 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69  e record-size fi
2b940 65 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  eld of the cell 
2b950 69 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a  is a.          *
2b960 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61  * single byte va
2b970 72 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63  rint and the rec
2b980 6f 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c  ord fits entirel
2b990 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20  y on the main.  
2b9a0 20 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65          ** b-tre
2b9b0 65 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20  e page.  */.    
2b9c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2b9d0 70 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70  pCell+nCell+1==p
2b9e0 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29  Page->aDataEnd )
2b9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
2ba00 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  xRecordCompare(n
2ba10 43 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43  Cell, (void*)&pC
2ba20 65 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29  ell[1], pIdxKey)
2ba30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2ba40 69 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26  if( !(pCell[1] &
2ba50 20 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20   0x80) .        
2ba60 20 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28    && (nCell = ((
2ba70 6e 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20  nCell&0x7f)<<7) 
2ba80 2b 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61  + pCell[1])<=pPa
2ba90 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20  ge->maxLocal.   
2baa0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
2bab0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d    /* The record-
2bac0 73 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20  size field is a 
2bad0 32 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e  2 byte varint an
2bae0 64 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20  d the record .  
2baf0 20 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20          ** fits 
2bb00 65 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20  entirely on the 
2bb10 6d 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65  main b-tree page
2bb20 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
2bb30 74 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b  testcase( pCell+
2bb40 6e 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e  nCell+2==pPage->
2bb50 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20  aDataEnd );.    
2bb60 20 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72        c = xRecor
2bb70 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20  dCompare(nCell, 
2bb80 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d  (void*)&pCell[2]
2bb90 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
2bba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bbb0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f       /* The reco
2bbc0 72 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e  rd flows over on
2bbd0 74 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  to one or more o
2bbe0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49  verflow pages. I
2bbf0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
2bc00 68 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f  his case the who
2bc10 6c 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f  le cell needs to
2bc20 20 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75   be parsed, a bu
2bc30 66 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20  ffer allocated. 
2bc40 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
2bc50 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20  accessPayload() 
2bc60 75 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65  used to retrieve
2bc70 20 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f   the record into
2bc80 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
2bc90 2a 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20  * buffer before 
2bca0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
2bcb0 65 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  e() can be calle
2bcc0 64 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  d. .          **
2bcd0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66  .          ** If
2bce0 20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63   the record is c
2bcf0 6f 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63  orrupt, the xRec
2bd00 6f 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69  ordCompare routi
2bd10 6e 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20  ne may read.    
2bd20 20 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74        ** up to t
2bd30 77 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20  wo varints past 
2bd40 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62  the end of the b
2bd50 75 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20  uffer. An extra 
2bd60 31 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  18 .          **
2bd70 20 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e   bytes of paddin
2bd80 67 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  g is allocated a
2bd90 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
2bda0 20 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20   buffer in.     
2bdb0 20 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69       ** case thi
2bdc0 73 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20  s happens.  */. 
2bdd0 20 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70           void *p
2bde0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
2bdf0 20 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43     u8 * const pC
2be00 65 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20  ellBody = pCell 
2be10 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  - pPage->childPt
2be20 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  rSize;.         
2be30 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
2be40 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42  ll(pPage, pCellB
2be50 6f 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  ody, &pCur->info
2be60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65  );.          nCe
2be70 6c 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ll = (int)pCur->
2be80 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
2be90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2bea0 43 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54  Cell<0 );   /* T
2beb0 72 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20  rue if key size 
2bec0 69 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20  is 2^32 or more 
2bed0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  */.          tes
2bee0 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20  tcase( nCell==0 
2bef0 29 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b  );  /* Invalid k
2bf00 65 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30  ey size:  0x80 0
2bf10 78 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20  x80 0x00 */.    
2bf20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2bf30 6e 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20  nCell==1 );  /* 
2bf40 49 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65  Invalid key size
2bf50 3a 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30  :  0x80 0x80 0x0
2bf60 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74  1 */.          t
2bf70 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d  estcase( nCell==
2bf80 32 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  2 );  /* Minimum
2bf90 20 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79   legal index key
2bfa0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20   size */.       
2bfb0 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29     if( nCell<2 )
2bfc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2bfd0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
2bfe0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
2bff0 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
2c000 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20  finish;.        
2c010 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43    }.          pC
2c020 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
2c030 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38  Malloc( nCell+18
2c040 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2c050 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b  ( pCellKey==0 ){
2c060 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2c070 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2c080 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  KPT;.           
2c090 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
2c0a0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ish;.          }
2c0b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2c0c0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c0d0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2c0e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 61            rc = a
2c0f0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75  ccessPayload(pCu
2c100 72 2c 20 30 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e  r, 0, nCell, (un
2c110 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 43 65  signed char*)pCe
2c120 6c 6c 4b 65 79 2c 20 32 29 3b 0a 20 20 20 20 20  llKey, 2);.     
2c130 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2c140 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c150 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2c160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
2c170 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
2c180 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  h;.          }. 
2c190 20 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65           c = xRe
2c1a0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c  cordCompare(nCel
2c1b0 6c 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  l, pCellKey, pId
2c1c0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  xKey);.         
2c1d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2c1e0 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  ellKey);.       
2c1f0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2c200 74 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t( .            
2c210 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64  (pIdxKey->errCod
2c220 65 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  e!=SQLITE_CORRUP
2c230 54 20 7c 7c 20 63 3d 3d 30 29 0a 20 20 20 20 20  T || c==0).     
2c240 20 20 20 20 26 26 20 28 70 49 64 78 4b 65 79 2d      && (pIdxKey-
2c250 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2c260 5f 4e 4f 4d 45 4d 20 7c 7c 20 70 43 75 72 2d 3e  _NOMEM || pCur->
2c270 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pBtree->db->mall
2c280 6f 63 46 61 69 6c 65 64 29 0a 20 20 20 20 20 20  ocFailed).      
2c290 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2c2a0 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c<0 ){.        
2c2b0 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20    lwr = idx+1;. 
2c2c0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
2c2d0 20 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   c>0 ){.        
2c2e0 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20    upr = idx-1;. 
2c2f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2c300 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2c310 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  c==0 );.        
2c320 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2c330 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c340 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
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 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20  )idx;.          
2c380 69 66 28 20 70 49 64 78 4b 65 79 2d 3e 65 72 72  if( pIdxKey->err
2c390 43 6f 64 65 20 29 20 72 63 20 3d 20 53 51 4c 49  Code ) rc = SQLI
2c3a0 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
2c3b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2c3c0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
2c3d0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2c3e0 6c 77 72 3e 75 70 72 20 29 20 62 72 65 61 6b 3b  lwr>upr ) break;
2c3f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2c400 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2c410 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2c420 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2c430 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2c440 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2c450 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
2c460 72 3d 3d 75 70 72 2b 31 20 7c 7c 20 28 70 50 61  r==upr+1 || (pPa
2c470 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70  ge->intKey && !p
2c480 50 61 67 65 2d 3e 6c 65 61 66 29 20 29 3b 0a 20  Page->leaf) );. 
2c490 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c4a0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
2c4b0 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
2c4c0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2c4d0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2c4e0 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e  r->iPage]<pCur->
2c4f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2c500 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ge]->nCell );.  
2c510 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
2c520 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
2c530 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20 2a  u16)idx;.      *
2c540 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20 20  pRes = c;.      
2c550 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c560 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
2c570 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
2c580 6d 6f 76 65 74 6f 5f 6e 65 78 74 5f 6c 61 79 65  moveto_next_laye
2c590 72 3a 0a 20 20 20 20 69 66 28 20 6c 77 72 3e 3d  r:.    if( lwr>=
2c5a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
2c5b0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
2c5c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2c5d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2c5e0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2c5f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
2c600 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
2c610 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
2c620 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
2c630 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c640 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c650 6c 77 72 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  lwr;.    rc = mo
2c660 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2c670 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
2c680 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d   rc ) break;.  }
2c690 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a  .moveto_finish:.
2c6a0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2c6b0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
2c6c0 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42 54  curFlags &= ~(BT
2c6d0 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43  CF_ValidNKey|BTC
2c6e0 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 20 20  F_ValidOvfl);.  
2c6f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2c700 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
2c710 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2c720 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
2c730 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
2c740 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
2c750 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
2c760 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
2c770 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
2c780 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
2c790 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
2c7a0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2c7b0 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
2c7c0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
2c7d0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
2c7e0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
2c7f0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
2c800 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2c810 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
2c820 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
2c830 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
2c840 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
2c850 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
2c860 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
2c870 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
2c880 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
2c890 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
2c8a0 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
2c8b0 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
2c8c0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
2c8d0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
2c8e0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
2c8f0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
2c900 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
2c910 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
2c920 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
2c930 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68  /*.** Advance th
2c940 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2c950 6e 65 78 74 20 65 6e 74 72 79 20 69 6e 20 74 68  next entry in th
2c960 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2c970 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2c980 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2c990 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2c9a0 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2c9b0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6c 61  inting to the la
2c9c0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
2c9d0 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a  database before.
2c9e0 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
2c9f0 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  was called, then
2ca00 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a   set *pRes=1..**
2ca10 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74  .** The main ent
2ca20 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69  ry point is sqli
2ca30 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 2e 20  te3BtreeNext(). 
2ca40 20 54 68 61 74 20 72 6f 75 74 69 6e 65 20 69 73   That routine is
2ca50 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f   optimized.** fo
2ca60 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  r the common cas
2ca70 65 20 6f 66 20 6d 65 72 65 6c 79 20 69 6e 63 72  e of merely incr
2ca80 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 65 6c  ementing the cel
2ca90 6c 20 63 6f 75 6e 74 65 72 20 42 74 43 75 72 73  l counter BtCurs
2caa0 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74  or.aiIdx.** to t
2cab0 68 65 20 6e 65 78 74 20 63 65 6c 6c 20 6f 6e 20  he next cell on 
2cac0 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
2cad0 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29 20  .  The (slower) 
2cae0 62 74 72 65 65 4e 65 78 74 28 29 20 68 65 6c 70  btreeNext() help
2caf0 65 72 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  er.** routine is
2cb00 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 69 74 20   called when it 
2cb10 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
2cb20 6d 6f 76 65 20 74 6f 20 61 20 64 69 66 66 65 72  move to a differ
2cb30 65 6e 74 20 70 61 67 65 20 6f 72 0a 2a 2a 20 74  ent page or.** t
2cb40 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 75  o restore the cu
2cb50 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rsor..**.** The 
2cb60 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
2cb70 20 77 69 6c 6c 20 73 65 74 20 2a 70 52 65 73 20   will set *pRes 
2cb80 74 6f 20 30 20 6f 72 20 31 2e 20 20 54 68 65 20  to 0 or 1.  The 
2cb90 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61  initial *pRes va
2cba0 6c 75 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31  lue.** will be 1
2cbb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 62   if the cursor b
2cbc0 65 69 6e 67 20 73 74 65 70 70 65 64 20 63 6f 72  eing stepped cor
2cbd0 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53  responds to an S
2cbe0 51 4c 20 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20  QL index and.** 
2cbf0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
2cc00 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
2cc10 73 6b 69 70 70 65 64 20 69 66 20 74 68 61 74 20  skipped if that 
2cc20 53 51 4c 20 69 6e 64 65 78 20 68 61 64 20 62 65  SQL index had be
2cc30 65 6e 0a 2a 2a 20 61 20 75 6e 69 71 75 65 20 69  en.** a unique i
2cc40 6e 64 65 78 2e 20 20 4f 74 68 65 72 77 69 73 65  ndex.  Otherwise
2cc50 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
2cc60 20 68 61 76 65 20 73 65 74 20 2a 70 52 65 73 20   have set *pRes 
2cc70 74 6f 20 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f  to zero..** Zero
2cc80 20 69 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   is the common c
2cc90 61 73 65 2e 20 54 68 65 20 62 74 72 65 65 20 69  ase. The btree i
2cca0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
2ccb0 20 66 72 65 65 20 74 6f 20 75 73 65 20 74 68 65   free to use the
2ccc0 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 2a 70 52 65  .** initial *pRe
2ccd0 73 20 76 61 6c 75 65 20 61 73 20 61 20 68 69 6e  s value as a hin
2cce0 74 20 74 6f 20 69 6d 70 72 6f 76 65 20 70 65 72  t to improve per
2ccf0 66 6f 72 6d 61 6e 63 65 2c 20 62 75 74 20 74 68  formance, but th
2cd00 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c  e current.** SQL
2cd10 69 74 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  ite btree implem
2cd20 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  entation does no
2cd30 74 2e 20 28 4e 6f 74 65 20 74 68 61 74 20 74 68  t. (Note that th
2cd40 65 20 63 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a  e comdb2 btree.*
2cd50 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
2cd60 20 64 6f 65 73 20 75 73 65 20 74 68 69 73 20 68   does use this h
2cd70 69 6e 74 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a  int, however.).*
2cd80 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
2cd90 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72  NOINLINE int btr
2cda0 65 65 4e 65 78 74 28 42 74 43 75 72 73 6f 72 20  eeNext(BtCursor 
2cdb0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73  *pCur, int *pRes
2cdc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2cdd0 6e 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67  nt idx;.  MemPag
2cde0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
2cdf0 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42  ert( cursorOwnsB
2ce00 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b  tShared(pCur) );
2ce10 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2ce20 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20  >skipNext==0 || 
2ce30 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
2ce40 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
2ce50 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30  assert( *pRes==0
2ce60 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
2ce70 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ce80 41 4c 49 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ALID ){.    asse
2ce90 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c  rt( (pCur->curFl
2cea0 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64  ags & BTCF_Valid
2ceb0 4f 76 66 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20  Ovfl)==0 );.    
2cec0 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
2ced0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2cee0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2cef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cf00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2cf10 7d 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52  }.    if( CURSOR
2cf20 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
2cf30 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
2cf40 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
2cf50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2cf60 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  K;.    }.    if(
2cf70 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2cf80 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2cf90 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2cfa0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2cfb0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2cfc0 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a  SOR_SKIPNEXT );.
2cfd0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
2cfe0 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
2cff0 44 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  D;.      if( pCu
2d000 72 2d 3e 73 6b 69 70 4e 65 78 74 3e 30 20 29 7b  r->skipNext>0 ){
2d010 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73  .        pCur->s
2d020 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20  kipNext = 0;.   
2d030 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2d040 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
2d050 20 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e       pCur->skipN
2d060 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ext = 0;.    }. 
2d070 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
2d080 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d090 3e 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d  >iPage];.  idx =
2d0a0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
2d0b0 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
2d0c0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2d0d0 49 6e 69 74 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  Init );..  /* If
2d0e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d0f0 6c 65 20 69 73 20 63 6f 72 72 75 70 74 2c 20 69  le is corrupt, i
2d100 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f  t is possible fo
2d110 72 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  r the value of i
2d120 64 78 20 0a 20 20 2a 2a 20 74 6f 20 62 65 20 69  dx .  ** to be i
2d130 6e 76 61 6c 69 64 20 68 65 72 65 2e 20 54 68 69  nvalid here. Thi
2d140 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
2d150 20 69 66 20 61 20 73 65 63 6f 6e 64 20 63 75 72   if a second cur
2d160 73 6f 72 20 6d 6f 64 69 66 69 65 73 0a 20 20 2a  sor modifies.  *
2d170 2a 20 74 68 65 20 70 61 67 65 20 77 68 69 6c 65  * the page while
2d180 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
2d190 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
2d1a0 6e 63 65 20 74 6f 20 69 74 2e 20 57 68 69 63 68  nce to it. Which
2d1b0 20 63 61 6e 0a 20 20 2a 2a 20 6f 6e 6c 79 20 68   can.  ** only h
2d1c0 61 70 70 65 6e 20 69 66 20 74 68 65 20 64 61 74  appen if the dat
2d1d0 61 62 61 73 65 20 69 73 20 63 6f 72 72 75 70 74  abase is corrupt
2d1e0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61   in such a way a
2d1f0 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 0a 20 20  s to link the.  
2d200 2a 2a 20 70 61 67 65 20 69 6e 74 6f 20 6d 6f 72  ** page into mor
2d210 65 20 74 68 61 6e 20 6f 6e 65 20 62 2d 74 72 65  e than one b-tre
2d220 65 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a  e structure. */.
2d230 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 3e    testcase( idx>
2d240 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
2d250 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50 61 67  .  if( idx>=pPag
2d260 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2d270 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2d280 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d   ){.      rc = m
2d290 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
2d2a0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2d2b0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2d2c0 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20  drOffset+8]));. 
2d2d0 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
2d2e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 72  turn rc;.      r
2d2f0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2d300 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
2d310 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  }.    do{.      
2d320 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  if( pCur->iPage=
2d330 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =0 ){.        *p
2d340 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
2d350 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2d360 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2d370 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2d380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2d390 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61  }.      moveToPa
2d3a0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
2d3b0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2d3c0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d3d0 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
2d3e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2d3f0 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
2d400 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 69  ->nCell );.    i
2d410 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2d420 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2d430 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
2d440 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  t(pCur, pRes);. 
2d450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
2d480 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
2d490 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d4a0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2d4b0 20 20 20 20 72 65 74 75 72 6e 20 6d 6f 76 65 54      return moveT
2d4c0 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b  oLeftmost(pCur);
2d4d0 0a 20 20 7d 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  .  }.}.int sqlit
2d4e0 65 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75  e3BtreeNext(BtCu
2d4f0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2d500 2a 70 52 65 73 29 7b 0a 20 20 4d 65 6d 50 61 67  *pRes){.  MemPag
2d510 65 20 2a 70 50 61 67 65 3b 0a 20 20 61 73 73 65  e *pPage;.  asse
2d520 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
2d530 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
2d540 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d    assert( pRes!=
2d550 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a  0 );.  assert( *
2d560 70 52 65 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73  pRes==0 || *pRes
2d570 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2d580 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d   pCur->skipNext=
2d590 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  =0 || pCur->eSta
2d5a0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
2d5b0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   );.  pCur->info
2d5c0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
2d5d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2d5e0 7e 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79  ~(BTCF_ValidNKey
2d5f0 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2d600 3b 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20  ;.  *pRes = 0;. 
2d610 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2d620 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2d630 29 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e 65  ) return btreeNe
2d640 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a  xt(pCur, pRes);.
2d650 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2d660 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2d670 67 65 5d 3b 0a 20 20 69 66 28 20 28 2b 2b 70 43  ge];.  if( (++pC
2d680 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2d690 69 50 61 67 65 5d 29 3e 3d 70 50 61 67 65 2d 3e  iPage])>=pPage->
2d6a0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 70 43 75  nCell ){.    pCu
2d6b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2d6c0 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 72 65 74  Page]--;.    ret
2d6d0 75 72 6e 20 62 74 72 65 65 4e 65 78 74 28 70 43  urn btreeNext(pC
2d6e0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d 0a 20  ur, pRes);.  }. 
2d6f0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2d700 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2d710 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2d720 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  e{.    return mo
2d730 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2d740 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
2d750 20 53 74 65 70 20 74 68 65 20 63 75 72 73 6f 72   Step the cursor
2d760 20 74 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20   to the back to 
2d770 74 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74  the previous ent
2d780 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2d790 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
2d7a0 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
2d7b0 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
2d7c0 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
2d7d0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
2d7e0 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
2d7f0 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
2d800 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
2d810 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
2d820 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
2d830 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  Res=1..**.** The
2d840 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e   main entry poin
2d850 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65  t is sqlite3Btre
2d860 65 50 72 65 76 69 6f 75 73 28 29 2e 20 20 54 68  ePrevious().  Th
2d870 61 74 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 70  at routine is op
2d880 74 69 6d 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74  timized.** for t
2d890 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f  he common case o
2d8a0 66 20 6d 65 72 65 6c 79 20 64 65 63 72 65 6d 65  f merely decreme
2d8b0 6e 74 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 63  nting the cell c
2d8c0 6f 75 6e 74 65 72 20 42 74 43 75 72 73 6f 72 2e  ounter BtCursor.
2d8d0 61 69 49 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20  aiIdx.** to the 
2d8e0 70 72 65 76 69 6f 75 73 20 63 65 6c 6c 20 6f 6e  previous cell on
2d8f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2d900 65 2e 20 20 54 68 65 20 28 73 6c 6f 77 65 72 29  e.  The (slower)
2d910 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28 29   btreePrevious()
2d920 0a 2a 2a 20 68 65 6c 70 65 72 20 72 6f 75 74 69  .** helper routi
2d930 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
2d940 6e 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  n it is necessar
2d950 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20 61 20 64  y to move to a d
2d960 69 66 66 65 72 65 6e 74 20 70 61 67 65 0a 2a 2a  ifferent page.**
2d970 20 6f 72 20 74 6f 20 72 65 73 74 6f 72 65 20 74   or to restore t
2d980 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a  he cursor..**.**
2d990 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
2d9a0 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65 74 20 2a  ction will set *
2d9b0 70 52 65 73 20 74 6f 20 30 20 6f 72 20 31 2e 20  pRes to 0 or 1. 
2d9c0 20 54 68 65 20 69 6e 69 74 69 61 6c 20 2a 70 52   The initial *pR
2d9d0 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77 69 6c 6c  es value.** will
2d9e0 20 62 65 20 31 20 69 66 20 74 68 65 20 63 75 72   be 1 if the cur
2d9f0 73 6f 72 20 62 65 69 6e 67 20 73 74 65 70 70 65  sor being steppe
2da00 64 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  d corresponds to
2da10 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20 61 6e   an SQL index an
2da20 64 0a 2a 2a 20 69 66 20 74 68 69 73 20 72 6f 75  d.** if this rou
2da30 74 69 6e 65 20 63 6f 75 6c 64 20 68 61 76 65 20  tine could have 
2da40 62 65 65 6e 20 73 6b 69 70 70 65 64 20 69 66 20  been skipped if 
2da50 74 68 61 74 20 53 51 4c 20 69 6e 64 65 78 20 68  that SQL index h
2da60 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20 75 6e 69  ad been.** a uni
2da70 71 75 65 20 69 6e 64 65 78 2e 20 20 4f 74 68 65  que index.  Othe
2da80 72 77 69 73 65 20 74 68 65 20 63 61 6c 6c 65 72  rwise the caller
2da90 20 77 69 6c 6c 20 68 61 76 65 20 73 65 74 20 2a   will have set *
2daa0 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2a  pRes to zero..**
2dab0 20 5a 65 72 6f 20 69 73 20 74 68 65 20 63 6f 6d   Zero is the com
2dac0 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65 20 62 74  mon case. The bt
2dad0 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2dae0 6f 6e 20 69 73 20 66 72 65 65 20 74 6f 20 75 73  on is free to us
2daf0 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c  e the.** initial
2db00 20 2a 70 52 65 73 20 76 61 6c 75 65 20 61 73 20   *pRes value as 
2db10 61 20 68 69 6e 74 20 74 6f 20 69 6d 70 72 6f 76  a hint to improv
2db20 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 2c 20 62  e performance, b
2db30 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a  ut the current.*
2db40 2a 20 53 51 4c 69 74 65 20 62 74 72 65 65 20 69  * SQLite btree i
2db50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2db60 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65 20 74 68  es not. (Note th
2db70 61 74 20 74 68 65 20 63 6f 6d 64 62 32 20 62 74  at the comdb2 bt
2db80 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74  ree.** implement
2db90 61 74 69 6f 6e 20 64 6f 65 73 20 75 73 65 20 74  ation does use t
2dba0 68 69 73 20 68 69 6e 74 2c 20 68 6f 77 65 76 65  his hint, howeve
2dbb0 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51  r.).*/.static SQ
2dbc0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e  LITE_NOINLINE in
2dbd0 74 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  t btreePrevious(
2dbe0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
2dbf0 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
2dc00 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
2dc10 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  *pPage;..  asser
2dc20 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74 53  t( cursorOwnsBtS
2dc30 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a 20  hared(pCur) );. 
2dc40 20 61 73 73 65 72 74 28 20 70 52 65 73 21 3d 30   assert( pRes!=0
2dc50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70   );.  assert( *p
2dc60 52 65 73 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  Res==0 );.  asse
2dc70 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  rt( pCur->skipNe
2dc80 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65  xt==0 || pCur->e
2dc90 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2dca0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
2dcb0 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2dcc0 20 26 20 28 42 54 43 46 5f 41 74 4c 61 73 74 7c   & (BTCF_AtLast|
2dcd0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2dce0 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 29 3d  TCF_ValidNKey))=
2dcf0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2dd00 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2dd10 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ==0 );.  if( pCu
2dd20 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2dd30 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
2dd40 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
2dd50 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
2dd60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2dd70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2dd80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2dd90 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
2dda0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
2ddb0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 2a  State ){.      *
2ddc0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
2ddd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dde0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2ddf0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 29  pCur->skipNext )
2de00 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
2de10 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2de20 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2de30 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2de40 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 3b 0a 20  OR_SKIPNEXT );. 
2de50 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
2de60 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  e = CURSOR_VALID
2de70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  ;.      if( pCur
2de80 2d 3e 73 6b 69 70 4e 65 78 74 3c 30 20 29 7b 0a  ->skipNext<0 ){.
2de90 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b          pCur->sk
2dea0 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2deb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2dec0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2ded0 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
2dee0 78 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  xt = 0;.    }.  
2def0 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  }..  pPage = pCu
2df00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2df10 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74  iPage];.  assert
2df20 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2df30 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  );.  if( !pPage-
2df40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 69 6e 74  >leaf ){.    int
2df50 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
2df60 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
2df70 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2df80 43 68 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34  Child(pCur, get4
2df90 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
2dfa0 61 67 65 2c 20 69 64 78 29 29 29 3b 0a 20 20 20  age, idx)));.   
2dfb0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2dfc0 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f   rc;.    rc = mo
2dfd0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
2dfe0 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
2dff0 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61    while( pCur->a
2e000 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2e010 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ]==0 ){.      if
2e020 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30  ( pCur->iPage==0
2e030 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2e040 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
2e050 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
2e060 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2e070 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2e080 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2e090 20 20 20 20 20 20 6d 6f 76 65 54 6f 50 61 72 65        moveToPare
2e0a0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
2e0b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2e0c0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20  ->info.nSize==0 
2e0d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
2e0e0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e0f0 20 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79   (BTCF_ValidNKey
2e100 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29  |BTCF_ValidOvfl)
2e110 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 70 43 75  )==0 );..    pCu
2e120 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e130 50 61 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61  Page]--;.    pPa
2e140 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2e150 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2e160 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2e170 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
2e180 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
2e190 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e1a0 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2e1b0 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Res);.    }else{
2e1c0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2e1d0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
2e1e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2e1f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2e200 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
2e210 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
2e220 65 73 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  es){.  assert( c
2e230 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
2e240 64 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  d(pCur) );.  ass
2e250 65 72 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a  ert( pRes!=0 );.
2e260 20 20 61 73 73 65 72 74 28 20 2a 70 52 65 73 3d    assert( *pRes=
2e270 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29  =0 || *pRes==1 )
2e280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e290 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2e2a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2e2b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2e2c0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 70 43   *pRes = 0;.  pC
2e2d0 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20  ur->curFlags &= 
2e2e0 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54  ~(BTCF_AtLast|BT
2e2f0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
2e300 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a 20 20  F_ValidNKey);.  
2e310 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e320 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72   = 0;.  if( pCur
2e330 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2e340 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70 43 75  _VALID.   || pCu
2e350 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e360 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c 20 70  Page]==0.   || p
2e370 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
2e380 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66 3d 3d  ->iPage]->leaf==
2e390 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  0.  ){.    retur
2e3a0 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75 73 28  n btreePrevious(
2e3b0 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 7d  pCur, pRes);.  }
2e3c0 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  .  pCur->aiIdx[p
2e3d0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
2e3e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2e3f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  K;.}../*.** Allo
2e400 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  cate a new page 
2e410 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
2e420 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
2e430 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d 61  e new page is ma
2e440 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20 20  rked as dirty.  
2e450 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
2e460 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2e470 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65  te().** has alre
2e480 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2e490 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 2e  on the new page.
2e4a0 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  )  The new page 
2e4b0 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e  has also.** been
2e4c0 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64 20   referenced and 
2e4d0 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  the calling rout
2e4e0 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ine is responsib
2e4f0 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a  le for calling.*
2e500 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  * sqlite3PagerUn
2e510 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  ref() on the new
2e520 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69 73   page when it is
2e530 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c   done..**.** SQL
2e540 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2e550 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20  ed on success.  
2e560 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72 6e  Any other return
2e570 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65 73   value indicates
2e580 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a  .** an error.  *
2e590 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  ppPage is set to
2e5a0 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65 76 65   NULL in the eve
2e5b0 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
2e5c0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
2e5d0 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
2e5e0 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
2e5f0 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  n effort is made
2e600 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
2e610 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
2e620 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
2e630 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
2e640 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
2e650 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
2e660 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
2e670 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
2e680 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
2e690 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
2e6a0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
2e6b0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
2e6c0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
2e6d0 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f 64 65  .** If the eMode
2e6e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 42 54   parameter is BT
2e6f0 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64 20  ALLOC_EXACT and 
2e700 74 68 65 20 6e 65 61 72 62 79 20 70 61 67 65 20  the nearby page 
2e710 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77 68 65  exists.** anywhe
2e720 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  re on the free-l
2e730 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ist, then it is 
2e740 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
2e750 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 0a 2a   returned.  If.*
2e760 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  * eMode is BTALL
2e770 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65 20 70  OC_LT then the p
2e780 61 67 65 20 72 65 74 75 72 6e 65 64 20 77 69 6c  age returned wil
2e790 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f  l be less than o
2e7a0 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 6e 65  r equal.** to ne
2e7b0 61 72 62 79 20 69 66 20 61 6e 79 20 73 75 63 68  arby if any such
2e7c0 20 70 61 67 65 20 65 78 69 73 74 73 2e 20 20 49   page exists.  I
2e7d0 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41 4c 4c  f eMode is BTALL
2e7e0 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68 65 72  OC_ANY then ther
2e7f0 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65 73 74  e.** are no rest
2e800 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68 69 63  rictions on whic
2e810 68 20 70 61 67 65 20 69 73 20 72 65 74 75 72 6e  h page is return
2e820 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2e830 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  t allocateBtreeP
2e840 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
2e850 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pBt,         /*
2e860 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
2e870 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
2e880 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20  ,      /* Store 
2e890 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
2e8a0 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 65  llocated page he
2e8b0 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  re */.  Pgno *pP
2e8c0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
2e8d0 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61 67 65  * Store the page
2e8e0 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a   number here */.
2e8f0 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 20 20    Pgno nearby,  
2e900 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72           /* Sear
2e910 63 68 20 66 6f 72 20 61 20 70 61 67 65 20 6e 65  ch for a page ne
2e920 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  ar this one */. 
2e930 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20 20 20   u8 eMode       
2e940 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41 4c 4c          /* BTALL
2e950 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c 4c 4f  OC_EXACT, BTALLO
2e960 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c 4f 43  C_LT, or BTALLOC
2e970 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  _ANY */.){.  Mem
2e980 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20  Page *pPage1;.  
2e990 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6e 3b  int rc;.  u32 n;
2e9a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e9b0 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  f pages on the f
2e9c0 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75 33 32  reelist */.  u32
2e9d0 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   k;     /* Numbe
2e9e0 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74  r of leaves on t
2e9f0 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20  he trunk of the 
2ea00 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65  freelist */.  Me
2ea10 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
2ea20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  0;.  MemPage *pP
2ea30 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
2ea40 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20 20 20  Pgno mxPage;    
2ea50 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f   /* Total size o
2ea60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2ea70 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ile */..  assert
2ea80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2ea90 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2eaa0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4d   );.  assert( eM
2eab0 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41 4e 59  ode==BTALLOC_ANY
2eac0 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20 26 26   || (nearby>0 &&
2ead0 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74   IfNotOmitAV(pBt
2eae0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29 20 29  ->autoVacuum)) )
2eaf0 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70 42 74  ;.  pPage1 = pBt
2eb00 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78 50 61  ->pPage1;.  mxPa
2eb10 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 63 6f  ge = btreePageco
2eb20 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a 20 45  unt(pBt);.  /* E
2eb30 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 35  VIDENCE-OF: R-05
2eb40 31 31 39 2d 30 32 36 33 37 20 54 68 65 20 34 2d  119-02637 The 4-
2eb50 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20  byte big-endian 
2eb60 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
2eb70 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72 65 73  t 36.  ** stores
2eb80 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f 74 61   stores the tota
2eb90 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
2eba0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2ebb0 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65 74 34  t. */.  n = get4
2ebc0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2ebd0 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65 73 74  ata[36]);.  test
2ebe0 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67 65 2d  case( n==mxPage-
2ebf0 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d 6d 78  1 );.  if( n>=mx
2ec00 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Page ){.    retu
2ec10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
2ec20 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66  T_BKPT;.  }.  if
2ec30 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( n>0 ){.    /* 
2ec40 54 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20  There are pages 
2ec50 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
2ec60 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74    Reuse one of t
2ec70 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20  hose pages. */. 
2ec80 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a     Pgno iTrunk;.
2ec90 20 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73      u8 searchLis
2eca0 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65  t = 0; /* If the
2ecb0 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20   free-list must 
2ecc0 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
2ecd0 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20  'nearby' */.    
2ece0 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20 30 3b  u32 nSearch = 0;
2ecf0 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 74     /* Count of t
2ed00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 61  he number of sea
2ed10 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a 2f 0a  rch attempts */.
2ed20 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65      .    /* If e
2ed30 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45 58  Mode==BTALLOC_EX
2ed40 41 43 54 20 61 6e 64 20 61 20 71 75 65 72 79 20  ACT and a query 
2ed50 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
2ed60 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
2ed70 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
2ed80 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
2ed90 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
2eda0 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
2edb0 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
2edc0 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
2edd0 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
2ede0 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
2edf0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2ee00 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2ee10 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 45  eMode==BTALLOC_E
2ee20 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20 69 66  XACT ){.      if
2ee30 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61 67 65  ( nearby<=mxPage
2ee40 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65   ){.        u8 e
2ee50 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 61 73  Type;.        as
2ee60 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30 20 29  sert( nearby>0 )
2ee70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2ee80 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2ee90 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  m );.        rc 
2eea0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
2eeb0 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
2eec0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
2eed0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2eee0 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 54 79  .        if( eTy
2eef0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
2ef00 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AGE ){.         
2ef10 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b   searchList = 1;
2ef20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ef30 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
2ef40 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2ef50 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65 61 72  LE ){.      sear
2ef60 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20  chList = 1;.    
2ef70 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
2ef80 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Decrement the f
2ef90 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62  ree-list count b
2efa0 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20  y 1. Set iTrunk 
2efb0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
2efc0 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74  the.    ** first
2efd0 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b   free-list trunk
2efe0 20 70 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e   page. iPrevTrun
2eff0 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31  k is initially 1
2f000 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
2f010 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2f020 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
2f030 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2f040 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2f050 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
2f060 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e  e1->aData[36], n
2f070 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  -1);..    /* The
2f080 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69   code within thi
2f090 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e  s loop is run on
2f0a0 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27  ly once if the '
2f0b0 73 65 61 72 63 68 4c 69 73 74 27 20 76 61 72 69  searchList' vari
2f0c0 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e  able.    ** is n
2f0d0 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69  ot true. Otherwi
2f0e0 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65  se, it runs once
2f0f0 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d   for each trunk-
2f100 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20  page on the.    
2f110 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74  ** free-list unt
2f120 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e 65 61  il the page 'nea
2f130 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20  rby' is located 
2f140 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f  (eMode==BTALLOC_
2f150 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20 6f 72  EXACT).    ** or
2f160 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20 6c 65   until a page le
2f170 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62 79 27  ss than 'nearby'
2f180 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f   is located (eMo
2f190 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54 29 0a  de==BTALLOC_LT).
2f1a0 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a      */.    do {.
2f1b0 20 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b        pPrevTrunk
2f1c0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2f1d0 20 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20   if( pPrevTrunk 
2f1e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 56  ){.        /* EV
2f1f0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 35  IDENCE-OF: R-015
2f200 30 36 2d 31 31 30 35 33 20 54 68 65 20 66 69 72  06-11053 The fir
2f210 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20  st integer on a 
2f220 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2f230 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  age.        ** i
2f240 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
2f250 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72  r of the next fr
2f260 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f270 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 6f 72  e in the list or
2f280 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f  .        ** zero
2f290 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
2f2a0 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20 74 72  last freelist tr
2f2b0 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  unk page. */.   
2f2c0 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65       iTrunk = ge
2f2d0 74 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75  t4byte(&pPrevTru
2f2e0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20  nk->aData[0]);. 
2f2f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f300 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
2f310 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33 37 39  OF: R-59841-1379
2f320 38 20 54 68 65 20 34 2d 62 79 74 65 20 62 69 67  8 The 4-byte big
2f330 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
2f340 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20 20 20  at offset 32.   
2f350 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73 20 74       ** stores t
2f360 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
2f370 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
2f380 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74   of the freelist
2f390 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20 20 20  , or zero if.   
2f3a0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72 65 65       ** the free
2f3b0 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e 20 2a  list is empty. *
2f3c0 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  /.        iTrunk
2f3d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2f3e0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b  ge1->aData[32]);
2f3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74  .      }.      t
2f400 65 73 74 63 61 73 65 28 20 69 54 72 75 6e 6b 3d  estcase( iTrunk=
2f410 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
2f420 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78 50 61   if( iTrunk>mxPa
2f430 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b 2b 20  ge || nSearch++ 
2f440 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72  > n ){.        r
2f450 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2f460 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
2f470 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
2f480 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
2f490 64 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  dPage(pBt, iTrun
2f4a0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
2f4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f4c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2f4d0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20  pTrunk = 0;.    
2f4e0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
2f4f0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
2f500 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
2f510 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b 0a 20  ( pTrunk!=0 );. 
2f520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
2f530 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20 29 3b  unk->aData!=0 );
2f540 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
2f550 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33 2d 30  CE-OF: R-13523-0
2f560 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e 64 20  4394 The second 
2f570 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66 72 65  integer on a fre
2f580 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  elist trunk page
2f590 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
2f5a0 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
2f5b0 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20 74 6f  page pointers to
2f5c0 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20 20 20   follow. */.    
2f5d0 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
2f5e0 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
2f5f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
2f600 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
2f610 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
2f620 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
2f630 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
2f640 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
2f650 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
2f660 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
2f670 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
2f680 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
2f690 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
2f6a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
2f6b0 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
2f6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2f6d0 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
2f6e0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2f6f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
2f700 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
2f710 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
2f720 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
2f730 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2f740 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
2f750 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
2f760 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
2f770 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
2f780 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
2f790 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2f7a0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
2f7b0 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2f7c0 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
2f7d0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
2f7e0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
2f7f0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
2f800 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
2f810 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
2f820 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75 33 32  }else if( k>(u32
2f830 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  )(pBt->usableSiz
2f840 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20 20 20  e/4 - 2) ){.    
2f850 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
2f860 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  k is out of rang
2f870 65 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72  e.  Database cor
2f880 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruption */.     
2f890 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
2f8a0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
2f8b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2f8c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66  locate_page;.#if
2f8d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f8e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
2f8f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72    }else if( sear
2f900 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
2f910 20 20 20 20 26 26 20 28 6e 65 61 72 62 79 3d 3d      && (nearby==
2f920 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72 75 6e  iTrunk || (iTrun
2f930 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d 6f 64  k<nearby && eMod
2f940 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20  e==BTALLOC_LE)) 
2f950 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
2f960 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 73    /* The list is
2f970 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 20   being searched 
2f980 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20 70  and this trunk p
2f990 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65 0a  age is the page.
2f9a0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c          ** to al
2f9b0 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c 65  locate, regardle
2f9c0 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69 74  ss of whether it
2f9d0 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20 20   has leaves..   
2f9e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2f9f0 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
2fa00 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
2fa10 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
2fa20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2fa30 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2fa40 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2fa50 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
2fa60 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2fa70 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2fa80 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
2fa90 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
2faa0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d  }.        if( k=
2fab0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2fac0 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20  if( !pPrevTrunk 
2fad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
2fae0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
2faf0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
2fb00 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2fb10 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2fb20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
2fb30 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2fb40 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
2fb50 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
2fb60 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
2fb70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2fb80 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
2fb90 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
2fba0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
2fbc0 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
2fbd0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
2fbe0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
2fbf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2fc00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fc10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
2fc20 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
2fc30 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
2fc40 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
2fc50 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
2fc60 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
2fc70 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
2fc80 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
2fc90 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
2fca0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
2fcb0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
2fcc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fcd0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
2fce0 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
2fcf0 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
2fd00 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
2fd10 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
2fd20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4e            if( iN
2fd30 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65 20 29  ewTrunk>mxPage )
2fd40 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  { .            r
2fd50 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
2fd60 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2fd70 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2fd80 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2fd90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2fda0 20 20 20 74 65 73 74 63 61 73 65 28 20 69 4e 65     testcase( iNe
2fdb0 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65 20 29  wTrunk==mxPage )
2fdc0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
2fdd0 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
2fde0 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
2fdf0 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
2fe00 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
2fe10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fe20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
2fe30 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
2fe40 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
2fe50 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
2fe60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fe70 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
2fe80 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2fe90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fea0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2feb0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2fec0 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
2fed0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2fee0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
2fef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ff00 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2ff10 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
2ff20 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2ff30 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2ff40 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
2ff50 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
2ff60 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
2ff70 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
2ff80 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
2ff90 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
2ffa0 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
2ffb0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2ffc0 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
2ffd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
2ffe0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
2fff0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
30000 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
30010 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 31 2d  riteable(pPage1-
30020 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
30030 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
30040 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
30050 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
30060 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
30070 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
30080 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30090 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
300a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
300b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
300c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
300d0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
300e0 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
300f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30100 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
30110 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
30120 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
30130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30140 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
30150 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
30160 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
30170 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
30180 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
30190 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
301a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
301b0 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20 29 7b  }else if( k>0 ){
301c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72  .        /* Extr
301d0 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d 20  act a leaf from 
301e0 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  the trunk */.   
301f0 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65 73 74       u32 closest
30200 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
30210 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75 6e  Page;.        un
30220 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
30230 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61  ta = pTrunk->aDa
30240 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ta;.        if( 
30250 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
30260 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20        u32 i;.   
30270 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
30280 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   0;.          if
30290 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
302a0 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _LE ){.         
302b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b     for(i=0; i<k;
302c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
302d0 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74       iPage = get
302e0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
302f0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  *4]);.          
30300 20 20 20 20 69 66 28 20 69 50 61 67 65 3c 3d 6e      if( iPage<=n
30310 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
30320 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
30330 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
30340 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
30350 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
30360 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
30370 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30380 20 20 20 20 20 20 20 20 69 6e 74 20 64 69 73 74          int dist
30390 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 69  ;.            di
303a0 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49  st = sqlite3AbsI
303b0 6e 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61  nt32(get4byte(&a
303c0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
303d0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
303e0 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b  for(i=1; i<k; i+
303f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
30400 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
30410 65 33 41 62 73 49 6e 74 33 32 28 67 65 74 34 62  e3AbsInt32(get4b
30420 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
30430 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20  ]) - nearby);.  
30440 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30450 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
30460 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
30470 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
30480 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
30490 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
304a0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
304b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
304c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
304d0 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
304e0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
304f0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
30500 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
30510 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
30520 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
30530 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a  Page==mxPage );.
30540 20 20 20 20 20 20 20 20 69 66 28 20 69 50 61 67          if( iPag
30550 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20  e>mxPage ){.    
30560 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30570 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
30580 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
30590 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
305a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
305b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 50      testcase( iP
305c0 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20  age==mxPage );. 
305d0 20 20 20 20 20 20 20 69 66 28 20 21 73 65 61 72         if( !sear
305e0 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20 20 20  chList .        
305f0 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65 61 72   || (iPage==near
30600 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e 65 61  by || (iPage<nea
30610 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54  rby && eMode==BT
30620 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20  ALLOC_LE)) .    
30630 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
30640 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a   int noContent;.
30650 20 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f            *pPgno
30660 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20   = iPage;.      
30670 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f      TRACE(("ALLO
30680 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65 61  CATE: %d was lea
30690 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74 72  f %d of %d on tr
306a0 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20 20  unk %d".        
306b0 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20 6d           ": %d m
306c0 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c 6e  ore free pages\n
306d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
306e0 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f 73      *pPgno, clos
306f0 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e 6b  est+1, k, pTrunk
30700 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20  ->pgno, n-1));. 
30710 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30720 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
30730 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
30740 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30750 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61 6c  rc ) goto end_al
30760 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
30770 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65         if( close
30780 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20 20 20  st<k-1 ){.      
30790 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 61 44        memcpy(&aD
307a0 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d  ata[8+closest*4]
307b0 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c  , &aData[4+k*4],
307c0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
307d0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
307e0 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c 20 6b  yte(&aData[4], k
307f0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  -1);.          n
30800 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72 65  oContent = !btre
30810 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28 70  eGetHasContent(p
30820 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50 41 47  Bt, *pPgno)? PAG
30830 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
30840 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   : 0;.          
30850 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
30860 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50  sedPage(pBt, *pP
30870 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43  gno, ppPage, noC
30880 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  ontent);.       
30890 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
308a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
308b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
308c0 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
308d0 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
308e0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
308f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
30910 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
30920 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
30930 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a     *ppPage = 0;.
30940 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
30950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30960 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
30970 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
30980 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
30990 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
309a0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
309b0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
309c0 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
309d0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
309e0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
309f0 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
30a00 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70 70 65  reelist, so appe
30a10 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  nd a new page to
30a20 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
30a30 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20 20 20  base image..    
30a40 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d 61 6c  **.    ** Normal
30a50 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20 61 6c  ly, new pages al
30a60 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20  located by this 
30a70 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72 65 71  block can be req
30a80 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 0a  uested from the.
30a90 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c 61 79      ** pager lay
30aa0 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f 2d  er with the 'no-
30ab0 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73 65  content' flag se
30ac0 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e 74 73  t. This prevents
30ad0 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20 2a   the pager.    *
30ae0 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f  * from trying to
30af0 20 72 65 61 64 20 74 68 65 20 70 61 67 65 73 20   read the pages 
30b00 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73  content from dis
30b10 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
30b20 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
30b30 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  t transaction ha
30b40 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20 6f 6e  s already run on
30b50 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72 65 6d  e or more increm
30b60 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20 20 20  ental-vacuum.   
30b70 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65 6e 20   ** steps, then 
30b80 74 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20  the page we are 
30b90 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63 61 74  about to allocat
30ba0 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 63 6f  e may contain co
30bb0 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  ntent.    ** tha
30bc0 74 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e  t is required in
30bd0 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20   the event of a 
30be0 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74 68 69  rollback. In thi
30bf0 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20 20 2a  s case, do.    *
30c00 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20 6e 6f  * not set the no
30c10 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e 20 54  -content flag. T
30c20 68 69 73 20 63 61 75 73 65 73 20 74 68 65 20 70  his causes the p
30c30 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61 6e 64  ager to load and
30c40 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20   journal.    ** 
30c50 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
30c60 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72 65 20   content before 
30c70 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74 2e 0a  overwriting it..
30c80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
30c90 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
30ca0 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74 75 61  r will not actua
30cb0 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c  lly attempt to l
30cc0 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 0a  oad or journal .
30cd0 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 20 66      ** content f
30ce0 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68 61 74  or any page that
30cf0 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c 69 65   really does lie
30d00 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
30d10 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
30d20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64 69 73    ** file on dis
30d30 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65 63 74  k. So the effect
30d40 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67 20 74  s of disabling t
30d50 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20 6f 70  he no-content op
30d60 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a  timization.    *
30d70 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e 66 69  * here are confi
30d80 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70 61 67  ned to those pag
30d90 65 73 20 74 68 61 74 20 6c 69 65 20 62 65 74 77  es that lie betw
30da0 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66 20 74  een the end of t
30db0 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
30dc0 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74 68 65  se image and the
30dd0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
30de0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
30df0 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43 6f 6e  /.    int bNoCon
30e00 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e 6f 74  tent = (0==IfNot
30e10 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54  OmitAV(pBt->bDoT
30e20 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47 45 52  runcate))? PAGER
30e30 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 3a 30  _GET_NOCONTENT:0
30e40 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ;..    rc = sqli
30e50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
30e60 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
30e70 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ge);.    if( rc 
30e80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
30e90 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20   pBt->nPage++;. 
30ea0 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
30eb0 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
30ec0 50 41 47 45 28 70 42 74 29 20 29 20 70 42 74 2d  PAGE(pBt) ) pBt-
30ed0 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66 6e 64  >nPage++;..#ifnd
30ee0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
30ef0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
30f00 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
30f10 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41  m && PTRMAP_ISPA
30f20 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61  GE(pBt, pBt->nPa
30f30 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ge) ){.      /* 
30f40 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73  If *pPgno refers
30f50 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   to a pointer-ma
30f60 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65  p page, allocate
30f70 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20   two new pages. 
30f80 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65       ** at the e
30f90 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
30fa0 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54  nstead of one. T
30fb0 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74  he first allocat
30fc0 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  ed page.      **
30fd0 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70   becomes a new p
30fe0 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
30ff0 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75   the second is u
31000 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  sed by the calle
31010 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  r..      */.    
31020 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 20 3d    MemPage *pPg =
31030 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28   0;.      TRACE(
31040 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66  ("ALLOCATE: %d f
31050 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20  rom end of file 
31060 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67  (pointer-map pag
31070 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50 61 67  e)\n", pBt->nPag
31080 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e));.      asser
31090 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 50  t( pBt->nPage!=P
310a0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
310b0 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 72  (pBt) );.      r
310c0 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73  c = btreeGetUnus
310d0 65 64 50 61 67 65 28 70 42 74 2c 20 70 42 74 2d  edPage(pBt, pBt-
310e0 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20 62 4e  >nPage, &pPg, bN
310f0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
31100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31110 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
31120 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
31130 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50 61 67  rite(pPg->pDbPag
31140 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  e);.        rele
31150 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a 20 20  asePage(pPg);.  
31160 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31170 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31180 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
31190 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  ++;.      if( pB
311a0 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44 49 4e  t->nPage==PENDIN
311b0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
311c0 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b   ){ pBt->nPage++
311d0 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
311e0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 32 38  .    put4byte(28
311f0 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70 50 61   + (u8*)pBt->pPa
31200 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  ge1->aData, pBt-
31210 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a 70 50  >nPage);.    *pP
31220 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61 67 65  gno = pBt->nPage
31230 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  ;..    assert( *
31240 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  pPgno!=PENDING_B
31250 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
31260 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
31270 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
31280 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
31290 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  , bNoContent);. 
312a0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
312b0 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
312c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
312d0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
312e0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
312f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31300 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
31310 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
31320 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
31330 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
31340 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72  "ALLOCATE: %d fr
31350 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e  om end of file\n
31360 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d  ", *pPgno));.  }
31370 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 50 67  ..  assert( *pPg
31380 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
31390 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 65  _PAGE(pBt) );..e
313a0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
313b0 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  :.  releasePage(
313c0 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61  pTrunk);.  relea
313d0 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e  sePage(pPrevTrun
313e0 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  k);.  assert( rc
313f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
31400 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
31410 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65  efcount((*ppPage
31420 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31 20 29  )->pDbPage)<=1 )
31430 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
31440 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 2a 70  SQLITE_OK || (*p
31450 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d  pPage)->isInit==
31460 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  0 );.  return rc
31470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
31480 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
31490 20 74 6f 20 61 64 64 20 70 61 67 65 20 69 50 61   to add page iPa
314a0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
314b0 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c 69 73  se file free-lis
314c0 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61 73 73  t. .** It is ass
314d0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 70 61  umed that the pa
314e0 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  ge is not alread
314f0 79 20 61 20 70 61 72 74 20 6f 66 20 74 68 65 20  y a part of the 
31500 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  free-list..**.**
31510 20 54 68 65 20 76 61 6c 75 65 20 70 61 73 73 65   The value passe
31520 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
31530 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
31540 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 70 74   function is opt
31550 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74 68 65  ional..** If the
31560 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e 73 20   caller happens 
31570 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e 74 65  to have a pointe
31580 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  r to the MemPage
31590 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f 72 72   object .** corr
315a0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 61 67  esponding to pag
315b0 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c 20 69  e iPage handy, i
315c0 74 20 6d 61 79 20 70 61 73 73 20 69 74 20 61 73  t may pass it as
315d0 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61 6c 75   the second valu
315e0 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  e. .** Otherwise
315f0 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20 4e 55  , it may pass NU
31600 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 70  LL..**.** If a p
31610 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65 6d 50  ointer to a MemP
31620 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20 70 61  age object is pa
31630 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
31640 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
31650 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
31660 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74 65 72  unt is not alter
31670 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
31680 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
31690 6e 74 20 66 72 65 65 50 61 67 65 32 28 42 74 53  nt freePage2(BtS
316a0 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65 6d 50  hared *pBt, MemP
316b0 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c 20 50  age *pMemPage, P
316c0 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20 4d 65  gno iPage){.  Me
316d0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20  mPage *pTrunk = 
316e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
316f0 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74 20 74    /* Free-list t
31700 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20 20 50  runk page */.  P
31710 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30 3b 20  gno iTrunk = 0; 
31720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31730 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
31740 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74 20 74  r of free-list t
31750 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a 20 20  runk page */ .  
31760 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20  MemPage *pPage1 
31770 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 20 20  = pBt->pPage1;  
31780 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72 65 66      /* Local ref
31790 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31  erence to page 1
317a0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
317b0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
317c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
317d0 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e 20 4d  e being freed. M
317e0 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20  ay be NULL. */. 
317f0 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43       /* Return C
31820 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ode */.  int nFr
31830 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31850 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
31860 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65 65 2d  f pages on free-
31870 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
31880 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
31890 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
318a0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
318b0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69 50 61  ORRUPT_DB || iPa
318c0 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65 72 74  ge>1 );.  assert
318d0 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c 20 70  ( !pMemPage || p
318e0 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 69  MemPage->pgno==i
318f0 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28 20 69  Page );..  if( i
31900 50 61 67 65 3c 32 20 29 20 72 65 74 75 72 6e 20  Page<2 ) return 
31910 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
31920 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65 6d 50  KPT;.  if( pMemP
31930 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
31940 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20   = pMemPage;.   
31950 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
31960 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
31970 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
31980 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
31990 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67  Lookup(pBt, iPag
319a0 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e  e);.  }..  /* In
319b0 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65  crement the free
319c0 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70   page count on p
319d0 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20  Page1 */.  rc = 
319e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
319f0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
31a00 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
31a10 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31a20 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34  ;.  nFree = get4
31a30 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31a40 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34  ata[36]);.  put4
31a50 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31a60 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31  ata[36], nFree+1
31a70 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 62  );..  if( pBt->b
31a80 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53 45  tsFlags & BTS_SE
31a90 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  CURE_DELETE ){. 
31aa0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 65 63     /* If the sec
31ab0 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74 69 6f  ure_delete optio
31ac0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
31ad0 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73  en.    ** always
31ae0 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
31af0 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
31b00 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
31b10 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31b20 28 21 70 50 61 67 65 20 26 26 20 28 28 72 63 20  (!pPage && ((rc 
31b30 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70  = btreeGetPage(p
31b40 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
31b50 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20 20 20  e, 0))!=0) ).   
31b60 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20 20 20    ||            
31b70 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  ((rc = sqlite3Pa
31b80 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
31b90 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a 20 20  pDbPage))!=0).  
31ba0 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20    ){.      goto 
31bb0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
31bc0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
31bd0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
31be0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
31bf0 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Size);.  }..  /*
31c00 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
31c10 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
31c20 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20  acuum, write an 
31c30 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69  entry in the poi
31c40 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f  nter-map.  ** to
31c50 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
31c60 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e  he page is free.
31c70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55  .  */.  if( ISAU
31c80 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
31c90 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 69  ptrmapPut(pBt, i
31ca0 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46 52 45  Page, PTRMAP_FRE
31cb0 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29 3b 0a  EPAGE, 0, &rc);.
31cc0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
31cd0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31ce0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61    }..  /* Now ma
31cf0 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74  nipulate the act
31d00 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65  ual database fre
31d10 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65  e-list structure
31d20 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a  . There are two.
31d30 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69    ** possibiliti
31d40 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d  es. If the free-
31d50 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c  list is currentl
31d60 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74  y empty, or if t
31d70 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72  he first.  ** tr
31d80 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20  unk page in the 
31d90 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
31da0 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  l, then this pag
31db0 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a  e will become a.
31dc0 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69    ** new free-li
31dd0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f  st trunk page. O
31de0 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c  therwise, it wil
31df0 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20  l become a leaf 
31e00 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73  of the.  ** firs
31e10 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20  t trunk page in 
31e20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65  the current free
31e30 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63  -list. This bloc
31e40 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20  k tests if it.  
31e50 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  ** is possible t
31e60 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61  o add the page a
31e70 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73  s a new free-lis
31e80 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69  t leaf..  */.  i
31e90 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20  f( nFree!=0 ){. 
31ea0 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20 20 20     u32 nLeaf;   
31eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ec0 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f  Initial number o
31ed0 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20  f leaf cells on 
31ee0 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20  trunk page */.. 
31ef0 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
31f00 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
31f10 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63  ata[32]);.    rc
31f20 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65 28   = btreeGetPage(
31f30 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
31f40 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
31f50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31f60 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 72  ){.      goto fr
31f70 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  eepage_out;.    
31f80 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d 20 67  }..    nLeaf = g
31f90 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
31fa0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
31fb0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61  assert( pBt->usa
31fc0 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a 20 20  bleSize>32 );.  
31fd0 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20 28 75    if( nLeaf > (u
31fe0 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  32)pBt->usableSi
31ff0 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20 20 20  ze/4 - 2 ){.    
32000 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
32010 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
32020 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
32030 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  out;.    }.    i
32040 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33 32 29  f( nLeaf < (u32)
32050 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
32060 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
32070 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
32080 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f 6e 20  here is room on 
32090 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 74  the trunk page t
320a0 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70 61 67  o insert the pag
320b0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67  e.      ** being
320c0 20 66 72 65 65 64 20 61 73 20 61 20 6e 65 77 20   freed as a new 
320d0 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  leaf..      **. 
320e0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
320f0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
32100 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 66   is not really f
32110 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63 6f 6e  ull until it con
32120 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a 20 75  tains.      ** u
32130 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20  sableSize/4 - 2 
32140 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75 73 61  entries, not usa
32150 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e  bleSize/4 - 8 en
32160 74 72 69 65 73 20 61 73 20 77 65 20 68 61 76 65  tries as we have
32170 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 64 2e  .      ** coded.
32180 20 20 42 75 74 20 64 75 65 20 74 6f 20 61 20 63    But due to a c
32190 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e 20 76  oding error in v
321a0 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74  ersions of SQLit
321b0 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20 20 20  e prior to.     
321c0 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74 61 62   ** 3.6.0, datab
321d0 61 73 65 73 20 77 69 74 68 20 66 72 65 65 6c 69  ases with freeli
321e0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73 20 68  st trunk pages h
321f0 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e  olding more than
32200 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
32210 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69  Size/4 - 8 entri
32220 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6f 72  es will be repor
32230 74 65 64 20 61 73 20 63 6f 72 72 75 70 74 2e 20  ted as corrupt. 
32240 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20   In order.      
32250 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e 20 62  ** to maintain b
32260 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
32270 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c 64 65  bility with olde
32280 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51  r versions of SQ
32290 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a 20 77  Lite,.      ** w
322a0 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20  e will continue 
322b0 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65 20  to restrict the 
322c0 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
322d0 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65 2f  s to usableSize/
322e0 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20 66  4 - 8.      ** f
322f0 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d 65  or now.  At some
32300 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
32310 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72 79  ture (once every
32320 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65 64  one has upgraded
32330 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e 36  .      ** to 3.6
32340 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65 20  .0 or later) we 
32350 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72 20  should consider 
32360 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64 69  fixing the condi
32370 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20 20  tional above.   
32380 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22 75     ** to read "u
32390 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20 69  sableSize/4-2" i
323a0 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62 6c  nstead of "usabl
323b0 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20 20  eSize/4-8"..    
323c0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 56    **.      ** EV
323d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 39 39  IDENCE-OF: R-199
323e0 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76 65 72  20-11576 However
323f0 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  , newer versions
32400 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69 6c 6c   of SQLite still
32410 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69 64 20  .      ** avoid 
32420 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74 20 73  using the last s
32430 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ix entries in th
32440 65 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  e freelist trunk
32450 20 70 61 67 65 20 61 72 72 61 79 20 69 6e 0a 20   page array in. 
32460 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 74 68       ** order th
32470 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  at database file
32480 73 20 63 72 65 61 74 65 64 20 62 79 20 6e 65 77  s created by new
32490 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  er versions of S
324a0 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20 20 20  QLite can be.   
324b0 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20 6f 6c     ** read by ol
324c0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
324d0 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 2a 2f  SQLite..      */
324e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
324f0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
32500 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
32510 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
32520 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
32530 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
32540 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6e  unk->aData[4], n
32550 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20 20 20  Leaf+1);.       
32560 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75 6e   put4byte(&pTrun
32570 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65 61 66  k->aData[8+nLeaf
32580 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  *4], iPage);.   
32590 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 26       if( pPage &
325a0 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
325b0 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
325c0 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  LETE)==0 ){.    
325d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
325e0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
325f0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
32600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
32610 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43  c = btreeSetHasC
32620 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67  ontent(pBt, iPag
32630 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
32640 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
32650 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
32660 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
32670 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
32680 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
32690 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65     goto freepage
326a0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
326b0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
326c0 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70   flows to this p
326d0 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61  oint, then it wa
326e0 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74  s not possible t
326f0 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74  o add the.  ** t
32700 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
32710 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61  eed as a leaf pa
32720 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ge of the first 
32730 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65  trunk in the fre
32740 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73  e-list..  ** Pos
32750 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68  sibly because th
32760 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65  e free-list is e
32770 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c  mpty, or possibl
32780 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20  y because the . 
32790 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20   ** first trunk 
327a0 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  in the free-list
327b0 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72   is full. Either
327c0 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62   way, the page b
327d0 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20  eing freed.  ** 
327e0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
327f0 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20  new first trunk 
32800 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65  page in the free
32810 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  -list..  */.  if
32820 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20 53 51  ( pPage==0 && SQ
32830 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 62  LITE_OK!=(rc = b
32840 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
32850 20 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20   iPage, &pPage, 
32860 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  0)) ){.    goto 
32870 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
32880 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
32890 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
328a0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
328b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
328c0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72 65 65  ){.    goto free
328d0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
328e0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
328f0 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29 3b 0a  aData, iTrunk);.
32900 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
32910 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30 29 3b  e->aData[4], 0);
32920 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
32930 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
32940 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43 45 28  iPage);.  TRACE(
32950 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
32960 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72  new trunk page r
32970 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 20  eplacing %d\n", 
32980 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69 54 72  pPage->pgno, iTr
32990 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61 67 65  unk));..freepage
329a0 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50 61 67  _out:.  if( pPag
329b0 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e ){.    pPage->
329c0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
329d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
329e0 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  age);.  releaseP
329f0 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
32a00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74  eturn rc;.}.stat
32a10 69 63 20 76 6f 69 64 20 66 72 65 65 50 61 67 65  ic void freePage
32a20 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
32a30 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 69 66   int *pRC){.  if
32a40 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49 54 45  ( (*pRC)==SQLITE
32a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  _OK ){.    *pRC 
32a60 3d 20 66 72 65 65 50 61 67 65 32 28 70 50 61 67  = freePage2(pPag
32a70 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70  e->pBt, pPage, p
32a80 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d  Page->pgno);.  }
32a90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
32aa0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
32ab0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
32ac0 68 20 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c  h the given Cell
32ad0 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
32ae0 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a 65 20  local Cell size 
32af0 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62  (the number of b
32b00 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72 69 67  ytes on the orig
32b10 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69 74 74  inal page, omitt
32b20 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f 77 29  ing.** overflow)
32b30 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e 0a 2a   into *pnSize..*
32b40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
32b50 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  arCell(.  MemPag
32b60 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
32b70 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
32b80 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
32b90 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   Cell */.  unsig
32ba0 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
32bb0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
32bc0 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20 2a 2f  e of the Cell */
32bd0 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65 20 20  .  u16 *pnSize  
32be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
32bf0 72 69 74 65 20 74 68 65 20 73 69 7a 65 20 6f 66  rite the size of
32c00 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65 20 2a   the Cell here *
32c10 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
32c20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
32c30 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  t;.  CellInfo in
32c40 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50  fo;.  Pgno ovflP
32c50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gno;.  int rc;. 
32c60 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 75 33   int nOvfl;.  u3
32c70 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a  2 ovflPageSize;.
32c80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
32c90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
32ca0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
32cb0 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61   );.  pPage->xPa
32cc0 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  rseCell(pPage, p
32cd0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
32ce0 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e  *pnSize = info.n
32cf0 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e 66 6f  Size;.  if( info
32d00 2e 6e 4c 6f 63 61 6c 3d 3d 69 6e 66 6f 2e 6e 50  .nLocal==info.nP
32d10 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 72 65  ayload ){.    re
32d20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
32d30 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
32d40 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
32d50 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
32d60 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  hing */.  }.  if
32d70 28 20 70 43 65 6c 6c 2b 69 6e 66 6f 2e 6e 53 69  ( pCell+info.nSi
32d80 7a 65 2d 31 20 3e 20 70 50 61 67 65 2d 3e 61 44  ze-1 > pPage->aD
32d90 61 74 61 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50  ata+pPage->maskP
32da0 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  age ){.    retur
32db0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
32dc0 5f 42 4b 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20  _BKPT;  /* Cell 
32dd0 65 78 74 65 6e 64 73 20 70 61 73 74 20 65 6e 64  extends past end
32de0 20 6f 66 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a   of page */.  }.
32df0 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
32e00 34 62 79 74 65 28 70 43 65 6c 6c 20 2b 20 69 6e  4byte(pCell + in
32e10 66 6f 2e 6e 53 69 7a 65 20 2d 20 34 29 3b 0a 20  fo.nSize - 4);. 
32e20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
32e30 61 62 6c 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a  ableSize > 4 );.
32e40 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d    ovflPageSize =
32e50 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32e60 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20   - 4;.  nOvfl = 
32e70 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d  (info.nPayload -
32e80 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f   info.nLocal + o
32e90 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29  vflPageSize - 1)
32ea0 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20  /ovflPageSize;. 
32eb0 20 61 73 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30   assert( nOvfl>0
32ec0 20 7c 7c 20 0a 20 20 20 20 28 43 4f 52 52 55 50   || .    (CORRUP
32ed0 54 5f 44 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50  T_DB && (info.nP
32ee0 61 79 6c 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67  ayload + ovflPag
32ef0 65 53 69 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53  eSize)<ovflPageS
32f00 69 7a 65 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c  ize).  );.  whil
32f10 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20  e( nOvfl-- ){.  
32f20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30    Pgno iNext = 0
32f30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  ;.    MemPage *p
32f40 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66  Ovfl = 0;.    if
32f50 28 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20  ( ovflPgno<2 || 
32f60 6f 76 66 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61  ovflPgno>btreePa
32f70 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
32f80 20 20 20 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f        /* 0 is no
32f90 74 20 61 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  t a legal page n
32fa0 75 6d 62 65 72 20 61 6e 64 20 70 61 67 65 20 31  umber and page 1
32fb0 20 63 61 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20   cannot be an . 
32fc0 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77       ** overflow
32fd0 20 70 61 67 65 2e 20 54 68 65 72 65 66 6f 72 65   page. Therefore
32fe0 20 69 66 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f   if ovflPgno<2 o
32ff0 72 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  r past the end o
33000 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  f the .      ** 
33010 66 69 6c 65 20 74 68 65 20 64 61 74 61 62 61 73  file the databas
33020 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70  e must be corrup
33030 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  t. */.      retu
33040 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
33050 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
33060 20 20 69 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20    if( nOvfl ){. 
33070 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
33080 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6f  rflowPage(pBt, o
33090 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c  vflPgno, &pOvfl,
330a0 20 26 69 4e 65 78 74 29 3b 0a 20 20 20 20 20 20   &iNext);.      
330b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
330c0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
330d0 66 28 20 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28  f( ( pOvfl || ((
330e0 70 4f 76 66 6c 20 3d 20 62 74 72 65 65 50 61 67  pOvfl = btreePag
330f0 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66  eLookup(pBt, ovf
33100 6c 50 67 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20  lPgno))!=0) ).  
33110 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
33120 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70  erPageRefcount(p
33130 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d  Ovfl->pDbPage)!=
33140 31 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  1.    ){.      /
33150 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 72 65  * There is no re
33160 61 73 6f 6e 20 61 6e 79 20 63 75 72 73 6f 72 20  ason any cursor 
33170 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6e 20 6f  should have an o
33180 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
33190 65 6e 63 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  ence .      ** t
331a0 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
331b0 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  ge belonging to 
331c0 61 20 63 65 6c 6c 20 74 68 61 74 20 69 73 20 62  a cell that is b
331d0 65 69 6e 67 20 64 65 6c 65 74 65 64 2f 75 70 64  eing deleted/upd
331e0 61 74 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53  ated..      ** S
331f0 6f 20 69 66 20 74 68 65 72 65 20 65 78 69 73 74  o if there exist
33200 73 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  s more than one 
33210 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 69  reference to thi
33220 73 20 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  s page, then it 
33230 0a 20 20 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e  .      ** must n
33240 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 61 6e 20  ot really be an 
33250 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 61 6e  overflow page an
33260 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  d the database m
33270 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
33280 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20  .      ** It is 
33290 68 65 6c 70 66 75 6c 20 74 6f 20 64 65 74 65 63  helpful to detec
332a0 74 20 74 68 69 73 20 62 65 66 6f 72 65 20 63 61  t this before ca
332b0 6c 6c 69 6e 67 20 66 72 65 65 50 61 67 65 32 28  lling freePage2(
332c0 29 2c 20 61 73 20 0a 20 20 20 20 20 20 2a 2a 20  ), as .      ** 
332d0 66 72 65 65 50 61 67 65 32 28 29 20 6d 61 79 20  freePage2() may 
332e0 7a 65 72 6f 20 74 68 65 20 70 61 67 65 20 63 6f  zero the page co
332f0 6e 74 65 6e 74 73 20 69 66 20 73 65 63 75 72 65  ntents if secure
33300 2d 64 65 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a  -delete mode is.
33310 20 20 20 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64        ** enabled
33320 2e 20 49 66 20 74 68 69 73 20 27 6f 76 65 72 66  . If this 'overf
33330 6c 6f 77 27 20 70 61 67 65 20 68 61 70 70 65 6e  low' page happen
33340 73 20 74 6f 20 62 65 20 61 20 70 61 67 65 20 74  s to be a page t
33350 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
33360 20 63 61 6c 6c 65 72 20 69 73 20 69 74 65 72 61   caller is itera
33370 74 69 6e 67 20 74 68 72 6f 75 67 68 20 6f 72 20  ting through or 
33380 75 73 69 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74  using in some ot
33390 68 65 72 20 77 61 79 2c 20 74 68 69 73 0a 20 20  her way, this.  
333a0 20 20 20 20 2a 2a 20 63 61 6e 20 62 65 20 70 72      ** can be pr
333b0 6f 62 6c 65 6d 61 74 69 63 2e 0a 20 20 20 20 20  oblematic..     
333c0 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
333d0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
333e0 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
333f0 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61       rc = freePa
33400 67 65 32 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20  ge2(pBt, pOvfl, 
33410 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  ovflPgno);.    }
33420 0a 0a 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20  ..    if( pOvfl 
33430 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
33440 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c  PagerUnref(pOvfl
33450 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
33460 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  }.    if( rc ) r
33470 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76  eturn rc;.    ov
33480 66 6c 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a  flPgno = iNext;.
33490 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
334a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
334b0 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
334c0 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
334d0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
334e0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
334f0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
33500 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
33510 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
33520 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
33530 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
33540 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
33550 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
33560 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
33570 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
33580 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
33590 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
335a0 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
335b0 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
335c0 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
335d0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
335e0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
335f0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
33600 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
33610 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
33620 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
33630 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
33640 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
33650 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
33660 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
33670 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
33680 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
33690 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
336a0 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
336b0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
336c0 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
336d0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
336e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
336f0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
33700 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
33710 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
33720 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
33730 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
33740 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
33750 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
33760 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
33770 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
33780 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
33790 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
337a0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
337b0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
337c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
337d0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
337e0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
337f0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
33800 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
33810 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
33820 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
33830 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
33840 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
33850 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
33860 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
33870 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
33880 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
33890 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
338a0 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
338b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
338c0 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
338d0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
338e0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
338f0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
33900 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
33910 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
33920 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
33930 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
33940 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
33950 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  ex) );..  /* pPa
33960 67 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  ge is not necess
33970 61 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20  arily writeable 
33980 73 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68  since pCell migh
33990 74 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20  t be auxiliary. 
339a0 20 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65   ** buffer space
339b0 20 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74   that is separat
339c0 65 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65  e from the pPage
339d0 20 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a   buffer area */.
339e0 20 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c    assert( pCell<
339f0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20  pPage->aData || 
33a00 70 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61  pCell>=&pPage->a
33a10 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69  Data[pBt->pageSi
33a20 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze].            
33a30 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  || sqlite3PagerI
33a40 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
33a50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
33a60 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
33a70 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
33a80 61 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68  ader = pPage->ch
33a90 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50  ildPtrSize;.  nP
33aa0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
33ab0 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
33ac0 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
33ad0 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b  ){.    nHeader +
33ae0 3d 20 70 75 74 56 61 72 69 6e 74 33 32 28 26 70  = putVarint32(&p
33af0 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e  Cell[nHeader], n
33b00 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73  Payload);.  }els
33b10 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  e{.    assert( n
33b20 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Data==0 );.    a
33b30 73 73 65 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20  ssert( nZero==0 
33b40 29 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  );.  }.  nHeader
33b50 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
33b60 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
33b70 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
33b80 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
33b90 65 20 70 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a  e payload size *
33ba0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  /.  if( pPage->i
33bb0 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
33bc0 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
33bd0 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
33be0 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
33bf0 6c 73 65 7b 20 0a 20 20 20 20 61 73 73 65 72 74  lse{ .    assert
33c00 28 20 6e 4b 65 79 3c 3d 30 78 37 66 66 66 66 66  ( nKey<=0x7fffff
33c10 66 66 20 26 26 20 70 4b 65 79 21 3d 30 20 29 3b  ff && pKey!=0 );
33c20 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20  .    nPayload = 
33c30 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70  (int)nKey;.    p
33c40 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
33c50 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79  nSrc = (int)nKey
33c60 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 79  ;.  }.  if( nPay
33c70 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78  load<=pPage->max
33c80 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d  Local ){.    n =
33c90 20 6e 48 65 61 64 65 72 20 2b 20 6e 50 61 79 6c   nHeader + nPayl
33ca0 6f 61 64 3b 0a 20 20 20 20 74 65 73 74 63 61 73  oad;.    testcas
33cb0 65 28 20 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74  e( n==3 );.    t
33cc0 65 73 74 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b  estcase( n==4 );
33cd0 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 20 6e  .    if( n<4 ) n
33ce0 20 3d 20 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a   = 4;.    *pnSiz
33cf0 65 20 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65  e = n;.    space
33d00 4c 65 66 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  Left = nPayload;
33d10 0a 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 43  .    pPrior = pC
33d20 65 6c 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ell;.  }else{.  
33d30 20 20 69 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65    int mn = pPage
33d40 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
33d50 6e 20 3d 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f  n = mn + (nPaylo
33d60 61 64 20 2d 20 6d 6e 29 20 25 20 28 70 50 61 67  ad - mn) % (pPag
33d70 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
33d80 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 74 65 73  ze - 4);.    tes
33d90 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d  tcase( n==pPage-
33da0 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
33db0 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 70 50   testcase( n==pP
33dc0 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
33dd0 29 3b 0a 20 20 20 20 69 66 28 20 6e 20 3e 20 70  );.    if( n > p
33de0 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29  Page->maxLocal )
33df0 20 6e 20 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61   n = mn;.    spa
33e00 63 65 4c 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20  ceLeft = n;.    
33e10 2a 70 6e 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48  *pnSize = n + nH
33e20 65 61 64 65 72 20 2b 20 34 3b 0a 20 20 20 20 70  eader + 4;.    p
33e30 50 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e  Prior = &pCell[n
33e40 48 65 61 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20  Header+n];.  }. 
33e50 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65   pPayload = &pCe
33e60 6c 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20  ll[nHeader];..  
33e70 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
33e80 20 76 61 72 69 61 62 6c 65 73 20 73 68 6f 75 6c   variables shoul
33e90 64 20 62 65 20 73 65 74 20 61 73 20 66 6f 6c 6c  d be set as foll
33ea0 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
33eb0 20 6e 50 61 79 6c 6f 61 64 20 20 20 20 20 20 20   nPayload       
33ec0 20 20 20 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61      Total payloa
33ed0 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 0a  d size in bytes.
33ee0 20 20 2a 2a 20 20 20 70 50 61 79 6c 6f 61 64 20    **   pPayload 
33ef0 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20            Begin 
33f00 77 72 69 74 69 6e 67 20 70 61 79 6c 6f 61 64 20  writing payload 
33f10 68 65 72 65 0a 20 20 2a 2a 20 20 20 73 70 61 63  here.  **   spac
33f20 65 4c 65 66 74 20 20 20 20 20 20 20 20 20 20 53  eLeft          S
33f30 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61  pace available a
33f40 74 20 70 50 61 79 6c 6f 61 64 2e 20 20 49 66 20  t pPayload.  If 
33f50 6e 50 61 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65  nPayload>spaceLe
33f60 66 74 2c 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  ft,.  **        
33f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
33f80 61 74 20 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74  at means content
33f90 20 6d 75 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f   must spill into
33fa0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
33fb0 0a 20 20 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20  .  **   *pnSize 
33fc0 20 20 20 20 20 20 20 20 20 20 20 53 69 7a 65 20             Size 
33fd0 6f 66 20 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c  of the local cel
33fe0 6c 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  l (not counting 
33ff0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 29 0a  overflow pages).
34000 20 20 2a 2a 20 20 20 70 50 72 69 6f 72 20 20 20    **   pPrior   
34010 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 20            Where 
34020 74 6f 20 77 72 69 74 65 20 74 68 65 20 70 67 6e  to write the pgn
34030 6f 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  o of the first o
34040 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a  verflow page.  *
34050 2a 0a 20 20 2a 2a 20 55 73 65 20 61 20 63 61 6c  *.  ** Use a cal
34060 6c 20 74 6f 20 62 74 72 65 65 50 61 72 73 65 43  l to btreeParseC
34070 65 6c 6c 50 74 72 28 29 20 74 6f 20 76 65 72 69  ellPtr() to veri
34080 66 79 20 74 68 61 74 20 74 68 65 20 76 61 6c 75  fy that the valu
34090 65 73 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65  es above.  ** we
340a0 72 65 20 63 6f 6d 70 75 74 65 64 20 63 6f 72 72  re computed corr
340b0 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20  ectly..  */.#if 
340c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
340d0 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
340e0 66 6f 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 78  fo;.    pPage->x
340f0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
34100 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
34110 20 20 20 20 61 73 73 65 72 74 28 20 6e 48 65 61      assert( nHea
34120 64 65 72 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e  der==(int)(info.
34130 70 50 61 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c  pPayload - pCell
34140 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
34150 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
34160 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
34170 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e  *pnSize == info.
34180 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  nSize );.    ass
34190 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20 3d  ert( spaceLeft =
341a0 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b  = info.nLocal );
341b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
341c0 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79 6c  * Write the payl
341d0 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63  oad into the loc
341e0 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79 20  al Cell and any 
341f0 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72 66  extra into overf
34200 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20 77  low pages */.  w
34210 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30  hile( nPayload>0
34220 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63   ){.    if( spac
34230 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66 6e  eLeft==0 ){.#ifn
34240 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
34250 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
34260 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
34270 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
34280 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
34290 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
342a0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
342b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
342c0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
342d0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
342e0 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
342f0 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
34300 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
34310 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
34320 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
34330 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
34340 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
34350 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
34360 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
34370 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
34380 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f 76   &pOvfl, &pgnoOv
34390 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30 29  fl, pgnoOvfl, 0)
343a0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
343b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
343c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
343d0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
343e0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
343f0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
34400 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
34410 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
34420 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
34430 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
34440 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
34450 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
34460 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
34470 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
34480 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
34490 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
344a0 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
344b0 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
344c0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
344d0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
344e0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
344f0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
34500 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
34510 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
34520 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
34530 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
34540 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
34550 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
34560 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
34570 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
34580 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  zed values and d
34590 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
345a0 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
345b0 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
345c0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
345d0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
345e0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
345f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34600 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
34610 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
34620 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
34630 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
34640 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42      ptrmapPut(pB
34650 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79  t, pgnoOvfl, eTy
34660 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c 20  pe, pgnoPtrmap, 
34670 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  &rc);.        if
34680 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
34690 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
346a0 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
346b0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
346c0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
346d0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
346e0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
346f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
34700 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
34710 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65 61    /* If pToRelea
34720 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20 74  se is not zero t
34730 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e 74  han pPrior point
34740 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 20  s into the data 
34750 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f 66  area.      ** of
34760 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d 61   pToRelease.  Ma
34770 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65 61  ke sure pToRelea
34780 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  se is still writ
34790 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  eable. */.      
347a0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
347b0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
347c0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
347d0 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
347e0 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
347f0 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73 20  /* If pPrior is 
34800 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
34810 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
34820 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
34830 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73  Page.      ** is
34840 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65   still writeable
34850 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
34860 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d 3e  ( pPrior<pPage->
34870 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72 3e  aData || pPrior>
34880 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
34890 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
348a0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
348b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
348c0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
348d0 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20 70  age) );..      p
348e0 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20  ut4byte(pPrior, 
348f0 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20  pgnoOvfl);.     
34900 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
34910 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20  Release);.      
34920 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76  pToRelease = pOv
34930 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72  fl;.      pPrior
34940 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b   = pOvfl->aData;
34950 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
34960 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20  pPrior, 0);.    
34970 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f    pPayload = &pO
34980 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20  vfl->aData[4];. 
34990 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d       spaceLeft =
349a0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
349b0 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20   - 4;.    }.    
349c0 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  n = nPayload;.  
349d0 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66    if( n>spaceLef
349e0 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66  t ) n = spaceLef
349f0 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 54  t;..    /* If pT
34a00 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74 20  oRelease is not 
34a10 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c 6f  zero than pPaylo
34a20 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20 74  ad points into t
34a30 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20 20  he data area.   
34a40 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61 73   ** of pToReleas
34a50 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70 54  e.  Make sure pT
34a60 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69 6c  oRelease is stil
34a70 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a  l writeable. */.
34a80 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52      assert( pToR
34a90 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c  elease==0 || sql
34aa0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34ab0 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d  able(pToRelease-
34ac0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34ad0 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61 64    /* If pPayload
34ae0 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
34af0 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61  data area of pPa
34b00 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75  ge, then make su
34b10 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a 20  re pPage.    ** 
34b20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62  is still writeab
34b30 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  le */.    assert
34b40 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67 65  ( pPayload<pPage
34b50 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79 6c  ->aData || pPayl
34b60 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61  oad>=&pPage->aDa
34b70 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  ta[pBt->pageSize
34b80 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  ].            ||
34b90 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
34ba0 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
34bb0 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
34bc0 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20   if( nSrc>0 ){. 
34bd0 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20       if( n>nSrc 
34be0 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20  ) n = nSrc;.    
34bf0 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29    assert( pSrc )
34c00 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
34c10 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e  Payload, pSrc, n
34c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34c30 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c      memset(pPayl
34c40 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20  oad, 0, n);.    
34c50 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d  }.    nPayload -
34c60 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61  = n;.    pPayloa
34c70 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63  d += n;.    pSrc
34c80 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20   += n;.    nSrc 
34c90 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  -= n;.    spaceL
34ca0 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66  eft -= n;.    if
34cb0 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nSrc==0 ){.   
34cc0 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
34cd0 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44  .      pSrc = pD
34ce0 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ata;.    }.  }. 
34cf0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
34d00 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
34d10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
34d20 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
34d30 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
34d40 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
34d50 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
34d60 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
34d70 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
34d80 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
34d90 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
34da0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
34db0 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
34dc0 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
34dd0 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
34de0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
34df0 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
34e00 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
34e10 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
34e20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
34e30 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
34e40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
34e50 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
34e60 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
34e70 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
34e80 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
34e90 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
34ea0 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
34eb0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
34ec0 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
34ed0 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
34ee0 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
34ef0 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
34f00 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
34f10 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
34f20 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
34f30 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
34f40 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
34f50 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
34f60 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
34f70 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
34f80 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
34f90 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
34fa0 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
34fb0 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
34fc0 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
34fd0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
34fe0 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
34ff0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
35000 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
35010 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
35020 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
35030 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35040 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
35050 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
35060 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
35070 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
35080 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
35090 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
350a0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
350b0 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
350c0 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
350d0 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
350e0 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
350f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
35100 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
35110 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
35120 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
35130 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
35140 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
35150 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
35160 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
35170 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
35180 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
35190 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
351a0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
351b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
351c0 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
351d0 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
351e0 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
351f0 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
35200 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
35210 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
35220 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
35230 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
35240 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
35250 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
35260 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
35270 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
35280 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
35290 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
352a0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
352b0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
352c0 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
352d0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
352e0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
352f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35300 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
35310 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
35320 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
35330 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
35340 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
35350 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
35360 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
35370 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
35380 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
35390 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
353a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
353b0 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
353c0 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
353d0 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
353e0 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
353f0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
35400 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
35410 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
35420 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
35430 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
35440 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
35450 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
35460 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
35470 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
35480 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
35490 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
354a0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
354b0 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
354c0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
354d0 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
354e0 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
354f0 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
35500 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35510 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
35520 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
35530 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
35540 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
35550 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
35560 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
35570 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
35580 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
35590 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
355a0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
355b0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
355c0 6f 69 64 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a  oid insertCell(.
355d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
355e0 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f  ,   /* Page into
355f0 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63 6f   which we are co
35600 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69  pying */.  int i
35610 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
35620 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73  New cell becomes
35630 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f   the i-th cell o
35640 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20  f the page */.  
35650 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
35660 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
35670 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a  the new cell */.
35680 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20    int sz,       
35690 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
356a0 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c  content in pCell
356b0 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c   */.  u8 *pTemp,
356c0 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
356d0 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f  storage space fo
356e0 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64  r pCell, if need
356f0 65 64 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68  ed */.  Pgno iCh
35700 69 6c 64 2c 20 20 20 20 20 20 2f 2a 20 49 66 20  ild,      /* If 
35710 6e 6f 6e 2d 7a 65 72 6f 2c 20 72 65 70 6c 61 63  non-zero, replac
35720 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
35730 77 69 74 68 20 74 68 69 73 20 76 61 6c 75 65 20  with this value 
35740 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 43 20 20 20  */.  int *pRC   
35750 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 61         /* Read a
35760 6e 64 20 77 72 69 74 65 20 72 65 74 75 72 6e 20  nd write return 
35770 63 6f 64 65 20 66 72 6f 6d 20 68 65 72 65 20 2a  code from here *
35780 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 20 3d  /.){.  int idx =
35790 20 30 3b 20 20 20 20 20 20 2f 2a 20 57 68 65 72   0;      /* Wher
357a0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
357b0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
357c0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
357d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
357e0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
357f0 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
35800 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
35810 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
35820 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 49  page */.  u8 *pI
35830 6e 73 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ns;         /* T
35840 68 65 20 70 6f 69 6e 74 20 69 6e 20 70 50 61 67  he point in pPag
35850 65 2d 3e 61 43 65 6c 6c 49 64 78 5b 5d 20 77 68  e->aCellIdx[] wh
35860 65 72 65 20 6e 6f 20 63 65 6c 6c 20 69 6e 73 65  ere no cell inse
35870 72 74 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 2a  rted */..  if( *
35880 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  pRC ) return;.. 
35890 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
358a0 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
358b0 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
358c0 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  w );.  assert( M
358d0 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42  X_CELL(pPage->pB
358e0 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20 61  t)<=10921 );.  a
358f0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
35900 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61  ell<=MX_CELL(pPa
35910 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52 52  ge->pBt) || CORR
35920 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
35930 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
35940 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65 28  flow<=ArraySize(
35950 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20 29  pPage->apOvfl) )
35960 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72 61  ;.  assert( Arra
35970 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70 4f  ySize(pPage->apO
35980 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65 28  vfl)==ArraySize(
35990 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20 29  pPage->aiOvfl) )
359a0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
359b0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
359c0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
359d0 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63 65  ) );.  /* The ce
359e0 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c  ll should normal
359f0 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72 72  ly be sized corr
35a00 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72 2c  ectly.  However,
35a10 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a 20   when moving a. 
35a20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63 65   ** malformed ce
35a30 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20 70  ll from a leaf p
35a40 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72 69  age to an interi
35a50 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65 20  or page, if the 
35a60 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20 77  cell size.  ** w
35a70 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73 73  anted to be less
35a80 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74 20   than 4 but got 
35a90 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20  rounded up to 4 
35aa0 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68 65  on the leaf, the
35ab0 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67 68  n size.  ** migh
35ac0 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20 38  t be less than 8
35ad0 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70 6f   (leaf-size + po
35ae0 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69 6e  inter) on the in
35af0 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48 65  terior node.  He
35b00 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65 72  nce.  ** the ter
35b10 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20 69  m after the || i
35b20 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
35b30 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20 61  assert(). */.  a
35b40 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67 65  ssert( sz==pPage
35b50 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
35b60 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73 7a  e, pCell) || (sz
35b70 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30 29  ==8 && iChild>0)
35b80 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
35b90 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
35ba0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
35bb0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
35bc0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
35bd0 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20 73  (pTemp, pCell, s
35be0 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20  z);.      pCell 
35bf0 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20  = pTemp;.    }. 
35c00 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29 7b     if( iChild ){
35c10 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
35c20 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b 0a  pCell, iChild);.
35c30 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50      }.    j = pP
35c40 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b  age->nOverflow++
35c50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
35c60 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61  (int)(sizeof(pPa
35c70 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a 65  ge->apOvfl)/size
35c80 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c  of(pPage->apOvfl
35c90 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50 61  [0])) );.    pPa
35ca0 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20  ge->apOvfl[j] = 
35cb0 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65  pCell;.    pPage
35cc0 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75  ->aiOvfl[j] = (u
35cd0 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57 68  16)i;..    /* Wh
35ce0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  en multiple over
35cf0 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68 65  flows occur, the
35d00 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65 71  y are always seq
35d10 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a 20  uential and in. 
35d20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72 64     ** sorted ord
35d30 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72 69  er.  This invari
35d40 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61 75  ants arise becau
35d50 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72  se multiple over
35d60 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a 2a  flows can.    **
35d70 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65 6e   only occur when
35d80 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69 64   inserting divid
35d90 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74 68  er cells into th
35da0 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64 75  e parent page du
35db0 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c 61  ring.    ** bala
35dc0 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20 64  ncing, and the d
35dd0 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a 61  ividers are adja
35de0 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64 2e  cent and sorted.
35df0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
35e00 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61 67  rt( j==0 || pPag
35e10 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28  e->aiOvfl[j-1]<(
35e20 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65 72  u16)i ); /* Over
35e30 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64 20  flows in sorted 
35e40 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73 73  order */.    ass
35e50 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d  ert( j==0 || i==
35e60 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d  pPage->aiOvfl[j-
35e70 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76 65  1]+1 );   /* Ove
35e80 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75 65  rflows are seque
35e90 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65  ntial */.  }else
35ea0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
35eb0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
35ec0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
35ed0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
35ee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35ef0 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20   *pRC = rc;.    
35f00 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
35f10 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
35f20 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
35f30 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
35f40 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61 20  ge) );.    data 
35f50 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
35f60 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61 74      assert( &dat
35f70 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
35f80 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43 65  set]==pPage->aCe
35f90 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63 20  llIdx );.    rc 
35fa0 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  = allocateSpace(
35fb0 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78 29  pPage, sz, &idx)
35fc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 20  ;.    if( rc ){ 
35fd0 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75 72  *pRC = rc; retur
35fe0 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20  n; }.    /* The 
35ff0 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29 20  allocateSpace() 
36000 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74 65  routine guarante
36010 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  es the following
36020 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20 20   properties.    
36030 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  ** if it returns
36040 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a 2f   successfully */
36050 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36060 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73 73   >= 0 );.    ass
36070 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61 67  ert( idx >= pPag
36080 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a  e->cellOffset+2*
36090 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c  pPage->nCell+2 |
360a0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
360b0 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78 2b      assert( idx+
360c0 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67 65  sz <= (int)pPage
360d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
360e0 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  e );.    pPage->
360f0 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28 32  nFree -= (u16)(2
36100 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d 63   + sz);.    memc
36110 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20 70  py(&data[idx], p
36120 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20 69  Cell, sz);.    i
36130 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
36140 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74     put4byte(&dat
36150 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29 3b  a[idx], iChild);
36160 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73 20  .    }.    pIns 
36170 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  = pPage->aCellId
36180 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65 6d  x + i*2;.    mem
36190 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49 6e  move(pIns+2, pIn
361a0 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  s, 2*(pPage->nCe
361b0 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70 75  ll - i));.    pu
361c0 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64 78  t2byte(pIns, idx
361d0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
361e0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e  ell++;.    /* in
361f0 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c 6c  crement the cell
36200 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66   count */.    if
36210 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65 2d  ( (++data[pPage-
36220 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d 3d  >hdrOffset+4])==
36230 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d 3e  0 ) data[pPage->
36240 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a  hdrOffset+3]++;.
36250 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 32      assert( get2
36260 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
36270 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d  ->hdrOffset+3])=
36280 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  =pPage->nCell );
36290 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
362a0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
362b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
362c0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
362d0 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
362e0 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
362f0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
36300 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
36310 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
36320 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
36330 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
36340 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
36350 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
36360 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61 70   */.      ptrmap
36370 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
36380 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a 20  , pCell, pRC);. 
36390 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
363a0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41  }../*.** A CellA
363b0 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74  rray object cont
363c0 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66 20  ains a cache of 
363d0 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69 7a  pointers and siz
363e0 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73  es for a.** cons
363f0 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63 65  ecutive sequence
36400 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20 6d   of cells that m
36410 69 67 68 74 20 62 65 20 68 65 6c 64 20 6d 75 6c  ight be held mul
36420 74 69 70 6c 65 20 70 61 67 65 73 2e 0a 2a 2f 0a  tiple pages..*/.
36430 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
36440 65 6c 6c 41 72 72 61 79 20 43 65 6c 6c 41 72 72  ellArray CellArr
36450 61 79 3b 0a 73 74 72 75 63 74 20 43 65 6c 6c 41  ay;.struct CellA
36460 72 72 61 79 20 7b 0a 20 20 69 6e 74 20 6e 43 65  rray {.  int nCe
36470 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
36480 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
36490 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
364a0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  */.  MemPage *pR
364b0 65 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ef;          /* 
364c0 52 65 66 65 72 65 6e 63 65 20 70 61 67 65 20 2a  Reference page *
364d0 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b  /.  u8 **apCell;
364e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
364f0 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62  ll cells begin b
36500 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36  alanced */.  u16
36510 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20   *szCell;       
36520 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
36530 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
36540 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d  in apCell[] */.}
36550 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
36560 72 65 20 74 68 65 20 63 65 6c 6c 20 73 69 7a 65  re the cell size
36570 73 20 61 74 20 69 64 78 2c 20 69 64 78 2b 31 2c  s at idx, idx+1,
36580 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d 31 20 68 61   ..., idx+N-1 ha
36590 76 65 20 62 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75  ve been.** compu
365a0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
365b0 6f 69 64 20 70 6f 70 75 6c 61 74 65 43 65 6c 6c  oid populateCell
365c0 43 61 63 68 65 28 43 65 6c 6c 41 72 72 61 79 20  Cache(CellArray 
365d0 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74  *p, int idx, int
365e0 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69   N){.  assert( i
365f0 64 78 3e 3d 30 20 26 26 20 69 64 78 2b 4e 3c 3d  dx>=0 && idx+N<=
36600 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 77 68  p->nCell );.  wh
36610 69 6c 65 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20  ile( N>0 ){.    
36620 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 65 6c  assert( p->apCel
36630 6c 5b 69 64 78 5d 21 3d 30 20 29 3b 0a 20 20 20  l[idx]!=0 );.   
36640 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69   if( p->szCell[i
36650 64 78 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx]==0 ){.      
36660 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d  p->szCell[idx] =
36670 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53   p->pRef->xCellS
36680 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e  ize(p->pRef, p->
36690 61 70 43 65 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20  apCell[idx]);.  
366a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
366b0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
366c0 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  B ||.           
366d0 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78     p->szCell[idx
366e0 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c  ]==p->pRef->xCel
366f0 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70  lSize(p->pRef, p
36700 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29 20 29  ->apCell[idx]) )
36710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64 78 2b  ;.    }.    idx+
36720 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a  +;.    N--;.  }.
36730 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
36740 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
36750 4e 74 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  Nth element of t
36760 68 65 20 63 65 6c 6c 20 61 72 72 61 79 0a 2a 2f  he cell array.*/
36770 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
36780 4f 49 4e 4c 49 4e 45 20 75 31 36 20 63 6f 6d 70  OINLINE u16 comp
36790 75 74 65 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c  uteCellSize(Cell
367a0 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29  Array *p, int N)
367b0 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30  {.  assert( N>=0
367c0 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29   && N<p->nCell )
367d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
367e0 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20  zCell[N]==0 );. 
367f0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20   p->szCell[N] = 
36800 70 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69  p->pRef->xCellSi
36810 7a 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61  ze(p->pRef, p->a
36820 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74  pCell[N]);.  ret
36830 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36840 3b 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63  ;.}.static u16 c
36850 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 43 65  achedCellSize(Ce
36860 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e 74 20  llArray *p, int 
36870 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  N){.  assert( N>
36880 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c  =0 && N<p->nCell
36890 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 43   );.  if( p->szC
368a0 65 6c 6c 5b 4e 5d 20 29 20 72 65 74 75 72 6e 20  ell[N] ) return 
368b0 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20  p->szCell[N];.  
368c0 72 65 74 75 72 6e 20 63 6f 6d 70 75 74 65 43 65  return computeCe
368d0 6c 6c 53 69 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a  llSize(p, N);.}.
368e0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
368f0 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 70  ell[] contains p
36900 6f 69 6e 74 65 72 73 20 74 6f 20 6e 43 65 6c 6c  ointers to nCell
36910 20 62 2d 74 72 65 65 20 70 61 67 65 20 63 65 6c   b-tree page cel
36920 6c 73 2e 20 54 68 65 20 0a 2a 2a 20 73 7a 43 65  ls. The .** szCe
36930 6c 6c 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ll[] array conta
36940 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20  ins the size in 
36950 62 79 74 65 73 20 6f 66 20 65 61 63 68 20 63 65  bytes of each ce
36960 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ll. This functio
36970 6e 0a 2a 2a 20 72 65 70 6c 61 63 65 73 20 74 68  n.** replaces th
36980 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
36990 74 73 20 6f 66 20 70 61 67 65 20 70 50 67 20 77  ts of page pPg w
369a0 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
369b0 20 6f 66 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   of the cell.** 
369c0 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d  array..**.** Som
369d0 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 69  e of the cells i
369e0 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d 61 79 20 63  n apCell[] may c
369f0 75 72 72 65 6e 74 6c 79 20 62 65 20 73 74 6f 72  urrently be stor
36a00 65 64 20 69 6e 20 70 50 67 2e 20 54 68 69 73 0a  ed in pPg. This.
36a10 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b  ** function work
36a20 73 20 61 72 6f 75 6e 64 20 70 72 6f 62 6c 65 6d  s around problem
36a30 73 20 63 61 75 73 65 64 20 62 79 20 74 68 69 73  s caused by this
36a40 20 62 79 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70   by making a cop
36a50 79 20 6f 66 20 61 6e 79 20 0a 2a 2a 20 73 75 63  y of any .** suc
36a60 68 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 6f  h cells before o
36a70 76 65 72 77 72 69 74 69 6e 67 20 74 68 65 20 70  verwriting the p
36a80 61 67 65 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  age data..**.** 
36a90 54 68 65 20 4d 65 6d 50 61 67 65 2e 6e 46 72 65  The MemPage.nFre
36aa0 65 20 66 69 65 6c 64 20 69 73 20 69 6e 76 61 6c  e field is inval
36ab0 69 64 61 74 65 64 20 62 79 20 74 68 69 73 20 66  idated by this f
36ac0 75 6e 63 74 69 6f 6e 2e 20 49 74 20 69 73 20 74  unction. It is t
36ad0 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
36ae0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
36af0 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20 63 6f  ler to set it co
36b00 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
36b10 69 63 20 69 6e 74 20 72 65 62 75 69 6c 64 50 61  ic int rebuildPa
36b20 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge(.  MemPage *p
36b30 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
36b40 20 20 20 20 20 20 2f 2a 20 45 64 69 74 20 74 68        /* Edit th
36b50 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  is page */.  int
36b60 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20   nCell,         
36b70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36b80 46 69 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Final number of 
36b90 63 65 6c 6c 73 20 6f 6e 20 70 61 67 65 20 2a 2f  cells on page */
36ba0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
36bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bc0 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63     /* Array of c
36bd0 65 6c 6c 73 20 2a 2f 0a 20 20 75 31 36 20 2a 73  ells */.  u16 *s
36be0 7a 43 65 6c 6c 20 20 20 20 20 20 20 20 20 20 20  zCell           
36bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
36c00 61 79 20 6f 66 20 63 65 6c 6c 20 73 69 7a 65 73  ay of cell sizes
36c10 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
36c20 6e 74 20 68 64 72 20 3d 20 70 50 67 2d 3e 68 64  nt hdr = pPg->hd
36c30 72 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  rOffset;        
36c40 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
36c50 65 61 64 65 72 20 6f 6e 20 70 50 67 20 2a 2f 0a  eader on pPg */.
36c60 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61    u8 * const aDa
36c70 74 61 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b  ta = pPg->aData;
36c80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
36c90 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 66 6f  inter to data fo
36ca0 72 20 70 50 67 20 2a 2f 0a 20 20 63 6f 6e 73 74  r pPg */.  const
36cb0 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 20   int usableSize 
36cc0 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62  = pPg->pBt->usab
36cd0 6c 65 53 69 7a 65 3b 0a 20 20 75 38 20 2a 20 63  leSize;.  u8 * c
36ce0 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61 44 61  onst pEnd = &aDa
36cf0 74 61 5b 75 73 61 62 6c 65 53 69 7a 65 5d 3b 0a  ta[usableSize];.
36d00 20 20 69 6e 74 20 69 3b 0a 20 20 75 38 20 2a 70    int i;.  u8 *p
36d10 43 65 6c 6c 70 74 72 20 3d 20 70 50 67 2d 3e 61  Cellptr = pPg->a
36d20 43 65 6c 6c 49 64 78 3b 0a 20 20 75 38 20 2a 70  CellIdx;.  u8 *p
36d30 54 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Tmp = sqlite3Pag
36d40 65 72 54 65 6d 70 53 70 61 63 65 28 70 50 67 2d  erTempSpace(pPg-
36d50 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  >pBt->pPager);. 
36d60 20 75 38 20 2a 70 44 61 74 61 3b 0a 0a 20 20 69   u8 *pData;..  i
36d70 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
36d80 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
36d90 6d 63 70 79 28 26 70 54 6d 70 5b 69 5d 2c 20 26  mcpy(&pTmp[i], &
36da0 61 44 61 74 61 5b 69 5d 2c 20 75 73 61 62 6c 65  aData[i], usable
36db0 53 69 7a 65 20 2d 20 69 29 3b 0a 0a 20 20 70 44  Size - i);..  pD
36dc0 61 74 61 20 3d 20 70 45 6e 64 3b 0a 20 20 66 6f  ata = pEnd;.  fo
36dd0 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
36de0 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43  i++){.    u8 *pC
36df0 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b  ell = apCell[i];
36e00 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
36e10 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 61 44 61  WITHIN(pCell,aDa
36e20 74 61 2c 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  ta,pEnd) ){.    
36e30 20 20 70 43 65 6c 6c 20 3d 20 26 70 54 6d 70 5b    pCell = &pTmp[
36e40 70 43 65 6c 6c 20 2d 20 61 44 61 74 61 5d 3b 0a  pCell - aData];.
36e50 20 20 20 20 7d 0a 20 20 20 20 70 44 61 74 61 20      }.    pData 
36e60 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20  -= szCell[i];.  
36e70 20 20 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c    put2byte(pCell
36e80 70 74 72 2c 20 28 70 44 61 74 61 20 2d 20 61 44  ptr, (pData - aD
36e90 61 74 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c  ata));.    pCell
36ea0 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 69 66  ptr += 2;.    if
36eb0 28 20 70 44 61 74 61 20 3c 20 70 43 65 6c 6c 70  ( pData < pCellp
36ec0 74 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  tr ) return SQLI
36ed0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
36ee0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
36ef0 61 2c 20 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  a, pCell, szCell
36f00 5b 69 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74  [i]);.    assert
36f10 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d 3d 70 50 67  ( szCell[i]==pPg
36f20 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 67 2c  ->xCellSize(pPg,
36f30 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52 55   pCell) || CORRU
36f40 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 74 65 73  PT_DB );.    tes
36f50 74 63 61 73 65 28 20 73 7a 43 65 6c 6c 5b 69 5d  tcase( szCell[i]
36f60 21 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65  !=pPg->xCellSize
36f70 28 70 50 67 2c 70 43 65 6c 6c 29 20 29 3b 0a 20  (pPg,pCell) );. 
36f80 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 70 50 67   }..  /* The pPg
36f90 2d 3e 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73  ->nFree field is
36fa0 20 6e 6f 77 20 73 65 74 20 69 6e 63 6f 72 72 65   now set incorre
36fb0 63 74 6c 79 2e 20 54 68 65 20 63 61 6c 6c 65 72  ctly. The caller
36fc0 20 77 69 6c 6c 20 66 69 78 20 69 74 2e 20 2a 2f   will fix it. */
36fd0 0a 20 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 3d 20  .  pPg->nCell = 
36fe0 6e 43 65 6c 6c 3b 0a 20 20 70 50 67 2d 3e 6e 4f  nCell;.  pPg->nO
36ff0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20  verflow = 0;..  
37000 70 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b  put2byte(&aData[
37010 68 64 72 2b 31 5d 2c 20 30 29 3b 0a 20 20 70 75  hdr+1], 0);.  pu
37020 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68 64  t2byte(&aData[hd
37030 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e 43 65 6c 6c  r+3], pPg->nCell
37040 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61  );.  put2byte(&a
37050 44 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 44 61  Data[hdr+5], pDa
37060 74 61 20 2d 20 61 44 61 74 61 29 3b 0a 20 20 61  ta - aData);.  a
37070 44 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 78  Data[hdr+7] = 0x
37080 30 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  00;.  return SQL
37090 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
370a0 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20   Array apCell[] 
370b0 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70  contains nCell p
370c0 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65  ointers to b-tre
370d0 65 20 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73  e cells. Array s
370e0 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e 74 61 69 6e  zCell.** contain
370f0 73 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79  s the size in by
37100 74 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68  tes of each such
37110 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63   cell. This func
37120 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
37130 20 0a 2a 2a 20 61 64 64 20 74 68 65 20 63 65 6c   .** add the cel
37140 6c 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ls stored in the
37150 20 61 72 72 61 79 20 74 6f 20 70 61 67 65 20 70   array to page p
37160 50 67 2e 20 49 66 20 69 74 20 63 61 6e 6e 6f 74  Pg. If it cannot
37170 20 28 62 65 63 61 75 73 65 20 0a 2a 2a 20 74 68   (because .** th
37180 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
37190 62 65 20 64 65 66 72 61 67 6d 65 6e 74 65 64 20  be defragmented 
371a0 62 65 66 6f 72 65 20 74 68 65 20 63 65 6c 6c 73  before the cells
371b0 20 77 69 6c 6c 20 66 69 74 29 2c 20 6e 6f 6e 2d   will fit), non-
371c0 7a 65 72 6f 0a 2a 2a 20 69 73 20 72 65 74 75 72  zero.** is retur
371d0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
371e0 69 66 20 74 68 65 20 63 65 6c 6c 73 20 61 72 65  if the cells are
371f0 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66 75   added successfu
37200 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 0a 2a 2a 20  lly, zero is.** 
37210 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
37220 41 72 67 75 6d 65 6e 74 20 70 43 65 6c 6c 70 74  Argument pCellpt
37230 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
37240 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
37250 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
37260 61 72 72 61 79 0a 2a 2a 20 28 70 61 72 74 20 6f  array.** (part o
37270 66 20 70 61 67 65 20 70 50 67 29 20 74 6f 20 70  f page pPg) to p
37280 6f 70 75 6c 61 74 65 2e 20 41 66 74 65 72 20 63  opulate. After c
37290 65 6c 6c 20 61 70 43 65 6c 6c 5b 30 5d 20 69 73  ell apCell[0] is
372a0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
372b0 2a 2a 20 70 61 67 65 20 62 6f 64 79 2c 20 61 20  ** page body, a 
372c0 31 36 2d 62 69 74 20 6f 66 66 73 65 74 20 69 73  16-bit offset is
372d0 20 77 72 69 74 74 65 6e 20 74 6f 20 70 43 65 6c   written to pCel
372e0 6c 70 74 72 2e 20 41 6e 64 20 73 6f 20 6f 6e 2c  lptr. And so on,
372f0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 65 6c   for each.** cel
37300 6c 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 20  l in the array. 
37310 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
37320 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
37330 63 61 6c 6c 65 72 20 74 6f 20 65 6e 73 75 72 65  caller to ensure
37340 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 73  .** that it is s
37350 61 66 65 20 74 6f 20 6f 76 65 72 77 72 69 74 65  afe to overwrite
37360 20 74 68 69 73 20 70 61 72 74 20 6f 66 20 74 68   this part of th
37370 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  e cell-pointer a
37380 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rray..**.** When
37390 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
373a0 73 20 63 61 6c 6c 65 64 2c 20 2a 70 70 44 61 74  s called, *ppDat
373b0 61 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  a points to the 
373c0 73 74 61 72 74 20 6f 66 20 74 68 65 20 0a 2a 2a  start of the .**
373d0 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 6f 6e   content area on
373e0 20 70 61 67 65 20 70 50 67 2e 20 49 66 20 74 68   page pPg. If th
373f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 6f  e size of the co
37400 6e 74 65 6e 74 20 61 72 65 61 20 69 73 20 65 78  ntent area is ex
37410 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a 70 70 44 61  tended,.** *ppDa
37420 74 61 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ta is updated to
37430 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
37440 77 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 63  w start of the c
37450 6f 6e 74 65 6e 74 20 61 72 65 61 0a 2a 2a 20 62  ontent area.** b
37460 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
37470 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20  .**.** Finally, 
37480 61 72 67 75 6d 65 6e 74 20 70 42 65 67 69 6e 20  argument pBegin 
37490 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 62 79  points to the by
374a0 74 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  te immediately f
374b0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 0a 2a 2a 20  ollowing the.** 
374c0 65 6e 64 20 6f 66 20 74 68 65 20 73 70 61 63 65  end of the space
374d0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 69   required by thi
374e0 73 20 70 61 67 65 20 66 6f 72 20 74 68 65 20 63  s page for the c
374f0 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61  ell-pointer area
37500 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c 20 63 65 6c   (for.** all cel
37510 6c 73 20 2d 20 6e 6f 74 20 6a 75 73 74 20 74 68  ls - not just th
37520 6f 73 65 20 69 6e 73 65 72 74 65 64 20 62 79 20  ose inserted by 
37530 74 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c  the current call
37540 29 2e 20 49 66 20 74 68 65 20 63 6f 6e 74 65 6e  ). If the conten
37550 74 0a 2a 2a 20 61 72 65 61 20 6d 75 73 74 20 62  t.** area must b
37560 65 20 65 78 74 65 6e 64 65 64 20 74 6f 20 62 65  e extended to be
37570 66 6f 72 65 20 74 68 69 73 20 70 6f 69 6e 74 20  fore this point 
37580 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 63 63 6f  in order to acco
37590 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a 2a 20 63 65  modate all.** ce
375a0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2c  lls in apCell[],
375b0 20 74 68 65 6e 20 74 68 65 20 63 65 6c 6c 73 20   then the cells 
375c0 64 6f 20 6e 6f 74 20 66 69 74 20 61 6e 64 20 6e  do not fit and n
375d0 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72  on-zero is retur
375e0 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
375f0 6e 74 20 70 61 67 65 49 6e 73 65 72 74 41 72 72  nt pageInsertArr
37600 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ay(.  MemPage *p
37610 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg,             
37620 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74 6f        /* Page to
37630 20 61 64 64 20 63 65 6c 6c 73 20 74 6f 20 2a 2f   add cells to */
37640 0a 20 20 75 38 20 2a 70 42 65 67 69 6e 2c 20 20  .  u8 *pBegin,  
37650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37660 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 63 65 6c     /* End of cel
37670 6c 2d 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l-pointer array 
37680 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 44 61 74 61  */.  u8 **ppData
37690 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
376a0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
376b0 50 61 67 65 20 63 6f 6e 74 65 6e 74 20 2d 61 72  Page content -ar
376c0 65 61 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ea pointer */.  
376d0 75 38 20 2a 70 43 65 6c 6c 70 74 72 2c 20 20 20  u8 *pCellptr,   
376e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
376f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 65  /* Pointer to ce
37700 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72 65 61 20  ll-pointer area 
37710 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74 2c  */.  int iFirst,
37720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37730 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
37740 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 61   first cell to a
37750 64 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  dd */.  int nCel
37760 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
37770 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
37780 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64  r of cells to ad
37790 64 20 74 6f 20 70 50 67 20 2a 2f 0a 20 20 43 65  d to pPg */.  Ce
377a0 6c 6c 41 72 72 61 79 20 2a 70 43 41 72 72 61 79  llArray *pCArray
377b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
377c0 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20   Array of cells 
377d0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
377e0 20 75 38 20 2a 61 44 61 74 61 20 3d 20 70 50 67   u8 *aData = pPg
377f0 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a 70  ->aData;.  u8 *p
37800 44 61 74 61 20 3d 20 2a 70 70 44 61 74 61 3b 0a  Data = *ppData;.
37810 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69    int iEnd = iFi
37820 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 61  rst + nCell;.  a
37830 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44  ssert( CORRUPT_D
37840 42 20 7c 7c 20 70 50 67 2d 3e 68 64 72 4f 66 66  B || pPg->hdrOff
37850 73 65 74 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20  set==0 );    /* 
37860 4e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  Never called on 
37870 70 61 67 65 20 31 20 2a 2f 0a 20 20 66 6f 72 28  page 1 */.  for(
37880 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45 6e 64  i=iFirst; i<iEnd
37890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
378a0 73 7a 2c 20 72 63 3b 0a 20 20 20 20 75 38 20 2a  sz, rc;.    u8 *
378b0 70 53 6c 6f 74 3b 0a 20 20 20 20 73 7a 20 3d 20  pSlot;.    sz = 
378c0 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65 28 70  cachedCellSize(p
378d0 43 41 72 72 61 79 2c 20 69 29 3b 0a 20 20 20 20  CArray, i);.    
378e0 69 66 28 20 28 61 44 61 74 61 5b 31 5d 3d 3d 30  if( (aData[1]==0
378f0 20 26 26 20 61 44 61 74 61 5b 32 5d 3d 3d 30 29   && aData[2]==0)
37900 20 7c 7c 20 28 70 53 6c 6f 74 20 3d 20 70 61 67   || (pSlot = pag
37910 65 46 69 6e 64 53 6c 6f 74 28 70 50 67 2c 73 7a  eFindSlot(pPg,sz
37920 2c 26 72 63 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ,&rc))==0 ){.   
37930 20 20 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a     pData -= sz;.
37940 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3c        if( pData<
37950 70 42 65 67 69 6e 20 29 20 72 65 74 75 72 6e 20  pBegin ) return 
37960 31 3b 0a 20 20 20 20 20 20 70 53 6c 6f 74 20 3d  1;.      pSlot =
37970 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
37980 20 20 2f 2a 20 70 53 6c 6f 74 20 61 6e 64 20 70    /* pSlot and p
37990 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
379a0 5d 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f 76 65  ] will never ove
379b0 72 6c 61 70 20 6f 6e 20 61 20 77 65 6c 6c 2d 66  rlap on a well-f
379c0 6f 72 6d 65 64 0a 20 20 20 20 2a 2a 20 64 61 74  ormed.    ** dat
379d0 61 62 61 73 65 2e 20 20 42 75 74 20 74 68 65 79  abase.  But they
379e0 20 6d 69 67 68 74 20 66 6f 72 20 61 20 63 6f 72   might for a cor
379f0 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 20 20  rupt database.  
37a00 48 65 6e 63 65 20 75 73 65 20 6d 65 6d 6d 6f 76  Hence use memmov
37a10 65 28 29 0a 20 20 20 20 2a 2a 20 73 69 6e 63 65  e().    ** since
37a20 20 6d 65 6d 63 70 79 28 29 20 73 65 6e 64 73 20   memcpy() sends 
37a30 53 49 47 41 42 4f 52 54 20 77 69 74 68 20 6f 76  SIGABORT with ov
37a40 65 72 6c 61 70 70 69 6e 67 20 62 75 66 66 65 72  erlapping buffer
37a50 73 20 6f 6e 20 4f 70 65 6e 42 53 44 20 2a 2f 0a  s on OpenBSD */.
37a60 20 20 20 20 61 73 73 65 72 74 28 20 28 70 53 6c      assert( (pSl
37a70 6f 74 2b 73 7a 29 3c 3d 70 43 41 72 72 61 79 2d  ot+sz)<=pCArray-
37a80 3e 61 70 43 65 6c 6c 5b 69 5d 0a 20 20 20 20 20  >apCell[i].     
37a90 20 20 20 20 7c 7c 20 70 53 6c 6f 74 3e 3d 28 70      || pSlot>=(p
37aa0 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
37ab0 5d 2b 73 7a 29 0a 20 20 20 20 20 20 20 20 20 7c  ]+sz).         |
37ac0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
37ad0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 53 6c 6f      memmove(pSlo
37ae0 74 2c 20 70 43 41 72 72 61 79 2d 3e 61 70 43 65  t, pCArray->apCe
37af0 6c 6c 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20  ll[i], sz);.    
37b00 70 75 74 32 62 79 74 65 28 70 43 65 6c 6c 70 74  put2byte(pCellpt
37b10 72 2c 20 28 70 53 6c 6f 74 20 2d 20 61 44 61 74  r, (pSlot - aDat
37b20 61 29 29 3b 0a 20 20 20 20 70 43 65 6c 6c 70 74  a));.    pCellpt
37b30 72 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 2a 70  r += 2;.  }.  *p
37b40 70 44 61 74 61 20 3d 20 70 44 61 74 61 3b 0a 20  pData = pData;. 
37b50 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
37b60 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c  .** Array apCell
37b70 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65 6c  [] contains nCel
37b80 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62 2d  l pointers to b-
37b90 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72 61  tree cells. Arra
37ba0 79 20 73 7a 43 65 6c 6c 20 0a 2a 2a 20 63 6f 6e  y szCell .** con
37bb0 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
37bc0 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
37bd0 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
37be0 66 75 6e 63 74 69 6f 6e 20 61 64 64 73 20 74 68  function adds th
37bf0 65 0a 2a 2a 20 73 70 61 63 65 20 61 73 73 6f 63  e.** space assoc
37c00 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
37c10 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72 61  cell in the arra
37c20 79 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  y that is curren
37c30 74 6c 79 20 73 74 6f 72 65 64 20 0a 2a 2a 20 77  tly stored .** w
37c40 69 74 68 69 6e 20 74 68 65 20 62 6f 64 79 20 6f  ithin the body o
37c50 66 20 70 50 67 20 74 6f 20 74 68 65 20 70 50 67  f pPg to the pPg
37c60 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68 65 20   free-list. The 
37c70 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 73 20 61 6e  cell-pointers an
37c80 64 20 6f 74 68 65 72 0a 2a 2a 20 66 69 65 6c 64  d other.** field
37c90 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 72  s of the page ar
37ca0 65 20 6e 6f 74 20 75 70 64 61 74 65 64 2e 0a 2a  e not updated..*
37cb0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
37cc0 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 74  on returns the t
37cd0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  otal number of c
37ce0 65 6c 6c 73 20 61 64 64 65 64 20 74 6f 20 74 68  ells added to th
37cf0 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2f 0a  e free-list..*/.
37d00 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 46  static int pageF
37d10 72 65 65 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  reeArray(.  MemP
37d20 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
37d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37d40 61 67 65 20 74 6f 20 65 64 69 74 20 2a 2f 0a 20  age to edit */. 
37d50 20 69 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20   int iFirst,    
37d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37d70 20 2f 2a 20 46 69 72 73 74 20 63 65 6c 6c 20 74   /* First cell t
37d80 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e  o delete */.  in
37d90 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
37da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37db0 20 43 65 6c 6c 73 20 74 6f 20 64 65 6c 65 74 65   Cells to delete
37dc0 20 2a 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20   */.  CellArray 
37dd0 2a 70 43 41 72 72 61 79 20 20 20 20 20 20 20 20  *pCArray        
37de0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
37df0 66 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  f cells */.){.  
37e00 75 38 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61  u8 * const aData
37e10 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
37e20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64   u8 * const pEnd
37e30 20 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 70   = &aData[pPg->p
37e40 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 3b  Bt->usableSize];
37e50 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 53  .  u8 * const pS
37e60 74 61 72 74 20 3d 20 26 61 44 61 74 61 5b 70 50  tart = &aData[pP
37e70 67 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 38  g->hdrOffset + 8
37e80 20 2b 20 70 50 67 2d 3e 63 68 69 6c 64 50 74 72   + pPg->childPtr
37e90 53 69 7a 65 5d 3b 0a 20 20 69 6e 74 20 6e 52 65  Size];.  int nRe
37ea0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  t = 0;.  int i;.
37eb0 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 46 69    int iEnd = iFi
37ec0 72 73 74 20 2b 20 6e 43 65 6c 6c 3b 0a 20 20 75  rst + nCell;.  u
37ed0 38 20 2a 70 46 72 65 65 20 3d 20 30 3b 0a 20 20  8 *pFree = 0;.  
37ee0 69 6e 74 20 73 7a 46 72 65 65 20 3d 20 30 3b 0a  int szFree = 0;.
37ef0 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b  .  for(i=iFirst;
37f00 20 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20   i<iEnd; i++){. 
37f10 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 70     u8 *pCell = p
37f20 43 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69  CArray->apCell[i
37f30 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54  ];.    if( SQLIT
37f40 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c 2c 20  E_WITHIN(pCell, 
37f50 70 53 74 61 72 74 2c 20 70 45 6e 64 29 20 29 7b  pStart, pEnd) ){
37f60 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20  .      int sz;. 
37f70 20 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20       /* No need 
37f80 74 6f 20 75 73 65 20 63 61 63 68 65 64 43 65 6c  to use cachedCel
37f90 6c 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54  lSize() here.  T
37fa0 68 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20  he sizes of all 
37fb0 63 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20  cells that.     
37fc0 20 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72   ** are to be fr
37fd0 65 65 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  eed have already
37fe0 20 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20   been computing 
37ff0 77 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77  while deciding w
38000 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65  hich.      ** ce
38010 6c 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67  lls need freeing
38020 20 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70   */.      sz = p
38030 43 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69  CArray->szCell[i
38040 5d 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30  ];  assert( sz>0
38050 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46   );.      if( pF
38060 72 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a  ree!=(pCell + sz
38070 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
38080 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20   pFree ){.      
38090 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65      assert( pFre
380a0 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65  e>aData && (pFre
380b0 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36  e - aData)<65536
380c0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72   );.          fr
380d0 65 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31  eeSpace(pPg, (u1
380e0 36 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61  6)(pFree - aData
380f0 29 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20  ), szFree);.    
38100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46      }.        pF
38110 72 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ree = pCell;.   
38120 20 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a       szFree = sz
38130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46  ;.        if( pF
38140 72 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65  ree+sz>pEnd ) re
38150 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65  turn 0;.      }e
38160 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72  lse{.        pFr
38170 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ee = pCell;.    
38180 20 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a      szFree += sz
38190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
381a0 6e 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nRet++;.    }.  
381b0 7d 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b  }.  if( pFree ){
381c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72  .    assert( pFr
381d0 65 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72  ee>aData && (pFr
381e0 65 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33  ee - aData)<6553
381f0 36 20 29 3b 0a 20 20 20 20 66 72 65 65 53 70 61  6 );.    freeSpa
38200 63 65 28 70 50 67 2c 20 28 75 31 36 29 28 70 46  ce(pPg, (u16)(pF
38210 72 65 65 20 2d 20 61 44 61 74 61 29 2c 20 73 7a  ree - aData), sz
38220 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Free);.  }.  ret
38230 75 72 6e 20 6e 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn nRet;.}../*.
38240 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  ** apCell[] and 
38250 73 7a 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  szCell[] contain
38260 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6e  s pointers to an
38270 64 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63  d sizes of all c
38280 65 6c 6c 73 20 69 6e 20 74 68 65 0a 2a 2a 20 70  ells in the.** p
38290 61 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e  ages being balan
382a0 63 65 64 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ced.  The curren
382b0 74 20 70 61 67 65 2c 20 70 50 67 2c 20 68 61 73  t page, pPg, has
382c0 20 70 50 67 2d 3e 6e 43 65 6c 6c 20 63 65 6c 6c   pPg->nCell cell
382d0 73 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20 77 69  s starting.** wi
382e0 74 68 20 61 70 43 65 6c 6c 5b 69 4f 6c 64 5d 2e  th apCell[iOld].
382f0 20 20 41 66 74 65 72 20 62 61 6c 61 6e 63 69 6e    After balancin
38300 67 2c 20 74 68 69 73 20 70 61 67 65 20 73 68 6f  g, this page sho
38310 75 6c 64 20 68 6f 6c 64 20 6e 4e 65 77 20 63 65  uld hold nNew ce
38320 6c 6c 73 0a 2a 2a 20 73 74 61 72 74 69 6e 67 20  lls.** starting 
38330 61 74 20 61 70 43 65 6c 6c 5b 69 4e 65 77 5d 2e  at apCell[iNew].
38340 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
38350 69 6e 65 20 6d 61 6b 65 73 20 74 68 65 20 6e 65  ine makes the ne
38360 63 65 73 73 61 72 79 20 61 64 6a 75 73 74 6d 65  cessary adjustme
38370 6e 74 73 20 74 6f 20 70 50 67 20 73 6f 20 74 68  nts to pPg so th
38380 61 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 2a  at it contains.*
38390 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 65  * the correct ce
383a0 6c 6c 73 20 61 66 74 65 72 20 62 65 69 6e 67 20  lls after being 
383b0 62 61 6c 61 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  balanced..**.** 
383c0 54 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66  The pPg->nFree f
383d0 69 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 20  ield is invalid 
383e0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
383f0 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 74 20 69  on returns. It i
38400 73 20 74 68 65 0a 2a 2a 20 72 65 73 70 6f 6e 73  s the.** respons
38410 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
38420 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69 74 20  aller to set it 
38430 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
38440 61 74 69 63 20 69 6e 74 20 65 64 69 74 50 61 67  atic int editPag
38450 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  e(.  MemPage *pP
38460 67 2c 20 20 20 20 20 20 20 20 20 20 20