/ Hex Artifact Content
Login

Artifact 59c8f28530850c9f94be62aa4c020d39a4de10d2:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 23 69 66 20 64 65   enable){.#if de
0b30: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0b40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
0b50: 49 54 45 5f 54 45 53 54 29 20 26 26 20 21 64 65  ITE_TEST) && !de
0b60: 66 69 6e 65 64 28 54 48 33 5f 43 4f 4d 50 41 54  fined(TH3_COMPAT
0b70: 49 42 49 4c 49 54 59 29 0a 20 20 2f 2a 20 45 6e  IBILITY).  /* En
0b80: 61 62 6c 65 20 67 6c 6f 62 61 6c 20 73 68 61 72  able global shar
0b90: 65 64 20 63 61 63 68 65 20 66 75 6e 63 74 69 6f  ed cache functio
0ba0: 6e 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  n for debugging 
0bb0: 61 6e 64 20 75 6e 69 74 20 74 65 73 74 73 2c 20  and unit tests, 
0bc0: 0a 20 20 2a 2a 20 62 75 74 20 6e 6f 74 20 66 6f  .  ** but not fo
0bd0: 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 72  r release */.  r
0be0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
0bf0: 55 53 45 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c  USE;.#else.  sql
0c00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
0c10: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
0c20: 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20  led = enable;.  
0c30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
0c40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69  ;.#endif.}.#endi
0c50: 66 0a 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  f....#ifdef SQLI
0c60: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0c70: 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54  ACHE.  /*.  ** T
0c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 71 75 65  he functions que
0c90: 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62  rySharedCacheTab
0ca0: 6c 65 4c 6f 63 6b 28 29 2c 20 73 65 74 53 68 61  leLock(), setSha
0cb0: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
0cc0: 6b 28 29 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c  k(),.  ** and cl
0cd0: 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
0ce0: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20  eTableLocks().  
0cf0: 2a 2a 20 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e  ** manipulate en
0d00: 74 72 69 65 73 20 69 6e 20 74 68 65 20 42 74 53  tries in the BtS
0d10: 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b  hared.pLock link
0d20: 65 64 20 6c 69 73 74 20 75 73 65 64 20 74 6f 20  ed list used to 
0d30: 73 74 6f 72 65 0a 20 20 2a 2a 20 73 68 61 72 65  store.  ** share
0d40: 64 2d 63 61 63 68 65 20 74 61 62 6c 65 20 6c 65  d-cache table le
0d50: 76 65 6c 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68  vel locks. If th
0d60: 65 20 6c 69 62 72 61 72 79 20 69 73 20 63 6f 6d  e library is com
0d70: 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 0a 20  piled with the. 
0d80: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0d90: 20 66 65 61 74 75 72 65 20 64 69 73 61 62 6c 65   feature disable
0da0: 64 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  d, then there is
0db0: 20 6f 6e 6c 79 20 65 76 65 72 20 6f 6e 65 20 75   only ever one u
0dc0: 73 65 72 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68  ser.  ** of each
0dd0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
0de0: 75 72 65 20 61 6e 64 20 73 6f 20 74 68 69 73 20  ure and so this 
0df0: 6c 6f 63 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e  locking is not n
0e00: 65 63 65 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20  ecessary. .  ** 
0e10: 53 6f 20 64 65 66 69 6e 65 20 74 68 65 20 6c 6f  So define the lo
0e20: 63 6b 20 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ck related funct
0e30: 69 6f 6e 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a  ions as no-ops..
0e40: 20 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 71    */.  #define q
0e50: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
0e60: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0e70: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0e80: 69 6e 65 20 73 65 74 53 68 61 72 65 64 43 61 63  ine setSharedCac
0e90: 68 65 54 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c  heTableLock(a,b,
0ea0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
0eb0: 64 65 66 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53  define clearAllS
0ec0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0ed0: 6f 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e  ocks(a).  #defin
0ee0: 65 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68  e downgradeAllSh
0ef0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0f00: 63 6b 73 28 61 29 0a 20 20 23 64 65 66 69 6e 65  cks(a).  #define
0f10: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
0f20: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 2c 64  ableLock(a,b,c,d
0f30: 29 20 31 0a 20 20 23 64 65 66 69 6e 65 20 68 61  ) 1.  #define ha
0f40: 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 61  sReadConflicts(a
0f50: 2c 20 62 29 20 30 0a 23 65 6e 64 69 66 0a 0a 23  , b) 0.#endif..#
0f60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0f70: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0f80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
0f90: 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20 54 68 69  EBUG./*.**** Thi
0fa0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e  s function is on
0fb0: 6c 79 20 75 73 65 64 20 61 73 20 70 61 72 74 20  ly used as part 
0fc0: 6f 66 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  of an assert() s
0fd0: 74 61 74 65 6d 65 6e 74 2e 20 2a 2a 2a 0a 2a 2a  tatement. ***.**
0fe0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
0ff0: 20 69 66 20 70 42 74 72 65 65 20 68 6f 6c 64 73   if pBtree holds
1000: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f   the required lo
1010: 63 6b 73 20 74 6f 20 72 65 61 64 20 6f 72 20 77  cks to read or w
1020: 72 69 74 65 20 74 6f 20 74 68 65 20 0a 2a 2a 20  rite to the .** 
1030: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 20  table with root 
1040: 70 61 67 65 20 69 52 6f 6f 74 2e 20 20 20 52 65  page iRoot.   Re
1050: 74 75 72 6e 20 31 20 69 66 20 69 74 20 64 6f 65  turn 1 if it doe
1060: 73 20 61 6e 64 20 30 20 69 66 20 6e 6f 74 2e 0a  s and 0 if not..
1070: 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  **.** For exampl
1080: 65 2c 20 77 68 65 6e 20 77 72 69 74 69 6e 67 20  e, when writing 
1090: 74 6f 20 61 20 74 61 62 6c 65 20 77 69 74 68 20  to a table with 
10a0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 20  root-page iRoot 
10b0: 76 69 61 20 0a 2a 2a 20 42 74 72 65 65 20 63 6f  via .** Btree co
10c0: 6e 6e 65 63 74 69 6f 6e 20 70 42 74 72 65 65 3a  nnection pBtree:
10d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74  .**.**    assert
10e0: 28 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65  ( hasSharedCache
10f0: 54 61 62 6c 65 4c 6f 63 6b 28 70 42 74 72 65 65  TableLock(pBtree
1100: 2c 20 69 52 6f 6f 74 2c 20 30 2c 20 57 52 49 54  , iRoot, 0, WRIT
1110: 45 5f 4c 4f 43 4b 29 20 29 3b 0a 2a 2a 0a 2a 2a  E_LOCK) );.**.**
1120: 20 57 68 65 6e 20 77 72 69 74 69 6e 67 20 74 6f   When writing to
1130: 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 72   an index that r
1140: 65 73 69 64 65 73 20 69 6e 20 61 20 73 68 61 72  esides in a shar
1150: 61 62 6c 65 20 64 61 74 61 62 61 73 65 2c 20 74  able database, t
1160: 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 73 68  he .** caller sh
1170: 6f 75 6c 64 20 68 61 76 65 20 66 69 72 73 74 20  ould have first 
1180: 6f 62 74 61 69 6e 65 64 20 61 20 6c 6f 63 6b 20  obtained a lock 
1190: 73 70 65 63 69 66 79 69 6e 67 20 74 68 65 20 72  specifying the r
11a0: 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74  oot page of.** t
11b0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
11c0: 20 74 61 62 6c 65 2e 20 54 68 69 73 20 6d 61 6b   table. This mak
11d0: 65 73 20 74 68 69 6e 67 73 20 61 20 62 69 74 20  es things a bit 
11e0: 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
11f0: 2c 0a 2a 2a 20 61 73 20 74 68 69 73 20 6d 6f 64  ,.** as this mod
1200: 75 6c 65 20 74 72 65 61 74 73 20 65 61 63 68 20  ule treats each 
1210: 74 61 62 6c 65 20 61 73 20 61 20 73 65 70 61 72  table as a separ
1220: 61 74 65 20 73 74 72 75 63 74 75 72 65 2e 20 54  ate structure. T
1230: 6f 20 64 65 74 65 72 6d 69 6e 65 0a 2a 2a 20 74  o determine.** t
1240: 68 65 20 74 61 62 6c 65 20 63 6f 72 72 65 73 70  he table corresp
1250: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 69 6e  onding to the in
1260: 64 65 78 20 62 65 69 6e 67 20 77 72 69 74 74 65  dex being writte
1270: 6e 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  n, this.** funct
1280: 69 6f 6e 20 68 61 73 20 74 6f 20 73 65 61 72 63  ion has to searc
1290: 68 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 61  h through the da
12a0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a  tabase schema..*
12b0: 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20  *.** Instead of 
12c0: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61  a lock on the ta
12d0: 62 6c 65 2f 69 6e 64 65 78 20 72 6f 6f 74 65 64  ble/index rooted
12e0: 20 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20   at page iRoot, 
12f0: 74 68 65 20 63 61 6c 6c 65 72 20 6d 61 79 0a 2a  the caller may.*
1300: 2a 20 68 6f 6c 64 20 61 20 77 72 69 74 65 2d 6c  * hold a write-l
1310: 6f 63 6b 20 6f 6e 20 74 68 65 20 73 63 68 65 6d  ock on the schem
1320: 61 20 74 61 62 6c 65 20 28 72 6f 6f 74 20 70 61  a table (root pa
1330: 67 65 20 31 29 2e 20 54 68 69 73 20 69 73 20 61  ge 1). This is a
1340: 6c 73 6f 0a 2a 2a 20 61 63 63 65 70 74 61 62 6c  lso.** acceptabl
1350: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1360: 20 68 61 73 53 68 61 72 65 64 43 61 63 68 65 54   hasSharedCacheT
1370: 61 62 6c 65 4c 6f 63 6b 28 0a 20 20 42 74 72 65  ableLock(.  Btre
1380: 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20 20 20  e *pBtree,      
1390: 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 68 61     /* Handle tha
13a0: 74 20 6d 75 73 74 20 68 6f 6c 64 20 6c 6f 63 6b  t must hold lock
13b0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f 74   */.  Pgno iRoot
13c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
13d0: 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 62 2d 74  Root page of b-t
13e0: 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ree */.  int isI
13f0: 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20 20  ndex,           
1400: 2f 2a 20 54 72 75 65 20 69 66 20 69 52 6f 6f 74  /* True if iRoot
1410: 20 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 20   is the root of 
1420: 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20  an index b-tree 
1430: 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 54 79  */.  int eLockTy
1440: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  pe          /* R
1450: 65 71 75 69 72 65 64 20 6c 6f 63 6b 20 74 79 70  equired lock typ
1460: 65 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20  e (READ_LOCK or 
1470: 57 52 49 54 45 5f 4c 4f 43 4b 29 20 2a 2f 0a 29  WRITE_LOCK) */.)
1480: 7b 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  {.  Schema *pSch
1490: 65 6d 61 20 3d 20 28 53 63 68 65 6d 61 20 2a 29  ema = (Schema *)
14a0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 53 63  pBtree->pBt->pSc
14b0: 68 65 6d 61 3b 0a 20 20 50 67 6e 6f 20 69 54 61  hema;.  Pgno iTa
14c0: 62 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  b = 0;.  BtLock 
14d0: 2a 70 4c 6f 63 6b 3b 0a 0a 20 20 2f 2a 20 49 66  *pLock;..  /* If
14e0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 69   this database i
14f0: 73 20 6e 6f 74 20 73 68 61 72 65 61 62 6c 65 2c  s not shareable,
1500: 20 6f 72 20 69 66 20 74 68 65 20 63 6c 69 65 6e   or if the clien
1510: 74 20 69 73 20 72 65 61 64 69 6e 67 0a 20 20 2a  t is reading.  *
1520: 2a 20 61 6e 64 20 68 61 73 20 74 68 65 20 72 65  * and has the re
1530: 61 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66  ad-uncommitted f
1540: 6c 61 67 20 73 65 74 2c 20 74 68 65 6e 20 6e 6f  lag set, then no
1550: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 69 72 65   lock is require
1560: 64 2e 20 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20  d. .  ** Return 
1570: 74 72 75 65 20 69 6d 6d 65 64 69 61 74 65 6c 79  true immediately
1580: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 42  ..  */.  if( (pB
1590: 74 72 65 65 2d 3e 73 68 61 72 61 62 6c 65 3d 3d  tree->sharable==
15a0: 30 29 0a 20 20 20 7c 7c 20 28 65 4c 6f 63 6b 54  0).   || (eLockT
15b0: 79 70 65 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 26  ype==READ_LOCK &
15c0: 26 20 28 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66  & (pBtree->db->f
15d0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
15e0: 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 29 0a  adUncommitted)).
15f0: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
1600: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1610: 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65  the client is re
1620: 61 64 69 6e 67 20 20 6f 72 20 77 72 69 74 69 6e  ading  or writin
1630: 67 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 74  g an index and t
1640: 68 65 20 73 63 68 65 6d 61 20 69 73 0a 20 20 2a  he schema is.  *
1650: 2a 20 6e 6f 74 20 6c 6f 61 64 65 64 2c 20 74 68  * not loaded, th
1660: 65 6e 20 69 74 20 69 73 20 74 6f 6f 20 64 69 66  en it is too dif
1670: 66 69 63 75 6c 74 20 74 6f 20 61 63 74 75 61 6c  ficult to actual
1680: 6c 79 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  ly check to see 
1690: 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 72 72  if.  ** the corr
16a0: 65 63 74 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  ect locks are he
16b0: 6c 64 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 62  ld.  So do not b
16c0: 6f 74 68 65 72 20 2d 20 6a 75 73 74 20 72 65 74  other - just ret
16d0: 75 72 6e 20 74 72 75 65 2e 0a 20 20 2a 2a 20 54  urn true..  ** T
16e0: 68 69 73 20 63 61 73 65 20 64 6f 65 73 20 6e 6f  his case does no
16f0: 74 20 63 6f 6d 65 20 75 70 20 76 65 72 79 20 6f  t come up very o
1700: 66 74 65 6e 20 61 6e 79 68 6f 77 2e 0a 20 20 2a  ften anyhow..  *
1710: 2f 0a 20 20 69 66 28 20 69 73 49 6e 64 65 78 20  /.  if( isIndex 
1720: 26 26 20 28 21 70 53 63 68 65 6d 61 20 7c 7c 20  && (!pSchema || 
1730: 28 70 53 63 68 65 6d 61 2d 3e 73 63 68 65 6d 61  (pSchema->schema
1740: 46 6c 61 67 73 26 44 42 5f 53 63 68 65 6d 61 4c  Flags&DB_SchemaL
1750: 6f 61 64 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20  oaded)==0) ){.  
1760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
1770: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
1780: 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 74   the root-page t
1790: 68 61 74 20 74 68 65 20 6c 6f 63 6b 20 73 68 6f  hat the lock sho
17a0: 75 6c 64 20 62 65 20 68 65 6c 64 20 6f 6e 2e 20  uld be held on. 
17b0: 46 6f 72 20 74 61 62 6c 65 0a 20 20 2a 2a 20 62  For table.  ** b
17c0: 2d 74 72 65 65 73 2c 20 74 68 69 73 20 69 73 20  -trees, this is 
17d0: 6a 75 73 74 20 74 68 65 20 72 6f 6f 74 20 70 61  just the root pa
17e0: 67 65 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ge of the b-tree
17f0: 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 0a 20   being read or. 
1800: 20 2a 2a 20 77 72 69 74 74 65 6e 2e 20 46 6f 72   ** written. For
1810: 20 69 6e 64 65 78 20 62 2d 74 72 65 65 73 2c 20   index b-trees, 
1820: 69 74 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  it is the root p
1830: 61 67 65 20 6f 66 20 74 68 65 20 61 73 73 6f 63  age of the assoc
1840: 69 61 74 65 64 0a 20 20 2a 2a 20 74 61 62 6c 65  iated.  ** table
1850: 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 49 6e  .  */.  if( isIn
1860: 64 65 78 20 29 7b 0a 20 20 20 20 48 61 73 68 45  dex ){.    HashE
1870: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  lem *p;.    for(
1880: 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73  p=sqliteHashFirs
1890: 74 28 26 70 53 63 68 65 6d 61 2d 3e 69 64 78 48  t(&pSchema->idxH
18a0: 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c 69 74  ash); p; p=sqlit
18b0: 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b 0a 20  eHashNext(p)){. 
18c0: 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
18d0: 20 3d 20 28 49 6e 64 65 78 20 2a 29 73 71 6c 69   = (Index *)sqli
18e0: 74 65 48 61 73 68 44 61 74 61 28 70 29 3b 0a 20  teHashData(p);. 
18f0: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 74       if( pIdx->t
1900: 6e 75 6d 3d 3d 28 69 6e 74 29 69 52 6f 6f 74 20  num==(int)iRoot 
1910: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
1920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Tab ){.         
1930: 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20   /* Two or more 
1940: 69 6e 64 65 78 65 73 20 73 68 61 72 65 20 74 68  indexes share th
1950: 65 20 73 61 6d 65 20 72 6f 6f 74 20 70 61 67 65  e same root page
1960: 2e 20 20 54 68 65 72 65 20 6d 75 73 74 0a 20 20  .  There must.  
1970: 20 20 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6d          ** be im
1980: 70 6f 73 74 65 72 20 74 61 62 6c 65 73 2e 20 20  poster tables.  
1990: 53 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 74  So just return t
19a0: 72 75 65 2e 20 20 54 68 65 20 61 73 73 65 72 74  rue.  The assert
19b0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
19c0: 20 20 2a 2a 20 75 73 65 66 75 6c 20 69 6e 20 74    ** useful in t
19d0: 68 61 74 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  hat case. */.   
19e0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
19f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a00: 20 20 20 69 54 61 62 20 3d 20 70 49 64 78 2d 3e     iTab = pIdx->
1a10: 70 54 61 62 6c 65 2d 3e 74 6e 75 6d 3b 0a 20 20  pTable->tnum;.  
1a20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
1a30: 6c 73 65 7b 0a 20 20 20 20 69 54 61 62 20 3d 20  lse{.    iTab = 
1a40: 69 52 6f 6f 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  iRoot;.  }..  /*
1a50: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
1a60: 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20 45  required lock. E
1a70: 69 74 68 65 72 20 61 20 77 72 69 74 65 2d 6c 6f  ither a write-lo
1a80: 63 6b 20 6f 6e 20 72 6f 6f 74 2d 70 61 67 65 20  ck on root-page 
1a90: 69 54 61 62 2c 20 61 20 0a 20 20 2a 2a 20 77 72  iTab, a .  ** wr
1aa0: 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
1ab0: 73 63 68 65 6d 61 20 74 61 62 6c 65 2c 20 6f 72  schema table, or
1ac0: 20 28 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20   (if the client 
1ad0: 69 73 20 72 65 61 64 69 6e 67 29 20 61 0a 20 20  is reading) a.  
1ae0: 2a 2a 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20  ** read-lock on 
1af0: 69 54 61 62 20 77 69 6c 6c 20 73 75 66 66 69 63  iTab will suffic
1b00: 65 2e 20 52 65 74 75 72 6e 20 31 20 69 66 20 61  e. Return 1 if a
1b10: 6e 79 20 6f 66 20 74 68 65 73 65 20 61 72 65 20  ny of these are 
1b20: 66 6f 75 6e 64 2e 20 20 2a 2f 0a 20 20 66 6f 72  found.  */.  for
1b30: 28 70 4c 6f 63 6b 3d 70 42 74 72 65 65 2d 3e 70  (pLock=pBtree->p
1b40: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b  Bt->pLock; pLock
1b50: 3b 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70  ; pLock=pLock->p
1b60: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1b70: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 42  Lock->pBtree==pB
1b80: 74 72 65 65 20 0a 20 20 20 20 20 26 26 20 28 70  tree .     && (p
1b90: 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Lock->iTable==iT
1ba0: 61 62 20 7c 7c 20 28 70 4c 6f 63 6b 2d 3e 65 4c  ab || (pLock->eL
1bb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1bc0: 26 26 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  && pLock->iTable
1bd0: 3d 3d 31 29 29 0a 20 20 20 20 20 26 26 20 70 4c  ==1)).     && pL
1be0: 6f 63 6b 2d 3e 65 4c 6f 63 6b 3e 3d 65 4c 6f 63  ock->eLock>=eLoc
1bf0: 6b 54 79 70 65 20 0a 20 20 20 20 29 7b 0a 20 20  kType .    ){.  
1c00: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1c10: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 61    }.  }..  /* Fa
1c20: 69 6c 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65  iled to find the
1c30: 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 2e 20   required lock. 
1c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
1c50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1c60: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64  E_DEBUG */..#ifd
1c70: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c80: 2f 2a 0a 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e  /*.**** This fun
1c90: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 75 73 65  ction may be use
1ca0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
1cb0: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1cc0: 20 6f 6e 6c 79 2e 20 2a 2a 2a 2a 0a 2a 2a 0a 2a   only. ****.**.*
1cd0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
1ce0: 20 69 74 20 77 6f 75 6c 64 20 62 65 20 69 6c 6c   it would be ill
1cf0: 65 67 61 6c 20 66 6f 72 20 70 42 74 72 65 65 20  egal for pBtree 
1d00: 74 6f 20 77 72 69 74 65 20 69 6e 74 6f 20 74 68  to write into th
1d10: 65 0a 2a 2a 20 74 61 62 6c 65 20 6f 72 20 69 6e  e.** table or in
1d20: 64 65 78 20 72 6f 6f 74 65 64 20 61 74 20 69 52  dex rooted at iR
1d30: 6f 6f 74 20 62 65 63 61 75 73 65 20 6f 74 68 65  oot because othe
1d40: 72 20 73 68 61 72 65 64 20 63 6f 6e 6e 65 63 74  r shared connect
1d50: 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 73 69 6d 75  ions are.** simu
1d60: 6c 74 61 6e 65 6f 75 73 6c 79 20 72 65 61 64 69  ltaneously readi
1d70: 6e 67 20 74 68 61 74 20 73 61 6d 65 20 74 61 62  ng that same tab
1d80: 6c 65 20 6f 72 20 69 6e 64 65 78 2e 0a 2a 2a 0a  le or index..**.
1d90: 2a 2a 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c  ** It is illegal
1da0: 20 66 6f 72 20 70 42 74 72 65 65 20 74 6f 20 77   for pBtree to w
1db0: 72 69 74 65 20 69 66 20 73 6f 6d 65 20 6f 74 68  rite if some oth
1dc0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  er Btree object 
1dd0: 74 68 61 74 0a 2a 2a 20 73 68 61 72 65 73 20 74  that.** shares t
1de0: 68 65 20 73 61 6d 65 20 42 74 53 68 61 72 65 64  he same BtShared
1df0: 20 6f 62 6a 65 63 74 20 69 73 20 63 75 72 72 65   object is curre
1e00: 6e 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20  ntly reading or 
1e10: 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 69  writing.** the i
1e20: 52 6f 6f 74 20 74 61 62 6c 65 2e 20 20 45 78 63  Root table.  Exc
1e30: 65 70 74 2c 20 69 66 20 74 68 65 20 6f 74 68 65  ept, if the othe
1e40: 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20 68  r Btree object h
1e50: 61 73 20 74 68 65 0a 2a 2a 20 72 65 61 64 2d 75  as the.** read-u
1e60: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
1e70: 73 65 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20  set, then it is 
1e80: 4f 4b 20 66 6f 72 20 74 68 65 20 6f 74 68 65 72  OK for the other
1e90: 20 6f 62 6a 65 63 74 20 74 6f 0a 2a 2a 20 68 61   object to.** ha
1ea0: 76 65 20 61 20 72 65 61 64 20 63 75 72 73 6f 72  ve a read cursor
1eb0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d  ..**.** For exam
1ec0: 70 6c 65 2c 20 62 65 66 6f 72 65 20 77 72 69 74  ple, before writ
1ed0: 69 6e 67 20 74 6f 20 61 6e 79 20 70 61 72 74 20  ing to any part 
1ee0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20  of the table or 
1ef0: 69 6e 64 65 78 0a 2a 2a 20 72 6f 6f 74 65 64 20  index.** rooted 
1f00: 61 74 20 70 61 67 65 20 69 52 6f 6f 74 2c 20 6f  at page iRoot, o
1f10: 6e 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 3a 0a  ne should call:.
1f20: 2a 2a 0a 2a 2a 20 20 20 20 61 73 73 65 72 74 28  **.**    assert(
1f30: 20 21 68 61 73 52 65 61 64 43 6f 6e 66 6c 69 63   !hasReadConflic
1f40: 74 73 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74  ts(pBtree, iRoot
1f50: 29 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ) );.*/.static i
1f60: 6e 74 20 68 61 73 52 65 61 64 43 6f 6e 66 6c 69  nt hasReadConfli
1f70: 63 74 73 28 42 74 72 65 65 20 2a 70 42 74 72 65  cts(Btree *pBtre
1f80: 65 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 29 7b 0a  e, Pgno iRoot){.
1f90: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20    BtCursor *p;. 
1fa0: 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70   for(p=pBtree->p
1fb0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
1fc0: 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
1fd0: 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
1fe0: 3d 3d 69 52 6f 6f 74 20 0a 20 20 20 20 20 26 26  ==iRoot .     &&
1ff0: 20 70 2d 3e 70 42 74 72 65 65 21 3d 70 42 74 72   p->pBtree!=pBtr
2000: 65 65 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 70  ee.     && 0==(p
2010: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 66 6c  ->pBtree->db->fl
2020: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61  ags & SQLITE_Rea
2030: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 0a 20 20  dUncommitted).  
2040: 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2050: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
2060: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
2070: 64 69 66 20 20 20 20 2f 2a 20 23 69 66 64 65 66  dif    /* #ifdef
2080: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a 2f   SQLITE_DEBUG */
2090: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f  ../*.** Query to
20a0: 20 73 65 65 20 69 66 20 42 74 72 65 65 20 68 61   see if Btree ha
20b0: 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69  ndle p may obtai
20c0: 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65  n a lock of type
20d0: 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44   eLock .** (READ
20e0: 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c  _LOCK or WRITE_L
20f0: 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c  OCK) on the tabl
2100: 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65  e with root-page
2110: 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a   iTab. Return.**
2120: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
2130: 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62  e lock may be ob
2140: 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69  tained (by calli
2150: 6e 67 0a 2a 2a 20 73 65 74 53 68 61 72 65 64 43  ng.** setSharedC
2160: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 29  acheTableLock())
2170: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  , or SQLITE_LOCK
2180: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
2190: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 53 68  atic int querySh
21a0: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
21b0: 63 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e  ck(Btree *p, Pgn
21c0: 6f 20 69 54 61 62 2c 20 75 38 20 65 4c 6f 63 6b  o iTab, u8 eLock
21d0: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
21e0: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42  Bt = p->pBt;.  B
21f0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
2200: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2210: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
2220: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
2230: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
2240: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
2250: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
2260: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 20  t( p->db!=0 );. 
2270: 20 61 73 73 65 72 74 28 20 21 28 70 2d 3e 64 62   assert( !(p->db
2280: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 52  ->flags&SQLITE_R
2290: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 7c  eadUncommitted)|
22a0: 7c 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f  |eLock==WRITE_LO
22b0: 43 4b 7c 7c 69 54 61 62 3d 3d 31 20 29 3b 0a 20  CK||iTab==1 );. 
22c0: 20 0a 20 20 2f 2a 20 49 66 20 72 65 71 75 65 73   .  /* If reques
22d0: 74 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ting a write-loc
22e0: 6b 2c 20 74 68 65 6e 20 74 68 65 20 42 74 72 65  k, then the Btre
22f0: 65 20 6d 75 73 74 20 68 61 76 65 20 61 6e 20 6f  e must have an o
2300: 70 65 6e 20 77 72 69 74 65 0a 20 20 2a 2a 20 74  pen write.  ** t
2310: 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68  ransaction on th
2320: 69 73 20 66 69 6c 65 2e 20 41 6e 64 2c 20 6f 62  is file. And, ob
2330: 76 69 6f 75 73 6c 79 2c 20 66 6f 72 20 74 68 69  viously, for thi
2340: 73 20 74 6f 20 62 65 20 73 6f 20 74 68 65 72 65  s to be so there
2350: 20 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20 61   .  ** must be a
2360: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  n open write tra
2370: 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2380: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 2a  file itself..  *
2390: 2f 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  /.  assert( eLoc
23a0: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
23b0: 28 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65 72  (p==pBt->pWriter
23c0: 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
23d0: 54 52 41 4e 53 5f 57 52 49 54 45 29 20 29 3b 0a  TRANS_WRITE) );.
23e0: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
23f0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 42  =READ_LOCK || pB
2400: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2410: 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
2420: 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f  .  .  /* This ro
2430: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
2440: 20 69 66 20 74 68 65 20 73 68 61 72 65 64 2d 63   if the shared-c
2450: 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62  ache is not enab
2460: 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d  led */.  if( !p-
2470: 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20  >sharable ){.   
2480: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2490: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  K;.  }..  /* If 
24a0: 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65  some other conne
24b0: 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
24c0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
24d0: 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71  ck, the.  ** req
24e0: 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20  uested lock may 
24f0: 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e  not be obtained.
2500: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2510: 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26 20 28  >pWriter!=p && (
2520: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20  pBt->btsFlags & 
2530: 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29 21 3d  BTS_EXCLUSIVE)!=
2540: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
2550: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
2560: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
2570: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
2580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2590: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
25a0: 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 70 49 74  ;.  }..  for(pIt
25b0: 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
25c0: 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
25d0: 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f  r->pNext){.    /
25e0: 2a 20 54 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20  * The condition 
25f0: 28 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65  (pIter->eLock!=e
2600: 4c 6f 63 6b 29 20 69 6e 20 74 68 65 20 66 6f 6c  Lock) in the fol
2610: 6c 6f 77 69 6e 67 20 69 66 28 2e 2e 2e 29 20 0a  lowing if(...) .
2620: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
2630: 20 69 73 20 61 20 73 69 6d 70 6c 69 66 69 63 61   is a simplifica
2640: 74 69 6f 6e 20 6f 66 3a 0a 20 20 20 20 2a 2a 0a  tion of:.    **.
2650: 20 20 20 20 2a 2a 20 20 20 28 65 4c 6f 63 6b 3d      **   (eLock=
2660: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 7c 7c 20 70  =WRITE_LOCK || p
2670: 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Iter->eLock==WRI
2680: 54 45 5f 4c 4f 43 4b 29 0a 20 20 20 20 2a 2a 0a  TE_LOCK).    **.
2690: 20 20 20 20 2a 2a 20 73 69 6e 63 65 20 77 65 20      ** since we 
26a0: 6b 6e 6f 77 20 74 68 61 74 20 69 66 20 65 4c 6f  know that if eLo
26b0: 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 2c 20  ck==WRITE_LOCK, 
26c0: 74 68 65 6e 20 6e 6f 20 6f 74 68 65 72 20 63 6f  then no other co
26d0: 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  nnection.    ** 
26e0: 6d 61 79 20 68 6f 6c 64 20 61 20 57 52 49 54 45  may hold a WRITE
26f0: 5f 4c 4f 43 4b 20 6f 6e 20 61 6e 79 20 74 61 62  _LOCK on any tab
2700: 6c 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  le in this file 
2710: 28 73 69 6e 63 65 20 74 68 65 72 65 20 63 61 6e  (since there can
2720: 0a 20 20 20 20 2a 2a 20 6f 6e 6c 79 20 62 65 20  .    ** only be 
2730: 61 20 73 69 6e 67 6c 65 20 77 72 69 74 65 72 29  a single writer)
2740: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
2750: 65 72 74 28 20 70 49 74 65 72 2d 3e 65 4c 6f 63  ert( pIter->eLoc
2760: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
2770: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 57 52  pIter->eLock==WR
2780: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
2790: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
27a0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 74 65  EAD_LOCK || pIte
27b0: 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 7c 7c 20  r->pBtree==p || 
27c0: 70 49 74 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45  pIter->eLock==RE
27d0: 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  AD_LOCK);.    if
27e0: 28 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21  ( pIter->pBtree!
27f0: 3d 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61  =p && pIter->iTa
2800: 62 6c 65 3d 3d 69 54 61 62 20 26 26 20 70 49 74  ble==iTab && pIt
2810: 65 72 2d 3e 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b  er->eLock!=eLock
2820: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2830: 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b  3ConnectionBlock
2840: 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72 2d  ed(p->db, pIter-
2850: 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20 20  >pBtree->db);.  
2860: 20 20 20 20 69 66 28 20 65 4c 6f 63 6b 3d 3d 57      if( eLock==W
2870: 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RITE_LOCK ){.   
2880: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 3d 3d       assert( p==
2890: 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
28a0: 20 20 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73          pBt->bts
28b0: 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50 45 4e  Flags |= BTS_PEN
28c0: 44 49 4e 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  DING;.      }.  
28d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
28e0: 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43  E_LOCKED_SHAREDC
28f0: 41 43 48 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ACHE;.    }.  }.
2900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2910: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2920: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  !SQLITE_OMIT_SHA
2930: 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69  RED_CACHE */..#i
2940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2950: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f  T_SHARED_CACHE./
2960: 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b 20  *.** Add a lock 
2970: 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  on the table wit
2980: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61 62  h root-page iTab
2990: 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  le to the shared
29a0: 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20 62  -btree used.** b
29b0: 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70  y Btree handle p
29c0: 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f 63  . Parameter eLoc
29d0: 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  k must be either
29e0: 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a 2a   READ_LOCK or .*
29f0: 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a 2a  * WRITE_LOCK..**
2a00: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2a10: 6e 20 61 73 73 75 6d 65 73 20 74 68 65 20 66 6f  n assumes the fo
2a20: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
2a30: 20 28 61 29 20 54 68 65 20 73 70 65 63 69 66 69   (a) The specifi
2a40: 65 64 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ed Btree object 
2a50: 70 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  p is connected t
2a60: 6f 20 61 20 73 68 61 72 61 62 6c 65 0a 2a 2a 20  o a sharable.** 
2a70: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28        database (
2a80: 6f 6e 65 20 77 69 74 68 20 74 68 65 20 42 74 53  one with the BtS
2a90: 68 61 72 65 64 2e 73 68 61 72 61 62 6c 65 20 66  hared.sharable f
2aa0: 6c 61 67 20 73 65 74 29 2c 20 61 6e 64 0a 2a 2a  lag set), and.**
2ab0: 0a 2a 2a 20 20 20 28 62 29 20 4e 6f 20 6f 74 68  .**   (b) No oth
2ac0: 65 72 20 42 74 72 65 65 20 6f 62 6a 65 63 74 73  er Btree objects
2ad0: 20 68 6f 6c 64 20 61 20 6c 6f 63 6b 20 74 68 61   hold a lock tha
2ae0: 74 20 63 6f 6e 66 6c 69 63 74 73 0a 2a 2a 20 20  t conflicts.**  
2af0: 20 20 20 20 20 77 69 74 68 20 74 68 65 20 72 65       with the re
2b00: 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 28 69 2e  quested lock (i.
2b10: 65 2e 20 71 75 65 72 79 53 68 61 72 65 64 43 61  e. querySharedCa
2b20: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 20 68  cheTableLock() h
2b30: 61 73 0a 2a 2a 20 20 20 20 20 20 20 61 6c 72 65  as.**       alre
2b40: 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  ady been called 
2b50: 61 6e 64 20 72 65 74 75 72 6e 65 64 20 53 51 4c  and returned SQL
2b60: 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 53  ITE_OK)..**.** S
2b70: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b80: 72 6e 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b  rned if the lock
2b90: 20 69 73 20 61 64 64 65 64 20 73 75 63 63 65 73   is added succes
2ba0: 73 66 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 4e  sfully. SQLITE_N
2bb0: 4f 4d 45 4d 20 0a 2a 2a 20 69 73 20 72 65 74 75  OMEM .** is retu
2bc0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63  rned if a malloc
2bd0: 20 61 74 74 65 6d 70 74 20 66 61 69 6c 73 2e 0a   attempt fails..
2be0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
2bf0: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2c00: 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70 2c 20  eLock(Btree *p, 
2c10: 50 67 6e 6f 20 69 54 61 62 6c 65 2c 20 75 38 20  Pgno iTable, u8 
2c20: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
2c30: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2c40: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63  ;.  BtLock *pLoc
2c50: 6b 20 3d 20 30 3b 0a 20 20 42 74 4c 6f 63 6b 20  k = 0;.  BtLock 
2c60: 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72  *pIter;..  asser
2c70: 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
2c80: 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
2c90: 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d    assert( eLock=
2ca0: 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c  =READ_LOCK || eL
2cb0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
2cc0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
2cd0: 64 62 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  db!=0 );..  /* A
2ce0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
2cf0: 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d   the read-uncomm
2d00: 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 20 77  itted flag set w
2d10: 69 6c 6c 20 6e 65 76 65 72 20 74 72 79 20 74 6f  ill never try to
2d20: 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 20 61 20 72  .  ** obtain a r
2d30: 65 61 64 2d 6c 6f 63 6b 20 75 73 69 6e 67 20 74  ead-lock using t
2d40: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68  his function. Th
2d50: 65 20 6f 6e 6c 79 20 72 65 61 64 2d 6c 6f 63 6b  e only read-lock
2d60: 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 62   obtained.  ** b
2d70: 79 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  y a connection i
2d80: 6e 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  n read-uncommitt
2d90: 65 64 20 6d 6f 64 65 20 69 73 20 6f 6e 20 74 68  ed mode is on th
2da0: 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
2db0: 0a 20 20 2a 2a 20 74 61 62 6c 65 2c 20 61 6e 64  .  ** table, and
2dc0: 20 74 68 61 74 20 6c 6f 63 6b 20 69 73 20 6f 62   that lock is ob
2dd0: 74 61 69 6e 65 64 20 69 6e 20 42 74 72 65 65 42  tained in BtreeB
2de0: 65 67 69 6e 54 72 61 6e 73 28 29 2e 20 20 2a 2f  eginTrans().  */
2df0: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 28 70  .  assert( 0==(p
2e00: 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49  ->db->flags&SQLI
2e10: 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  TE_ReadUncommitt
2e20: 65 64 29 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52  ed) || eLock==WR
2e30: 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  ITE_LOCK );..  /
2e40: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2e50: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2e60: 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 61  alled on a shara
2e70: 62 6c 65 20 62 2d 74 72 65 65 20 61 66 74 65 72  ble b-tree after
2e80: 20 69 74 20 0a 20 20 2a 2a 20 68 61 73 20 62 65   it .  ** has be
2e90: 65 6e 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68  en determined th
2ea0: 61 74 20 6e 6f 20 6f 74 68 65 72 20 62 2d 74 72  at no other b-tr
2eb0: 65 65 20 68 6f 6c 64 73 20 61 20 63 6f 6e 66 6c  ee holds a confl
2ec0: 69 63 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 2a 2f  icting lock.  */
2ed0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68  .  assert( p->sh
2ee0: 61 72 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65  arable );.  asse
2ef0: 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71  rt( SQLITE_OK==q
2f00: 75 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54  uerySharedCacheT
2f10: 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62  ableLock(p, iTab
2f20: 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a 20  le, eLock) );.. 
2f30: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
2f40: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
2f50: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
2f60: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
2f70: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
2f80: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
2f90: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
2fa0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
2fb0: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
2fc0: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
2fd0: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
2fe0: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
2ff0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3000: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
3010: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
3020: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
3030: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
3040: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
3050: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
3060: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
3070: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
3080: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
3090: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
30a0: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
30b0: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
30c0: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
30d0: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
30e0: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
30f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
3100: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
3110: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
3120: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
3130: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
3140: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
3150: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
3160: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
3170: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
3180: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
3190: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
31a0: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
31b0: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
31c0: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
31d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
31e0: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
31f0: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
3200: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
3210: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
3220: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
3230: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
3240: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
3250: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
3260: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
3270: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
3280: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
3290: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
32a0: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
32b0: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
32c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
32d0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
32e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
32f0: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
3300: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
3310: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
3320: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
3330: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
3340: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
3350: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
3360: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
3370: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
3380: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
3390: 65 65 20 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a  ee object p..**.
33a0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
33b0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 42 74   assumes that Bt
33c0: 72 65 65 20 70 20 68 61 73 20 61 6e 20 6f 70 65  ree p has an ope
33d0: 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  n read or write 
33e0: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
33f0: 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c   If it does not,
3400: 20 74 68 65 6e 20 74 68 65 20 42 54 53 5f 50 45   then the BTS_PE
3410: 4e 44 49 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61  NDING flag.** ma
3420: 79 20 62 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  y be incorrectly
3430: 20 63 6c 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61   cleared..*/.sta
3440: 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 41 6c  tic void clearAl
3450: 6c 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  lSharedCacheTabl
3460: 65 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29  eLocks(Btree *p)
3470: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
3480: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74  t = p->pBt;.  Bt
3490: 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20  Lock **ppIter = 
34a0: 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20  &pBt->pLock;..  
34b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
34c0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
34d0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
34e0: 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d  ->sharable || 0=
34f0: 3d 2a 70 70 49 74 65 72 20 29 3b 0a 20 20 61 73  =*ppIter );.  as
3500: 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73  sert( p->inTrans
3510: 3e 30 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  >0 );..  while( 
3520: 2a 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42  *ppIter ){.    B
3530: 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a  tLock *pLock = *
3540: 70 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65  ppIter;.    asse
3550: 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  rt( (pBt->btsFla
3560: 67 73 20 26 20 42 54 53 5f 45 58 43 4c 55 53 49  gs & BTS_EXCLUSI
3570: 56 45 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70  VE)==0 || pBt->p
3580: 57 72 69 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70  Writer==pLock->p
3590: 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 73  Btree );.    ass
35a0: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72  ert( pLock->pBtr
35b0: 65 65 2d 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f  ee->inTrans>=pLo
35c0: 63 6b 2d 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  ck->eLock );.   
35d0: 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72   if( pLock->pBtr
35e0: 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a  ee==p ){.      *
35f0: 70 70 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e  ppIter = pLock->
3600: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 61 73 73  pNext;.      ass
3610: 65 72 74 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62  ert( pLock->iTab
3620: 6c 65 21 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d  le!=1 || pLock==
3630: 26 70 2d 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20  &p->lock );.    
3640: 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61    if( pLock->iTa
3650: 62 6c 65 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ble!=1 ){.      
3660: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3670: 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Lock);.      }. 
3680: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3690: 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d  ppIter = &pLock-
36a0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
36b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 42  }..  assert( (pB
36c0: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
36d0: 53 5f 50 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c  S_PENDING)==0 ||
36e0: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b   pBt->pWriter );
36f0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 57 72 69  .  if( pBt->pWri
3700: 74 65 72 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42  ter==p ){.    pB
3710: 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 30 3b 0a  t->pWriter = 0;.
3720: 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
3730: 73 20 26 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55  s &= ~(BTS_EXCLU
3740: 53 49 56 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47  SIVE|BTS_PENDING
3750: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  );.  }else if( p
3760: 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
3770: 3d 3d 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==2 ){.    /* Th
3780: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
3790: 61 6c 6c 65 64 20 77 68 65 6e 20 42 74 72 65 65  alled when Btree
37a0: 20 70 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67   p is concluding
37b0: 20 69 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61   its .    ** tra
37c0: 6e 73 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65  nsaction. If the
37d0: 72 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  re currently exi
37e0: 73 74 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e  sts a writer, an
37f0: 64 20 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a  d p is not.    *
3800: 2a 20 74 68 61 74 20 77 72 69 74 65 72 2c 20 74  * that writer, t
3810: 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
3820: 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
3830: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65  connections othe
3840: 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68  r.    ** than th
3850: 65 20 77 72 69 74 65 72 20 6d 75 73 74 20 62 65  e writer must be
3860: 20 61 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74   about to drop t
3870: 6f 20 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  o zero. In this 
3880: 63 61 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20  case.    ** set 
3890: 74 68 65 20 42 54 53 5f 50 45 4e 44 49 4e 47 20  the BTS_PENDING 
38a0: 66 6c 61 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a  flag to 0..    *
38b0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72  *.    ** If ther
38c0: 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74  e is not current
38d0: 6c 79 20 61 20 77 72 69 74 65 72 2c 20 74 68 65  ly a writer, the
38e0: 6e 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75  n BTS_PENDING mu
38f0: 73 74 0a 20 20 20 20 2a 2a 20 62 65 20 7a 65 72  st.    ** be zer
3900: 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f 20 74 68  o already. So th
3910: 69 73 20 6e 65 78 74 20 6c 69 6e 65 20 69 73 20  is next line is 
3920: 68 61 72 6d 6c 65 73 73 20 69 6e 20 74 68 61 74  harmless in that
3930: 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   case..    */.  
3940: 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20    pBt->btsFlags 
3950: 26 3d 20 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b  &= ~BTS_PENDING;
3960: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
3970: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e  is function chan
3980: 67 65 73 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f  ges all write-lo
3990: 63 6b 73 20 68 65 6c 64 20 62 79 20 42 74 72 65  cks held by Btre
39a0: 65 20 70 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f  e p into read-lo
39b0: 63 6b 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  cks..*/.static v
39c0: 6f 69 64 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c  oid downgradeAll
39d0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
39e0: 4c 6f 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b  Locks(Btree *p){
39f0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
3a00: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28   = p->pBt;.  if(
3a10: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
3a20: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
3a30: 70 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e  pLock;.    pBt->
3a40: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3a50: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3a60: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3a70: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3a80: 20 20 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42      for(pLock=pB
3a90: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b  t->pLock; pLock;
3aa0: 20 70 4c 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e   pLock=pLock->pN
3ab0: 65 78 74 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ext){.      asse
3ac0: 72 74 28 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  rt( pLock->eLock
3ad0: 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70  ==READ_LOCK || p
3ae0: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20  Lock->pBtree==p 
3af0: 29 3b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e  );.      pLock->
3b00: 65 4c 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43  eLock = READ_LOC
3b10: 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  K;.    }.  }.}..
3b20: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b30: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
3b40: 48 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  HE */..static vo
3b50: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
3b60: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20  emPage *pPage); 
3b70: 20 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65   /* Forward refe
3b80: 72 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a  rence */../*.***
3b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3ba0: 69 73 20 75 73 65 64 20 69 6e 73 69 64 65 20 6f  is used inside o
3bb0: 66 20 61 73 73 65 72 74 28 29 20 6f 6e 6c 79 20  f assert() only 
3bc0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66  ****.**.** Verif
3bd0: 79 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  y that the curso
3be0: 72 20 68 6f 6c 64 73 20 74 68 65 20 6d 75 74 65  r holds the mute
3bf0: 78 20 6f 6e 20 69 74 73 20 42 74 53 68 61 72 65  x on its BtShare
3c00: 64 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  d.*/.#ifdef SQLI
3c10: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
3c20: 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  int cursorHoldsM
3c30: 75 74 65 78 28 42 74 43 75 72 73 6f 72 20 2a 70  utex(BtCursor *p
3c40: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
3c50: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3c60: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ->pBt->mutex);.}
3c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3c80: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76  nvalidate the ov
3c90: 65 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20  erflow cache of 
3ca0: 74 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65  the cursor passe
3cb0: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
3cc0: 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74  rgument..** on t
3cd0: 68 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20  he shared btree 
3ce0: 73 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a  structure pBt..*
3cf0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69  /.#define invali
3d00: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
3d10: 65 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63  e(pCur) (pCur->c
3d20: 75 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46  urFlags &= ~BTCF
3d30: 5f 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a  _ValidOvfl)../*.
3d40: 2a 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68  ** Invalidate th
3d50: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
3d60: 6c 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61  list cache for a
3d70: 6c 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65  ll cursors opene
3d80: 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72  d.** on the shar
3d90: 65 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75  ed btree structu
3da0: 72 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69  re pBt..*/.stati
3db0: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74  c void invalidat
3dc0: 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
3dd0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
3de0: 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
3df0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3e00: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
3e10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66  t->mutex) );.  f
3e20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
3e30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
3e40: 29 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  ){.    invalidat
3e50: 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  eOverflowCache(p
3e60: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
3e70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
3e80: 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69  CRBLOB./*.** Thi
3e90: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3ea0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69  lled before modi
3eb0: 66 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  fying the conten
3ec0: 74 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a  ts of a table.**
3ed0: 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61   to invalidate a
3ee0: 6e 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73  ny incrblob curs
3ef0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65  ors that are ope
3f00: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20  n on the.** row 
3f10: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f  or one of the ro
3f20: 77 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ws being modifie
3f30: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
3f40: 6d 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c  ment isClearTabl
3f50: 65 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  e is true, then 
3f60: 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  the entire conte
3f70: 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61  nts of the.** ta
3f80: 62 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ble is about to 
3f90: 62 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74  be deleted. In t
3fa0: 68 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64  his case invalid
3fb0: 61 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62  ate all incrblob
3fc0: 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  .** cursors open
3fd0: 20 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68   on any row with
3fe0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  in the table wit
3ff0: 68 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f  h root-page pgno
4000: 52 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  Root..**.** Othe
4010: 72 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65  rwise, if argume
4020: 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20  nt isClearTable 
4030: 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74  is false, then t
4040: 68 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72  he row with.** r
4050: 6f 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69  owid iRow is bei
4060: 6e 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64  ng replaced or d
4070: 65 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20  eleted. In this 
4080: 63 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a  case invalidate.
4090: 2a 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e  ** only those in
40a0: 63 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  crblob cursors o
40b0: 70 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63  pen on that spec
40c0: 69 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  ific row..*/.sta
40d0: 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64  tic void invalid
40e0: 61 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f  ateIncrblobCurso
40f0: 72 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74  rs(.  Btree *pBt
4100: 72 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ree,          /*
4110: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69   The database fi
4120: 6c 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20  le to check */. 
4130: 20 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20   i64 iRow,      
4140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
4150: 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74  rowid that might
4160: 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a   be changing */.
4170: 20 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62    int isClearTab
4180: 6c 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le        /* Tru
4190: 65 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72  e if all rows ar
41a0: 65 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20  e being deleted 
41b0: 2a 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  */.){.  BtCursor
41c0: 20 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65   *p;.  if( pBtre
41d0: 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75  e->hasIncrblobCu
41e0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
41f0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4200: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
4210: 70 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74  pBtree) );.  pBt
4220: 72 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62  ree->hasIncrblob
4230: 43 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  Cur = 0;.  for(p
4240: 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43  =pBtree->pBt->pC
4250: 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
4260: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28  Next){.    if( (
4270: 70 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  p->curFlags & BT
4280: 43 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20  CF_Incrblob)!=0 
4290: 29 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d  ){.      pBtree-
42a0: 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20  >hasIncrblobCur 
42b0: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69  = 1;.      if( i
42c0: 73 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70  sClearTable || p
42d0: 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f  ->info.nKey==iRo
42e0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  w ){.        p->
42f0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
4300: 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d  INVALID;.      }
4310: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65  .    }.  }.}..#e
4320: 6c 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75  lse.  /* Stub fu
4330: 6e 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52  nction when INCR
4340: 42 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20  BLOB is omitted 
4350: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76  */.  #define inv
4360: 61 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43  alidateIncrblobC
4370: 75 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65  ursors(x,y,z).#e
4380: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
4390: 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a  MIT_INCRBLOB */.
43a0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70  ./*.** Set bit p
43b0: 67 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61  gno of the BtSha
43c0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
43d0: 62 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20  bitvec. This is 
43e0: 63 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20  called .** when 
43f0: 61 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76  a page that prev
4400: 69 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64  iously contained
4410: 20 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20   data becomes a 
4420: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a  free-list leaf .
4430: 2a 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  ** page..**.** T
4440: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
4450: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65  Content bitvec e
4460: 78 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72  xists to work ar
4470: 6f 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a  ound an obscure.
4480: 2a 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79  ** bug caused by
4490: 20 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e   the interaction
44a0: 20 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49   of two useful I
44b0: 4f 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  O optimizations 
44c0: 73 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66  surrounding.** f
44d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
44e0: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  ges:.**.**   1) 
44f0: 57 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73  When all data is
4500: 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20   deleted from a 
4510: 70 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67  page and the pag
4520: 65 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  e becomes.**    
4530: 20 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65    a free-list le
4540: 61 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67  af page, the pag
4550: 65 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  e is not written
4560: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
4570: 0a 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65  .**      (as fre
4580: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
4590: 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61  s contain no mea
45a0: 6e 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53  ningful data). S
45b0: 6f 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20  ometimes.**     
45c0: 20 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20   such a page is 
45d0: 6e 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c  not even journal
45e0: 6c 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20  led (as it will 
45f0: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  not be modified,
4600: 0a 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74  .**      why bot
4610: 68 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20  her journalling 
4620: 69 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  it?)..**.**   2)
4630: 20 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   When a free-lis
4640: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4650: 65 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65  eused, its conte
4660: 6e 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a  nt is not read.*
4670: 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
4680: 64 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74  database or writ
4690: 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
46a0: 61 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f  al file (why sho
46b0: 75 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62  uld it.**      b
46c0: 65 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e, if it is not 
46d0: 61 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75  at all meaningfu
46e0: 6c 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68  l?)..**.** By th
46f0: 65 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20  emselves, these 
4700: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f  optimizations wo
4710: 72 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76  rk fine and prov
4720: 69 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70  ide a handy.** p
4730: 65 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74  erformance boost
4740: 20 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20   to bulk delete 
4750: 6f 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74  or insert operat
4760: 69 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69  ions. However, i
4770: 66 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d  f.** a page is m
4780: 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65  oved to the free
4790: 2d 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72  -list and then r
47a0: 65 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65  eused within the
47b0: 20 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63   same.** transac
47c0: 74 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20  tion, a problem 
47d0: 63 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65  comes up. If the
47e0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75   page is not jou
47f0: 72 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20  rnalled when.** 
4800: 69 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74  it is moved to t
4810: 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  he free-list and
4820: 20 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20   it is also not 
4830: 6a 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20  journalled when 
4840: 69 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74  it.** is extract
4850: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
4860: 2d 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64  -list and reused
4870: 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69  , then the origi
4880: 6e 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20  nal data.** may 
4890: 62 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20  be lost. In the 
48a0: 65 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62  event of a rollb
48b0: 61 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20  ack, it may not 
48c0: 62 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74  be possible.** t
48d0: 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
48e0: 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72  tabase to its or
48f0: 69 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61  iginal configura
4900: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
4910: 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20  solution is the 
4920: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4930: 74 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65  tent bitvec. Whe
4940: 6e 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20  never a page is 
4950: 0a 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63  .** moved to bec
4960: 6f 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20  ome a free-list 
4970: 6c 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63  leaf page, the c
4980: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
4990: 20 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68   is.** set in th
49a0: 65 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76  e bitvec. Whenev
49b0: 65 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69  er a leaf page i
49c0: 73 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d  s extracted from
49d0: 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a   the free-list,.
49e0: 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
49f0: 32 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74  2 above is omitt
4a00: 65 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73  ed if the corres
4a10: 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61  ponding bit is a
4a20: 6c 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e  lready.** set in
4a30: 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f   BtShared.pHasCo
4a40: 6e 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65  ntent. The conte
4a50: 6e 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65  nts of the bitve
4a60: 63 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a  c are cleared.**
4a70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
4a80: 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e  very transaction
4a90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4aa0: 62 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65  btreeSetHasConte
4ab0: 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  nt(BtShared *pBt
4ac0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
4ad0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4ae0: 4f 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  OK;.  if( !pBt->
4af0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20  pHasContent ){. 
4b00: 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c     assert( pgno<
4b10: 3d 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20  =pBt->nPage );. 
4b20: 20 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74     pBt->pHasCont
4b30: 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ent = sqlite3Bit
4b40: 76 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e  vecCreate(pBt->n
4b50: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21  Page);.    if( !
4b60: 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74  pBt->pHasContent
4b70: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
4b80: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
4b90: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
4ba0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 67  =SQLITE_OK && pg
4bb0: 6e 6f 3c 3d 73 71 6c 69 74 65 33 42 69 74 76 65  no<=sqlite3Bitve
4bc0: 63 53 69 7a 65 28 70 42 74 2d 3e 70 48 61 73 43  cSize(pBt->pHasC
4bd0: 6f 6e 74 65 6e 74 29 20 29 7b 0a 20 20 20 20 72  ontent) ){.    r
4be0: 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65  c = sqlite3Bitve
4bf0: 63 53 65 74 28 70 42 74 2d 3e 70 48 61 73 43 6f  cSet(pBt->pHasCo
4c00: 6e 74 65 6e 74 2c 20 70 67 6e 6f 29 3b 0a 20 20  ntent, pgno);.  
4c10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4c20: 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 68  ../*.** Query th
4c30: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4c40: 6f 6e 74 65 6e 74 20 76 65 63 74 6f 72 2e 0a 2a  ontent vector..*
4c50: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
4c60: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
4c70: 6e 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65  n a free-list le
4c80: 61 66 20 70 61 67 65 20 69 73 20 72 65 6d 6f 76  af page is remov
4c90: 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 66  ed from the.** f
4ca0: 72 65 65 2d 6c 69 73 74 20 66 6f 72 20 72 65 75  ree-list for reu
4cb0: 73 65 2e 20 49 74 20 72 65 74 75 72 6e 73 20 66  se. It returns f
4cc0: 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 61  alse if it is sa
4cd0: 66 65 20 74 6f 20 72 65 74 72 69 65 76 65 20 74  fe to retrieve t
4ce0: 68 65 0a 2a 2a 20 70 61 67 65 20 66 72 6f 6d 20  he.** page from 
4cf0: 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20  the pager layer 
4d00: 77 69 74 68 20 74 68 65 20 27 6e 6f 2d 63 6f 6e  with the 'no-con
4d10: 74 65 6e 74 27 20 66 6c 61 67 20 73 65 74 2e 20  tent' flag set. 
4d20: 54 72 75 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  True otherwise..
4d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
4d40: 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
4d50: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
4d60: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 42 69  Pgno pgno){.  Bi
4d70: 74 76 65 63 20 2a 70 20 3d 20 70 42 74 2d 3e 70  tvec *p = pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 3b 0a 20 20 72 65  HasContent;.  re
4d90: 74 75 72 6e 20 28 70 20 26 26 20 28 70 67 6e 6f  turn (p && (pgno
4da0: 3e 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 69  >sqlite3BitvecSi
4db0: 7a 65 28 70 29 20 7c 7c 20 73 71 6c 69 74 65 33  ze(p) || sqlite3
4dc0: 42 69 74 76 65 63 54 65 73 74 28 70 2c 20 70 67  BitvecTest(p, pg
4dd0: 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  no)));.}../*.** 
4de0: 43 6c 65 61 72 20 28 64 65 73 74 72 6f 79 29 20  Clear (destroy) 
4df0: 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61  the BtShared.pHa
4e00: 73 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e  sContent bitvec.
4e10: 20 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 0a   This should be.
4e20: 2a 2a 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  ** invoked at th
4e30: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20  e conclusion of 
4e40: 65 61 63 68 20 77 72 69 74 65 2d 74 72 61 6e 73  each write-trans
4e50: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  action..*/.stati
4e60: 63 20 76 6f 69 64 20 62 74 72 65 65 43 6c 65 61  c void btreeClea
4e70: 72 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  rHasContent(BtSh
4e80: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
4e90: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
4ea0: 6f 79 28 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74  oy(pBt->pHasCont
4eb0: 65 6e 74 29 3b 0a 20 20 70 42 74 2d 3e 70 48 61  ent);.  pBt->pHa
4ec0: 73 43 6f 6e 74 65 6e 74 20 3d 20 30 3b 0a 7d 0a  sContent = 0;.}.
4ed0: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
4ee0: 6c 6c 20 6f 66 20 74 68 65 20 61 70 50 61 67 65  ll of the apPage
4ef0: 5b 5d 20 70 61 67 65 73 20 66 6f 72 20 61 20 63  [] pages for a c
4f00: 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ursor..*/.static
4f10: 20 76 6f 69 64 20 62 74 72 65 65 52 65 6c 65 61   void btreeRelea
4f20: 73 65 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73  seAllCursorPages
4f30: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
4f40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
4f50: 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=0; i<=pCur->i
4f60: 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
4f70: 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
4f80: 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
4f90: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
4fa0: 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 43 75  ] = 0;.  }.  pCu
4fb0: 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 7d  r->iPage = -1;.}
4fc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
4fd0: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
4fe0: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 6d   only argument m
4ff0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 76  ust point to a v
5000: 61 6c 69 64 20 65 6e 74 72 79 0a 2a 2a 20 77 68  alid entry.** wh
5010: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
5020: 20 69 73 20 63 61 6c 6c 65 64 20 28 69 2e 65 2e   is called (i.e.
5030: 20 68 61 76 65 20 65 53 74 61 74 65 3d 3d 43 55   have eState==CU
5040: 52 53 4f 52 5f 56 41 4c 49 44 29 2e 20 54 68 69  RSOR_VALID). Thi
5050: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 61  s.** function sa
5060: 76 65 73 20 74 68 65 20 63 75 72 72 65 6e 74 20  ves the current 
5070: 63 75 72 73 6f 72 20 6b 65 79 20 69 6e 20 76 61  cursor key in va
5080: 72 69 61 62 6c 65 73 20 70 43 75 72 2d 3e 6e 4b  riables pCur->nK
5090: 65 79 20 61 6e 64 0a 2a 2a 20 70 43 75 72 2d 3e  ey and.** pCur->
50a0: 70 4b 65 79 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  pKey. SQLITE_OK 
50b0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73  is returned if s
50c0: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 61 6e 20  uccessful or an 
50d0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 0a 2a 2a  SQLite error .**
50e0: 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
50f0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  .**.** If the cu
5100: 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20  rsor is open on 
5110: 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
5120: 20 74 68 65 6e 20 74 68 65 20 69 6e 74 65 67 65   then the intege
5130: 72 20 6b 65 79 0a 2a 2a 20 28 74 68 65 20 72 6f  r key.** (the ro
5140: 77 69 64 29 20 69 73 20 73 74 6f 72 65 64 20 69  wid) is stored i
5150: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 20 61 6e 64  n pCur->nKey and
5160: 20 70 43 75 72 2d 3e 70 4b 65 79 20 69 73 20 6c   pCur->pKey is l
5170: 65 66 74 20 73 65 74 20 74 6f 0a 2a 2a 20 4e 55  eft set to.** NU
5180: 4c 4c 2e 20 49 66 20 74 68 65 20 63 75 72 73 6f  LL. If the curso
5190: 72 20 69 73 20 6f 70 65 6e 20 6f 6e 20 61 20 6e  r is open on a n
51a0: 6f 6e 2d 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  on-intkey table,
51b0: 20 74 68 65 6e 20 70 43 75 72 2d 3e 70 4b 65 79   then pCur->pKey
51c0: 20 69 73 20 0a 2a 2a 20 73 65 74 20 74 6f 20 70   is .** set to p
51d0: 6f 69 6e 74 20 74 6f 20 61 20 6d 61 6c 6c 6f 63  oint to a malloc
51e0: 65 64 20 62 75 66 66 65 72 20 70 43 75 72 2d 3e  ed buffer pCur->
51f0: 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 73 69  nKey bytes in si
5200: 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 0a 2a  ze containing .*
5210: 2a 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 73 74  * the key..*/.st
5220: 61 74 69 63 20 69 6e 74 20 73 61 76 65 43 75 72  atic int saveCur
5230: 73 6f 72 4b 65 79 28 42 74 43 75 72 73 6f 72 20  sorKey(BtCursor 
5240: 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63  *pCur){.  int rc
5250: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5260: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5270: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5280: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5290: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
52a0: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
52b0: 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d  pCur) );..  rc =
52c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
52d0: 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72  Size(pCur, &pCur
52e0: 2d 3e 6e 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ->nKey);.  asser
52f0: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
5300: 20 29 3b 20 20 2f 2a 20 4b 65 79 53 69 7a 65 28   );  /* KeySize(
5310: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f  ) cannot fail */
5320: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
5330: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
5340: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
5350: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
5360: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
5370: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
5380: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
5390: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
53a0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
53b0: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
53c0: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
53d0: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
53e0: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
53f0: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
5400: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
5410: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
5420: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
5430: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
5440: 20 2a 2a 20 64 61 74 61 2e 20 20 2a 2f 0a 20 20   ** data.  */.  
5450: 69 66 28 20 30 3d 3d 70 43 75 72 2d 3e 63 75 72  if( 0==pCur->cur
5460: 49 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 76 6f  IntKey ){.    vo
5470: 69 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74  id *pKey = sqlit
5480: 65 33 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e  e3Malloc( pCur->
5490: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20  nKey );.    if( 
54a0: 70 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63  pKey ){.      rc
54b0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
54c0: 65 79 28 70 43 75 72 2c 20 30 2c 20 28 69 6e 74  ey(pCur, 0, (int
54d0: 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70 4b 65  )pCur->nKey, pKe
54e0: 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  y);.      if( rc
54f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5500: 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65         pCur->pKe
5510: 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 20 20  y = pKey;.      
5520: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5530: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b 65 79  qlite3_free(pKey
5540: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
5560: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5570: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
5580: 74 28 20 21 70 43 75 72 2d 3e 63 75 72 49 6e 74  t( !pCur->curInt
5590: 4b 65 79 20 7c 7c 20 21 70 43 75 72 2d 3e 70 4b  Key || !pCur->pK
55a0: 65 79 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ey );.  return r
55b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  c;.}../*.** Save
55c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
55d0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  sor position in 
55e0: 74 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74  the variables Bt
55f0: 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20  Cursor.nKey .** 
5600: 61 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65  and BtCursor.pKe
5610: 79 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20  y. The cursor's 
5620: 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
5630: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5640: 45 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  EK..**.** The ca
5650: 6c 6c 65 72 20 6d 75 73 74 20 65 6e 73 75 72 65  ller must ensure
5660: 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
5670: 20 69 73 20 76 61 6c 69 64 20 28 68 61 73 20 65   is valid (has e
5680: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
5690: 4c 49 44 29 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  LID).** prior to
56a0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
56b0: 75 74 69 6e 65 2e 20 20 0a 2a 2f 0a 73 74 61 74  utine.  .*/.stat
56c0: 69 63 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f  ic int saveCurso
56d0: 72 50 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73  rPosition(BtCurs
56e0: 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74  or *pCur){.  int
56f0: 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
5700: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43  CURSOR_VALID==pC
5710: 75 72 2d 3e 65 53 74 61 74 65 20 7c 7c 20 43 55  ur->eState || CU
5720: 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 3d 3d 70  RSOR_SKIPNEXT==p
5730: 43 75 72 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20  Cur->eState );. 
5740: 20 61 73 73 65 72 74 28 20 30 3d 3d 70 43 75 72   assert( 0==pCur
5750: 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  ->pKey );.  asse
5760: 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
5770: 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
5780: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
5790: 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
57a0: 58 54 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  XT ){.    pCur->
57b0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
57c0: 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  VALID;.  }else{.
57d0: 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65      pCur->skipNe
57e0: 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72  xt = 0;.  }..  r
57f0: 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 4b 65  c = saveCursorKe
5800: 79 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  y(pCur);.  if( r
5810: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5820: 20 20 20 20 62 74 72 65 65 52 65 6c 65 61 73 65      btreeRelease
5830: 41 6c 6c 43 75 72 73 6f 72 50 61 67 65 73 28 70  AllCursorPages(p
5840: 43 75 72 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  Cur);.    pCur->
5850: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
5860: 52 45 51 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d  REQUIRESEEK;.  }
5870: 0a 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ..  pCur->curFla
5880: 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
5890: 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
58a0: 64 4f 76 66 6c 7c 42 54 43 46 5f 41 74 4c 61 73  dOvfl|BTCF_AtLas
58b0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
58c0: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  .}../* Forward r
58d0: 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
58e0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
58f0: 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72 73 6f  INLINE saveCurso
5900: 72 73 4f 6e 4c 69 73 74 28 42 74 43 75 72 73 6f  rsOnList(BtCurso
5910: 72 2a 2c 50 67 6e 6f 2c 42 74 43 75 72 73 6f 72  r*,Pgno,BtCursor
5920: 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  *);../*.** Save 
5930: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
5940: 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 28 65 78   all cursors (ex
5950: 63 65 70 74 20 70 45 78 63 65 70 74 29 20 74 68  cept pExcept) th
5960: 61 74 20 61 72 65 20 6f 70 65 6e 20 6f 6e 0a 2a  at are open on.*
5970: 2a 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  * the table with
5980: 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74   root-page iRoot
5990: 2e 20 20 22 53 61 76 69 6e 67 20 74 68 65 20 63  .  "Saving the c
59a0: 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 22 20  ursor position" 
59b0: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
59c0: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  e location in th
59d0: 65 20 62 74 72 65 65 20 69 73 20 72 65 6d 65 6d  e btree is remem
59e0: 62 65 72 65 64 20 69 6e 20 73 75 63 68 20 61 20  bered in such a 
59f0: 77 61 79 20 74 68 61 74 20 69 74 20 63 61 6e 20  way that it can 
5a00: 62 65 0a 2a 2a 20 6d 6f 76 65 64 20 62 61 63 6b  be.** moved back
5a10: 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 70 6f   to the same spo
5a20: 74 20 61 66 74 65 72 20 74 68 65 20 62 74 72 65  t after the btre
5a30: 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
5a40: 69 65 64 2e 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ied.  This.** ro
5a50: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
5a60: 6a 75 73 74 20 62 65 66 6f 72 65 20 63 75 72 73  just before curs
5a70: 6f 72 20 70 45 78 63 65 70 74 20 69 73 20 75 73  or pExcept is us
5a80: 65 64 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  ed to modify the
5a90: 0a 2a 2a 20 74 61 62 6c 65 2c 20 66 6f 72 20 65  .** table, for e
5aa0: 78 61 6d 70 6c 65 20 69 6e 20 42 74 72 65 65 44  xample in BtreeD
5ab0: 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65  elete() or Btree
5ac0: 49 6e 73 65 72 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  Insert()..**.** 
5ad0: 49 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  If there are two
5ae0: 20 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73   or more cursors
5af0: 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72   on the same btr
5b00: 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63  ee, then all suc
5b10: 68 20 0a 2a 2a 20 63 75 72 73 6f 72 73 20 73 68  h .** cursors sh
5b20: 6f 75 6c 64 20 68 61 76 65 20 74 68 65 69 72 20  ould have their 
5b30: 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c  BTCF_Multiple fl
5b40: 61 67 20 73 65 74 2e 20 20 54 68 65 20 62 74 72  ag set.  The btr
5b50: 65 65 43 75 72 73 6f 72 28 29 0a 2a 2a 20 72 6f  eeCursor().** ro
5b60: 75 74 69 6e 65 20 65 6e 66 6f 72 63 65 73 20 74  utine enforces t
5b70: 68 61 74 20 72 75 6c 65 2e 20 20 54 68 69 73 20  hat rule.  This 
5b80: 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 6e 65 65  routine only nee
5b90: 64 73 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ds to be called 
5ba0: 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 63 6f 6d 6d  in.** the uncomm
5bb0: 6f 6e 20 63 61 73 65 20 77 68 65 6e 20 70 45 78  on case when pEx
5bc0: 70 65 63 74 20 68 61 73 20 74 68 65 20 42 54 43  pect has the BTC
5bd0: 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67 20  F_Multiple flag 
5be0: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  set..**.** If pE
5bf0: 78 70 65 63 74 21 3d 4e 55 4c 4c 20 61 6e 64 20  xpect!=NULL and 
5c00: 69 66 20 6e 6f 20 6f 74 68 65 72 20 63 75 72 73  if no other curs
5c10: 6f 72 73 20 61 72 65 20 66 6f 75 6e 64 20 6f 6e  ors are found on
5c20: 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 2d 70   the same root-p
5c30: 61 67 65 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65  age,.** then the
5c40: 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66   BTCF_Multiple f
5c50: 6c 61 67 20 6f 6e 20 70 45 78 70 65 63 74 20 69  lag on pExpect i
5c60: 73 20 63 6c 65 61 72 65 64 2c 20 74 6f 20 61 76  s cleared, to av
5c70: 6f 69 64 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 70  oid another.** p
5c80: 6f 69 6e 74 6c 65 73 73 20 63 61 6c 6c 20 74 6f  ointless call to
5c90: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
5ca0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
5cb0: 69 6f 6e 20 6e 6f 74 65 3a 20 20 54 68 69 73 20  ion note:  This 
5cc0: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
5cd0: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
5ce0: 61 6e 79 20 63 75 72 73 6f 72 73 0a 2a 2a 20 6e  any cursors.** n
5cf0: 65 65 64 20 74 6f 20 62 65 20 73 61 76 65 64 2e  eed to be saved.
5d00: 20 20 49 74 20 63 61 6c 6c 73 20 6f 75 74 20 74    It calls out t
5d10: 6f 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  o saveCursorsOnL
5d20: 69 73 74 28 29 20 69 6e 20 74 68 65 20 28 75 6e  ist() in the (un
5d30: 75 73 75 61 6c 29 0a 2a 2a 20 65 76 65 6e 74 20  usual).** event 
5d40: 74 68 61 74 20 63 75 72 73 6f 72 73 20 61 72 65  that cursors are
5d50: 20 69 6e 20 6e 65 65 64 20 74 6f 20 62 65 69 6e   in need to bein
5d60: 67 20 73 61 76 65 64 2e 0a 2a 2f 0a 73 74 61 74  g saved..*/.stat
5d70: 69 63 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75  ic int saveAllCu
5d80: 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
5d90: 70 42 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c  pBt, Pgno iRoot,
5da0: 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65   BtCursor *pExce
5db0: 70 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  pt){.  BtCursor 
5dc0: 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  *p;.  assert( sq
5dd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
5de0: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
5df0: 20 20 61 73 73 65 72 74 28 20 70 45 78 63 65 70    assert( pExcep
5e00: 74 3d 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d  t==0 || pExcept-
5e10: 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66  >pBt==pBt );.  f
5e20: 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
5e30: 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
5e40: 29 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  ){.    if( p!=pE
5e50: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
5e60: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
5e70: 74 3d 3d 69 52 6f 6f 74 29 20 29 20 62 72 65 61  t==iRoot) ) brea
5e80: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 20 29  k;.  }.  if( p )
5e90: 20 72 65 74 75 72 6e 20 73 61 76 65 43 75 72 73   return saveCurs
5ea0: 6f 72 73 4f 6e 4c 69 73 74 28 70 2c 20 69 52 6f  orsOnList(p, iRo
5eb0: 6f 74 2c 20 70 45 78 63 65 70 74 29 3b 0a 20 20  ot, pExcept);.  
5ec0: 69 66 28 20 70 45 78 63 65 70 74 20 29 20 70 45  if( pExcept ) pE
5ed0: 78 63 65 70 74 2d 3e 63 75 72 46 6c 61 67 73 20  xcept->curFlags 
5ee0: 26 3d 20 7e 42 54 43 46 5f 4d 75 6c 74 69 70 6c  &= ~BTCF_Multipl
5ef0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  e;.  return SQLI
5f00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 69  TE_OK;.}../* Thi
5f10: 73 20 68 65 6c 70 65 72 20 72 6f 75 74 69 6e 65  s helper routine
5f20: 20 74 6f 20 73 61 76 65 41 6c 6c 43 75 72 73 6f   to saveAllCurso
5f30: 72 73 20 64 6f 65 73 20 74 68 65 20 61 63 74 75  rs does the actu
5f40: 61 6c 20 77 6f 72 6b 20 6f 66 20 73 61 76 69 6e  al work of savin
5f50: 67 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 73  g.** the cursors
5f60: 20 69 66 20 61 6e 64 20 77 68 65 6e 20 61 20 63   if and when a c
5f70: 75 72 73 6f 72 20 69 73 20 66 6f 75 6e 64 20 74  ursor is found t
5f80: 68 61 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  hat actually req
5f90: 75 69 72 65 73 20 73 61 76 69 6e 67 2e 0a 2a 2a  uires saving..**
5fa0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
5fb0: 20 69 73 20 74 68 61 74 20 6e 6f 20 63 75 72 73   is that no curs
5fc0: 6f 72 73 20 6e 65 65 64 20 74 6f 20 62 65 20 73  ors need to be s
5fd0: 61 76 65 64 2c 20 73 6f 20 74 68 69 73 20 72 6f  aved, so this ro
5fe0: 75 74 69 6e 65 20 69 73 0a 2a 2a 20 62 72 6f 6b  utine is.** brok
5ff0: 65 6e 20 6f 75 74 20 66 72 6f 6d 20 69 74 73 20  en out from its 
6000: 63 61 6c 6c 65 72 20 74 6f 20 61 76 6f 69 64 20  caller to avoid 
6010: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 74 61 63  unnecessary stac
6020: 6b 20 70 6f 69 6e 74 65 72 20 6d 6f 76 65 6d 65  k pointer moveme
6030: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
6040: 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
6050: 45 20 73 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c  E saveCursorsOnL
6060: 69 73 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20  ist(.  BtCursor 
6070: 2a 70 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  *p,         /* T
6080: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20  he first cursor 
6090: 74 68 61 74 20 6e 65 65 64 73 20 73 61 76 69 6e  that needs savin
60a0: 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 52 6f 6f  g */.  Pgno iRoo
60b0: 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  t,          /* O
60c0: 6e 6c 79 20 73 61 76 65 20 63 75 72 73 6f 72 20  nly save cursor 
60d0: 77 69 74 68 20 74 68 69 73 20 69 52 6f 6f 74 2e  with this iRoot.
60e0: 20 53 61 76 65 20 61 6c 6c 20 69 66 20 7a 65 72   Save all if zer
60f0: 6f 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  o */.  BtCursor 
6100: 2a 70 45 78 63 65 70 74 20 20 20 20 2f 2a 20 44  *pExcept    /* D
6110: 6f 20 6e 6f 74 20 73 61 76 65 20 74 68 69 73 20  o not save this 
6120: 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 64  cursor */.){.  d
6130: 6f 7b 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45  o{.    if( p!=pE
6140: 78 63 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f  xcept && (0==iRo
6150: 6f 74 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f  ot || p->pgnoRoo
6160: 74 3d 3d 69 52 6f 6f 74 29 20 29 7b 0a 20 20 20  t==iRoot) ){.   
6170: 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65     if( p->eState
6180: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
6190: 7c 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  | p->eState==CUR
61a0: 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a  SOR_SKIPNEXT ){.
61b0: 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
61c0: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
61d0: 69 6f 6e 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ion(p);.        
61e0: 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
61f0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
6200: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
6210: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6220: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
6230: 65 28 20 70 2d 3e 69 50 61 67 65 3e 30 20 29 3b  e( p->iPage>0 );
6240: 0a 20 20 20 20 20 20 20 20 62 74 72 65 65 52 65  .        btreeRe
6250: 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50 61  leaseAllCursorPa
6260: 67 65 73 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ges(p);.      }.
6270: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d      }.    p = p-
6280: 3e 70 4e 65 78 74 3b 0a 20 20 7d 77 68 69 6c 65  >pNext;.  }while
6290: 28 20 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ( p );.  return 
62a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
62b0: 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75  .** Clear the cu
62c0: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
62d0: 69 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ition..*/.void s
62e0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
62f0: 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
6300: 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74  *pCur){.  assert
6310: 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
6320: 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71  ex(pCur) );.  sq
6330: 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d  lite3_free(pCur-
6340: 3e 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e  >pKey);.  pCur->
6350: 70 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72  pKey = 0;.  pCur
6360: 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
6370: 52 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  R_INVALID;.}../*
6380: 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73  .** In this vers
6390: 69 6f 6e 20 6f 66 20 42 74 72 65 65 4d 6f 76 65  ion of BtreeMove
63a0: 74 6f 2c 20 70 4b 65 79 20 69 73 20 61 20 70 61  to, pKey is a pa
63b0: 63 6b 65 64 20 69 6e 64 65 78 20 72 65 63 6f 72  cked index recor
63c0: 64 0a 2a 2a 20 73 75 63 68 20 61 73 20 69 73 20  d.** such as is 
63d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65  generated by the
63e0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f   OP_MakeRecord o
63f0: 70 63 6f 64 65 2e 20 20 55 6e 70 61 63 6b 20 74  pcode.  Unpack t
6400: 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 61 6e 64  he.** record and
6410: 20 74 68 65 6e 20 63 61 6c 6c 20 42 74 72 65 65   then call Btree
6420: 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 29  MovetoUnpacked()
6430: 20 74 6f 20 64 6f 20 74 68 65 20 77 6f 72 6b 2e   to do the work.
6440: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
6450: 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
6460: 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
6470: 20 20 2f 2a 20 43 75 72 73 6f 72 20 6f 70 65 6e    /* Cursor open
6480: 20 6f 6e 20 74 68 65 20 62 74 72 65 65 20 74 6f   on the btree to
6490: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
64a0: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
64b0: 65 79 2c 20 20 20 2f 2a 20 50 61 63 6b 65 64 20  ey,   /* Packed 
64c0: 6b 65 79 20 69 66 20 74 68 65 20 62 74 72 65 65  key if the btree
64d0: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a   is an index */.
64e0: 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
64f0: 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72        /* Integer
6500: 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73 2e   key for tables.
6510: 20 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 20 66    Size of pKey f
6520: 6f 72 20 69 6e 64 69 63 65 73 20 2a 2f 0a 20 20  or indices */.  
6530: 69 6e 74 20 62 69 61 73 2c 20 20 20 20 20 20 20  int bias,       
6540: 20 20 20 20 2f 2a 20 42 69 61 73 20 73 65 61 72      /* Bias sear
6550: 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
6560: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
6570: 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  s           /* W
6580: 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
6590: 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
65a0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
65b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
65c0: 74 61 74 75 73 20 63 6f 64 65 20 2a 2f 0a 20 20  tatus code */.  
65d0: 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
65e0: 70 49 64 78 4b 65 79 3b 20 20 20 2f 2a 20 55 6e  pIdxKey;   /* Un
65f0: 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65 79  packed index key
6600: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 70 61 63   */.  char aSpac
6610: 65 5b 32 30 30 5d 3b 20 20 20 20 20 20 20 20 20  e[200];         
6620: 20 2f 2a 20 54 65 6d 70 20 73 70 61 63 65 20 66   /* Temp space f
6630: 6f 72 20 70 49 64 78 4b 65 79 20 2d 20 74 6f 20  or pIdxKey - to 
6640: 61 76 6f 69 64 20 61 20 6d 61 6c 6c 6f 63 20 2a  avoid a malloc *
6650: 2f 0a 20 20 63 68 61 72 20 2a 70 46 72 65 65 20  /.  char *pFree 
6660: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 4b 65 79  = 0;..  if( pKey
6670: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6680: 6e 4b 65 79 3d 3d 28 69 36 34 29 28 69 6e 74 29  nKey==(i64)(int)
6690: 6e 4b 65 79 20 29 3b 0a 20 20 20 20 70 49 64 78  nKey );.    pIdx
66a0: 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Key = sqlite3Vdb
66b0: 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
66c0: 63 6f 72 64 28 0a 20 20 20 20 20 20 20 20 70 43  cord(.        pC
66d0: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 61 53  ur->pKeyInfo, aS
66e0: 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70  pace, sizeof(aSp
66f0: 61 63 65 29 2c 20 26 70 46 72 65 65 0a 20 20 20  ace), &pFree.   
6700: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
6710: 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
6720: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6730: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63    sqlite3VdbeRec
6740: 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d 3e  ordUnpack(pCur->
6750: 70 4b 65 79 49 6e 66 6f 2c 20 28 69 6e 74 29 6e  pKeyInfo, (int)n
6760: 4b 65 79 2c 20 70 4b 65 79 2c 20 70 49 64 78 4b  Key, pKey, pIdxK
6770: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  ey);.    if( pId
6780: 78 4b 65 79 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20  xKey->nField==0 
6790: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
67a0: 44 62 46 72 65 65 28 70 43 75 72 2d 3e 70 4b 65  DbFree(pCur->pKe
67b0: 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46 72 65 65  yInfo->db, pFree
67c0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
67d0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
67e0: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  KPT;.    }.  }el
67f0: 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65 79 20  se{.    pIdxKey 
6800: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  = 0;.  }.  rc = 
6810: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
6820: 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75 72 2c  toUnpacked(pCur,
6830: 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79 2c 20   pIdxKey, nKey, 
6840: 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20 20 69  bias, pRes);.  i
6850: 66 28 20 70 46 72 65 65 20 29 7b 0a 20 20 20 20  f( pFree ){.    
6860: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 43  sqlite3DbFree(pC
6870: 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  ur->pKeyInfo->db
6880: 2c 20 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20  , pFree);.  }.  
6890: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
68a0: 0a 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20  .** Restore the 
68b0: 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f  cursor to the po
68c0: 73 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e  sition it was in
68d0: 20 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f   (or as close to
68e0: 20 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a   as possible).**
68f0: 20 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72   when saveCursor
6900: 50 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63  Position() was c
6910: 61 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74  alled. Note that
6920: 20 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74   this call delet
6930: 65 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64  es the .** saved
6940: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73   position info s
6950: 74 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72  tored by saveCur
6960: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73  sorPosition(), s
6970: 6f 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  o there can be.*
6980: 2a 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66  * at most one ef
6990: 66 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43  fective restoreC
69a0: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
69b0: 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20  call after each 
69c0: 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f  .** saveCursorPo
69d0: 73 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61  sition()..*/.sta
69e0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 52 65 73  tic int btreeRes
69f0: 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
6a00: 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  on(BtCursor *pCu
6a10: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6a20: 69 6e 74 20 73 6b 69 70 4e 65 78 74 3b 0a 20 20  int skipNext;.  
6a30: 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
6a40: 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
6a50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
6a60: 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
6a70: 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
6a80: 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
6a90: 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
6aa0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
6ab0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20  Cur->skipNext;. 
6ac0: 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74   }.  pCur->eStat
6ad0: 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
6ae0: 49 44 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  ID;.  rc = btree
6af0: 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75  Moveto(pCur, pCu
6b00: 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e  r->pKey, pCur->n
6b10: 4b 65 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78  Key, 0, &skipNex
6b20: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
6b30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
6b40: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
6b50: 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75  ->pKey);.    pCu
6b60: 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20  r->pKey = 0;.   
6b70: 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
6b80: 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
6b90: 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
6ba0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
6bb0: 4c 49 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d  LID );.    pCur-
6bc0: 3e 73 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69  >skipNext |= ski
6bd0: 70 4e 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70  pNext;.    if( p
6be0: 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26  Cur->skipNext &&
6bf0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
6c00: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
6c10: 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
6c20: 65 20 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e  e = CURSOR_SKIPN
6c30: 45 58 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  EXT;.    }.  }. 
6c40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
6c50: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
6c60: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
6c70: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
6c80: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
6c90: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
6ca0: 62 74 72 65 65 52 65 73 74 6f 72 65 43 75 72 73  btreeRestoreCurs
6cb0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20  orPosition(p) : 
6cc0: 5c 0a 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  \.         SQLIT
6cd0: 45 5f 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  E_OK)../*.** Det
6ce0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f  ermine whether o
6cf0: 72 20 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68  r not a cursor h
6d00: 61 73 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68  as moved from th
6d10: 65 20 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65  e position where
6d20: 0a 2a 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20  .** it was last 
6d30: 70 6c 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62  placed, or has b
6d40: 65 65 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20  een invalidated 
6d50: 66 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65  for any other re
6d60: 61 73 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73  ason..** Cursors
6d70: 20 63 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74   can move when t
6d80: 68 65 20 72 6f 77 20 74 68 65 79 20 61 72 65 20  he row they are 
6d90: 70 6f 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64  pointing at is d
6da0: 65 6c 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72  eleted out.** fr
6db0: 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66  om under them, f
6dc0: 6f 72 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72  or example.  Cur
6dd0: 73 6f 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d  sor might also m
6de0: 6f 76 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a  ove if a btree.*
6df0: 2a 20 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e  * is rebalanced.
6e00: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74  .**.** Calling t
6e10: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
6e20: 20 61 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70   a NULL cursor p
6e30: 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66  ointer returns f
6e40: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20  alse..**.** Use 
6e50: 74 68 65 20 73 65 70 61 72 61 74 65 20 73 71 6c  the separate sql
6e60: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
6e70: 65 73 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65  estore() routine
6e80: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75   to restore a cu
6e90: 72 73 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20  rsor.** back to 
6ea0: 77 68 65 72 65 20 69 74 20 6f 75 67 68 74 20 74  where it ought t
6eb0: 6f 20 62 65 20 69 66 20 74 68 69 73 20 72 6f 75  o be if this rou
6ec0: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75  tine returns tru
6ed0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6ee0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
6ef0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
6f00: 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  Cur){.  return p
6f10: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
6f20: 53 4f 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a  SOR_VALID;.}../*
6f30: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6f40: 20 72 65 73 74 6f 72 65 73 20 61 20 63 75 72 73   restores a curs
6f50: 6f 72 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  or back to its o
6f60: 72 69 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e  riginal position
6f70: 20 61 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73   after it.** has
6f80: 20 62 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73   been moved by s
6f90: 6f 6d 65 20 6f 75 74 73 69 64 65 20 61 63 74 69  ome outside acti
6fa0: 76 69 74 79 20 28 73 75 63 68 20 61 73 20 61 20  vity (such as a 
6fb0: 62 74 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20  btree rebalance 
6fc0: 6f 72 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69  or.** a row havi
6fd0: 6e 67 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20  ng been deleted 
6fe0: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
6ff0: 68 65 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a  he cursor).  .**
7000: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
7010: 74 68 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52  the *pDifferentR
7020: 6f 77 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ow parameter is 
7030: 66 61 6c 73 65 20 69 66 20 74 68 65 20 63 75 72  false if the cur
7040: 73 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70  sor is left.** p
7050: 6f 69 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74  ointing at exact
7060: 6c 79 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e  ly the same row.
7070: 20 20 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20    *pDifferntRow 
7080: 69 73 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  is the row the c
7090: 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69  ursor.** was poi
70a0: 6e 74 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65  nting to has bee
70b0: 6e 20 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69  n deleted, forci
70c0: 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
70d0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a   point to some.*
70e0: 2a 20 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a  * nearby row..**
70f0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7100: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
7110: 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72  called for a cur
7120: 73 6f 72 20 74 68 61 74 20 6a 75 73 74 20 72 65  sor that just re
7130: 74 75 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66  turned.** TRUE f
7140: 72 6f 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65  rom sqlite3Btree
7150: 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29  CursorHasMoved()
7160: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7170: 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
7180: 72 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  re(BtCursor *pCu
7190: 72 2c 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65  r, int *pDiffere
71a0: 6e 74 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63  ntRow){.  int rc
71b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ;..  assert( pCu
71c0: 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
71d0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
71e0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
71f0: 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75    rc = restoreCu
7200: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
7210: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  r);.  if( rc ){.
7220: 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52      *pDifferentR
7230: 6f 77 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ow = 1;.    retu
7240: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
7250: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
7260: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
7270: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
7280: 77 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w = 1;.  }else{.
7290: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
72a0: 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b  ->skipNext==0 );
72b0: 0a 20 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74  .    *pDifferent
72c0: 52 6f 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Row = 0;.  }.  r
72d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
72e0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
72f0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
7300: 48 49 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  HINTS./*.** Prov
7310: 69 64 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65  ide hints to the
7320: 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61   cursor.  The pa
7330: 72 74 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69  rticular hint gi
7340: 76 65 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70  ven (and the typ
7350: 65 0a 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20  e.** and number 
7360: 6f 66 20 74 68 65 20 76 61 72 61 72 67 73 20 70  of the varargs p
7370: 61 72 61 6d 65 74 65 72 73 29 20 69 73 20 64 65  arameters) is de
7380: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
7390: 65 48 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72  eHintType.** par
73a0: 61 6d 65 74 65 72 2e 20 20 53 65 65 20 74 68 65  ameter.  See the
73b0: 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
73c0: 74 68 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a  the BTREE_HINT_*
73d0: 20 6d 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61   macros for deta
73e0: 69 6c 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ils..*/.void sql
73f0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
7400: 69 6e 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  int(BtCursor *pC
7410: 75 72 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70  ur, int eHintTyp
7420: 65 2c 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73  e, ...){.  /* Us
7430: 65 64 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65  ed only by syste
7440: 6d 20 74 68 61 74 20 73 75 62 73 74 69 74 75 74  m that substitut
7450: 65 20 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72  e their own stor
7460: 61 67 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a  age engine */.}.
7470: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72  #endif../*.** Pr
7480: 6f 76 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73  ovide flag hints
7490: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a   to the cursor..
74a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
74b0: 74 72 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c  treeCursorHintFl
74c0: 61 67 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ags(BtCursor *pC
74d0: 75 72 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b  ur, unsigned x){
74e0: 0a 20 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54  .  assert( x==BT
74f0: 52 45 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78  REE_SEEK_EQ || x
7500: 3d 3d 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44  ==BTREE_BULKLOAD
7510: 20 7c 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43   || x==0 );.  pC
7520: 75 72 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d  ur->hints = x;.}
7530: 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ...#ifndef SQLIT
7540: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
7550: 4d 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  M./*.** Given a 
7560: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
7570: 20 72 65 67 75 6c 61 72 20 64 61 74 61 62 61 73   regular databas
7580: 65 20 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74  e page, return t
7590: 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
75a0: 72 20 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65  r for the pointe
75b0: 72 2d 6d 61 70 20 70 61 67 65 20 74 68 61 74 20  r-map page that 
75c0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74  contains the ent
75d0: 72 79 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  ry for the.** in
75e0: 70 75 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  put page number.
75f0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  .**.** Return 0 
7600: 28 6e 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67  (not a valid pag
7610: 65 29 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73  e) for pgno==1 s
7620: 69 6e 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a  ince there is.**
7630: 20 6e 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   no pointer map 
7640: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7650: 70 61 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74  page 1.  The int
7660: 65 67 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67  egrity_check log
7670: 69 63 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74  ic.** requires t
7680: 68 61 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f  hat ptrmapPageno
7690: 28 2a 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61  (*,1)!=1..*/.sta
76a0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
76b0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
76c0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
76d0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
76e0: 4d 61 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20  MapPage;.  Pgno 
76f0: 69 50 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20  iPtrMap, ret;.  
7700: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7710: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
7720: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
7730: 70 67 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20  pgno<2 ) return 
7740: 30 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  0;.  nPagesPerMa
7750: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
7760: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
7770: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
7780: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
7790: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
77a0: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
77b0: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
77c0: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
77d0: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
77e0: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
77f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
7800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
7810: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
7820: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
7830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7840: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
7850: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
7860: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
7870: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
7880: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
7890: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
78a0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
78b0: 27 70 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66  'pgno'..**.** If
78c0: 20 2a 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c   *pRC is initial
78d0: 6c 79 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e  ly non-zero (non
78e0: 2d 53 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e  -SQLITE_OK) then
78f0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7900: 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66  .** a no-op.  If
7910: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
7920: 2c 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  , the appropriat
7930: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
7940: 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20  written.** into 
7950: 2a 70 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  *pRC..*/.static 
7960: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 28 42  void ptrmapPut(B
7970: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
7980: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
7990: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69  , Pgno parent, i
79a0: 6e 74 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61  nt *pRC){.  DbPa
79b0: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a  ge *pDbPage;  /*
79c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
79d0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
79e0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20  Ptrmap;      /* 
79f0: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
7a00: 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  data */.  Pgno i
7a10: 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54  Ptrmap;     /* T
7a20: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7a30: 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
7a40: 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20  int offset;     
7a50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70    /* Offset in p
7a60: 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20  ointer map page 
7a70: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
7a80: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
7a90: 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75   code from subfu
7aa0: 6e 63 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66  nctions */..  if
7ab0: 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b  ( *pRC ) return;
7ac0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
7ad0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7ae0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7af0: 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f  /* The master-jo
7b00: 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65  urnal page numbe
7b10: 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20  r must never be 
7b20: 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65  used as a pointe
7b30: 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20  r map page */.  
7b40: 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41  assert( 0==PTRMA
7b50: 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 50 45  P_ISPAGE(pBt, PE
7b60: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
7b70: 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65  pBt)) );..  asse
7b80: 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
7b90: 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79  uum );.  if( key
7ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20  ==0 ){.    *pRC 
7bb0: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
7bc0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
7bd0: 6e 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70  n;.  }.  iPtrmap
7be0: 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f   = PTRMAP_PAGENO
7bf0: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63  (pBt, key);.  rc
7c00: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
7c10: 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
7c20: 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67  iPtrmap, &pDbPag
7c30: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  e, 0);.  if( rc!
7c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7c50: 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
7c60: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f   return;.  }.  o
7c70: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
7c80: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
7c90: 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66  , key);.  if( of
7ca0: 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70  fset<0 ){.    *p
7cb0: 52 43 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  RC = SQLITE_CORR
7cc0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f  UPT_BKPT;.    go
7cd0: 74 6f 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a  to ptrmap_exit;.
7ce0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
7cf0: 66 73 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74  fset <= (int)pBt
7d00: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29  ->usableSize-5 )
7d10: 3b 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75  ;.  pPtrmap = (u
7d20: 38 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  8 *)sqlite3Pager
7d30: 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29  GetData(pDbPage)
7d40: 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  ;..  if( eType!=
7d50: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20  pPtrmap[offset] 
7d60: 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 74  || get4byte(&pPt
7d70: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21  rmap[offset+1])!
7d80: 3d 70 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54  =parent ){.    T
7d90: 52 41 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50  RACE(("PTRMAP_UP
7da0: 44 41 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64  DATE: %d->(%d,%d
7db0: 29 5c 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65  )\n", key, eType
7dc0: 2c 20 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20  , parent));.    
7dd0: 2a 70 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74  *pRC= rc = sqlit
7de0: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
7df0: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
7e00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7e10: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
7e20: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
7e30: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
7e40: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
7e50: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
7e60: 0a 20 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69  .  }..ptrmap_exi
7e70: 74 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t:.  sqlite3Page
7e80: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
7e90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
7ea0: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
7eb0: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
7ec0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
7ed0: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
7ee0: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
7ef0: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
7f00: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
7f10: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
7f20: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
7f30: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
7f40: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
7f50: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
7f60: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
7f70: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
7f80: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
7f90: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
7fa0: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
7fb0: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
7fc0: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
7fd0: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
7fe0: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
7ff0: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
8000: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
8010: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
8020: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8030: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
8040: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
8050: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
8060: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
8070: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
8080: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
8090: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
80a0: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
80b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
80c0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
80d0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
80e0: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
80f0: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
8100: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
8110: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
8120: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
8130: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
8140: 62 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28  bPage, 0);.  if(
8150: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
8160: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
8170: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
8180: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
8190: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
81a0: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
81b0: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
81c0: 70 2c 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f  p, key);.  if( o
81d0: 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73  ffset<0 ){.    s
81e0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
81f0: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72  (pDbPage);.    r
8200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8210: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
8220: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 20   assert( offset 
8230: 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61  <= (int)pBt->usa
8240: 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61  bleSize-5 );.  a
8250: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
8260: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
8270: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
8280: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
8290: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
82a0: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
82b0: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
82c0: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
82d0: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
82e0: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
82f0: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
8300: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8310: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8320: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
8330: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
8340: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
8350: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
8360: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
8370: 2c 72 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70  ,rc).  #define p
8380: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
8390: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
83a0: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
83b0: 76 66 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29  vflPtr(x, y, rc)
83c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47  .#endif../*.** G
83d0: 69 76 65 6e 20 61 20 62 74 72 65 65 20 70 61 67  iven a btree pag
83e0: 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64  e and a cell ind
83f0: 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20  ex (0 means the 
8400: 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a  first cell on.**
8410: 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61   the page, 1 mea
8420: 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65  ns the second ce
8430: 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  ll, and so forth
8440: 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  ) return a point
8450: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c  er.** to the cel
8460: 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a  l content..**.**
8470: 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
8480: 28 29 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  () does the same
8490: 20 65 78 63 65 70 74 20 69 74 20 73 6b 69 70 73   except it skips
84a0: 20 70 61 73 74 20 74 68 65 20 69 6e 69 74 69 61   past the initia
84b0: 6c 0a 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c  l.** 4-byte chil
84c0: 64 20 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20  d pointer found 
84d0: 6f 6e 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65  on interior page
84e0: 73 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  s, if there is o
84f0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ne..**.** This r
8500: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
8510: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
8520: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
8530: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
8540: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
8550: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
8560: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
8570: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
8580: 62 79 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29  byteAligned(&(P)
8590: 2d 3e 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29  ->aCellIdx[2*(I)
85a0: 5d 29 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e  ]))).#define fin
85b0: 64 43 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49  dCellPastPtr(P,I
85c0: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
85d0: 61 4f 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61  aOfst + ((P)->ma
85e0: 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74  skPage & get2byt
85f0: 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61  eAligned(&(P)->a
8600: 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29  CellIdx[2*(I)]))
8610: 29 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  ).../*.** This i
8620: 73 20 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72  s common tail pr
8630: 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72  ocessing for btr
8640: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
8650: 20 61 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72   and.** btreePar
8660: 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29  seCellPtrIndex()
8670: 20 66 6f 72 20 74 68 65 20 63 61 73 65 20 77 68   for the case wh
8680: 65 6e 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73  en the cell does
8690: 20 6e 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c   not fit entirel
86a0: 79 0a 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65  y.** on a single
86b0: 20 42 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d   B-tree page.  M
86c0: 61 6b 65 20 6e 65 63 65 73 73 61 72 79 20 61 64  ake necessary ad
86d0: 6a 75 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65  justments to the
86e0: 20 43 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72   CellInfo.** str
86f0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
8700: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
8710: 45 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  E void btreePars
8720: 65 43 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46  eCellAdjustSizeF
8730: 6f 72 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65  orOverflow(.  Me
8740: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
8750: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f        /* Page co
8760: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c  ntaining the cel
8770: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c  l */.  u8 *pCell
8780: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
8790: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
87a0: 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20   cell text. */. 
87b0: 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f   CellInfo *pInfo
87c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c           /* Fill
87d0: 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75   in this structu
87e0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66  re */.){.  /* If
87f0: 20 74 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c   the payload wil
8800: 6c 20 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65  l not fit comple
8810: 74 65 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61  tely on the loca
8820: 6c 20 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a  l page, we have.
8830: 20 20 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68    ** to decide h
8840: 6f 77 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65  ow much to store
8850: 20 6c 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77   locally and how
8860: 20 6d 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f   much to spill o
8870: 6e 74 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f  nto.  ** overflo
8880: 77 20 70 61 67 65 73 2e 20 20 54 68 65 20 73 74  w pages.  The st
8890: 72 61 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e  rategy is to min
88a0: 69 6d 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74  imize the amount
88b0: 20 6f 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20   of unused.  ** 
88c0: 73 70 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f  space on overflo
88d0: 77 20 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65  w pages while ke
88e0: 65 70 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74  eping the amount
88f0: 20 6f 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67   of local storag
8900: 65 0a 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65  e.  ** in betwee
8910: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
8920: 61 78 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  axLocal..  **.  
8930: 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61  ** Warning:  cha
8940: 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76  nging the way ov
8950: 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69  erflow payload i
8960: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69 6e  s distributed in
8970: 20 61 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69   any.  ** way wi
8980: 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20  ll result in an 
8990: 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  incompatible fil
89a0: 65 20 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20  e format..  */. 
89b0: 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20   int minLocal;  
89c0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e  /* Minimum amoun
89d0: 74 20 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c  t of payload hel
89e0: 64 20 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69  d locally */.  i
89f0: 6e 74 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a  nt maxLocal;  /*
8a00: 20 4d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Maximum amount 
8a10: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8a20: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8a30: 20 73 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f   surplus;   /* O
8a40: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
8a50: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f  available for lo
8a60: 63 61 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a  cal storage */..
8a70: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
8a80: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
8a90: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
8aa0: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75  ->maxLocal;.  su
8ab0: 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c  rplus = minLocal
8ac0: 20 2b 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c   + (pInfo->nPayl
8ad0: 6f 61 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25  oad - minLocal)%
8ae0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
8af0: 62 6c 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65  bleSize-4);.  te
8b00: 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d  stcase( surplus=
8b10: 3d 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74  =maxLocal );.  t
8b20: 65 73 74 63 61 73 65 28 20 73 75 72 70 6c 75 73  estcase( surplus
8b30: 3d 3d 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ==maxLocal+1 );.
8b40: 20 20 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d    if( surplus <=
8b50: 20 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20   maxLocal ){.   
8b60: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d   pInfo->nLocal =
8b70: 20 28 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20   (u16)surplus;. 
8b80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
8b90: 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36  o->nLocal = (u16
8ba0: 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20  )minLocal;.  }. 
8bb0: 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f   pInfo->iOverflo
8bc0: 77 20 3d 20 28 75 31 36 29 28 26 70 49 6e 66 6f  w = (u16)(&pInfo
8bd0: 2d 3e 70 50 61 79 6c 6f 61 64 5b 70 49 6e 66 6f  ->pPayload[pInfo
8be0: 2d 3e 6e 4c 6f 63 61 6c 5d 20 2d 20 70 43 65 6c  ->nLocal] - pCel
8bf0: 6c 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  l);.  pInfo->nSi
8c00: 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  ze = pInfo->iOve
8c10: 72 66 6c 6f 77 20 2b 20 34 3b 0a 7d 0a 0a 2f 2a  rflow + 4;.}../*
8c20: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
8c30: 67 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 69  g routines are i
8c40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
8c50: 66 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 78 50  f the MemPage.xP
8c60: 61 72 73 65 43 65 6c 6c 28 29 0a 2a 2a 20 6d 65  arseCell().** me
8c70: 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 73  thod..**.** Pars
8c80: 65 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  e a cell content
8c90: 20 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20   block and fill 
8ca0: 69 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20  in the CellInfo 
8cb0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a  structure..**.**
8cc0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
8cd0: 74 72 28 29 20 20 20 20 20 20 20 20 3d 3e 20 20  tr()        =>  
8ce0: 20 74 61 62 6c 65 20 62 74 72 65 65 20 6c 65 61   table btree lea
8cf0: 66 20 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65  f nodes.** btree
8d00: 50 61 72 73 65 43 65 6c 6c 4e 6f 50 61 79 6c 6f  ParseCellNoPaylo
8d10: 61 64 28 29 20 20 3d 3e 20 20 20 74 61 62 6c 65  ad()  =>   table
8d20: 20 62 74 72 65 65 20 69 6e 74 65 72 6e 61 6c 20   btree internal 
8d30: 6e 6f 64 65 73 0a 2a 2a 20 62 74 72 65 65 50 61  nodes.** btreePa
8d40: 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 28  rseCellPtrIndex(
8d50: 29 20 20 20 3d 3e 20 20 20 69 6e 64 65 78 20 62  )   =>   index b
8d60: 74 72 65 65 20 6e 6f 64 65 73 0a 2a 2a 0a 2a 2a  tree nodes.**.**
8d70: 20 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61   There is also a
8d80: 20 77 72 61 70 70 65 72 20 66 75 6e 63 74 69 6f   wrapper functio
8d90: 6e 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  n btreeParseCell
8da0: 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20 66 6f  () that works fo
8db0: 72 0a 2a 2a 20 61 6c 6c 20 4d 65 6d 50 61 67 65  r.** all MemPage
8dc0: 20 74 79 70 65 73 20 61 6e 64 20 74 68 61 74 20   types and that 
8dd0: 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20 63  references the c
8de0: 65 6c 6c 20 62 79 20 69 6e 64 65 78 20 72 61 74  ell by index rat
8df0: 68 65 72 20 74 68 61 6e 0a 2a 2a 20 62 79 20 70  her than.** by p
8e00: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ointer..*/.stati
8e10: 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72 73  c void btreePars
8e20: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
8e30: 64 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d(.  MemPage *pP
8e40: 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  age,         /* 
8e50: 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  Page containing 
8e60: 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38  the cell */.  u8
8e70: 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
8e80: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
8e90: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78   to the cell tex
8ea0: 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f  t. */.  CellInfo
8eb0: 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20   *pInfo         
8ec0: 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20  /* Fill in this 
8ed0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a  structure */.){.
8ee0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8ef0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8f00: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8f10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
8f20: 67 65 2d 3e 6c 65 61 66 3d 3d 30 20 29 3b 0a 20  ge->leaf==0 );. 
8f30: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
8f40: 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 61  noPayload );.  a
8f50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68  ssert( pPage->ch
8f60: 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29 3b  ildPtrSize==4 );
8f70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8f80: 44 45 42 55 47 0a 20 20 55 4e 55 53 45 44 5f 50  DEBUG.  UNUSED_P
8f90: 41 52 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b  ARAMETER(pPage);
8fa0: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 66 6f 2d  .#endif.  pInfo-
8fb0: 3e 6e 53 69 7a 65 20 3d 20 34 20 2b 20 67 65 74  >nSize = 4 + get
8fc0: 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 34 5d  Varint(&pCell[4]
8fd0: 2c 20 28 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e  , (u64*)&pInfo->
8fe0: 6e 4b 65 79 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e  nKey);.  pInfo->
8ff0: 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20  nPayload = 0;.  
9000: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
9010: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 4f 76 65  0;.  pInfo->iOve
9020: 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 70 49 6e  rflow = 0;.  pIn
9030: 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20 30  fo->pPayload = 0
9040: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73 74  ;.  return;.}.st
9050: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
9060: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
9070: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
9080: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
9090: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
90a0: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
90b0: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
90c0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
90d0: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
90e0: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
90f0: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
9100: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
9110: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a  ure */.){.  u8 *
9120: 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  pIter;          
9130: 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e 6e      /* For scann
9140: 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65 6c  ing through pCel
9150: 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  l */.  u32 nPayl
9160: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
9170: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
9180: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
9190: 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79 3b  d */.  u64 iKey;
91a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
91b0: 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79 20  * Extracted Key 
91c0: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73 65  value */..  asse
91d0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
91e0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
91f0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
9200: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
9210: 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e  af==0 || pPage->
9220: 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73 73  leaf==1 );.  ass
9230: 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
9240: 65 79 4c 65 61 66 20 7c 7c 20 70 50 61 67 65 2d  eyLeaf || pPage-
9250: 3e 6e 6f 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  >noPayload );.  
9260: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9270: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
9280: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9290: 69 6e 74 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20  intKeyLeaf );.  
92a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
92b0: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 30 20 29  hildPtrSize==0 )
92c0: 3b 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c  ;.  pIter = pCel
92d0: 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  l;..  /* The nex
92e0: 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20  t block of code 
92f0: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
9300: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
9310: 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61 72 69  pIter += getVari
9320: 6e 74 33 32 28 70 49 74 65 72 2c 20 6e 50 61 79  nt32(pIter, nPay
9330: 6c 6f 61 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a  load);.  **.  **
9340: 20 54 68 65 20 63 6f 64 65 20 69 73 20 69 6e 6c   The code is inl
9350: 69 6e 65 64 20 74 6f 20 61 76 6f 69 64 20 61 20  ined to avoid a 
9360: 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20  function call.. 
9370: 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d   */.  nPayload =
9380: 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28 20 6e   *pIter;.  if( n
9390: 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b  Payload>=0x80 ){
93a0: 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20 3d 20  .    u8 *pEnd = 
93b0: 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e  &pIter[8];.    n
93c0: 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b  Payload &= 0x7f;
93d0: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e  .    do{.      n
93e0: 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c  Payload = (nPayl
93f0: 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49  oad<<7) | (*++pI
9400: 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20  ter & 0x7f);.   
9410: 20 7d 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72   }while( (*pIter
9420: 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74 65 72  )>=0x80 && pIter
9430: 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70  <pEnd );.  }.  p
9440: 49 74 65 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68  Iter++;..  /* Th
9450: 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20  e next block of 
9460: 63 6f 64 65 20 69 73 20 65 71 75 69 76 61 6c 65  code is equivale
9470: 6e 74 20 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  nt to:.  **.  **
9480: 20 20 20 20 20 70 49 74 65 72 20 2b 3d 20 67 65       pIter += ge
9490: 74 56 61 72 69 6e 74 28 70 49 74 65 72 2c 20 28  tVarint(pIter, (
94a0: 75 36 34 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65  u64*)&pInfo->nKe
94b0: 79 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  y);.  **.  ** Th
94c0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
94d0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
94e0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
94f0: 0a 20 20 69 4b 65 79 20 3d 20 2a 70 49 74 65 72  .  iKey = *pIter
9500: 3b 0a 20 20 69 66 28 20 69 4b 65 79 3e 3d 30 78  ;.  if( iKey>=0x
9510: 38 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45  80 ){.    u8 *pE
9520: 6e 64 20 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a  nd = &pIter[7];.
9530: 20 20 20 20 69 4b 65 79 20 26 3d 20 30 78 37 66      iKey &= 0x7f
9540: 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b 0a  ;.    while(1){.
9550: 20 20 20 20 20 20 69 4b 65 79 20 3d 20 28 69 4b        iKey = (iK
9560: 65 79 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74  ey<<7) | (*++pIt
9570: 65 72 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20  er & 0x7f);.    
9580: 20 20 69 66 28 20 28 2a 70 49 74 65 72 29 3c 30    if( (*pIter)<0
9590: 78 38 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  x80 ) break;.   
95a0: 20 20 20 69 66 28 20 70 49 74 65 72 3e 3d 70 45     if( pIter>=pE
95b0: 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4b  nd ){.        iK
95c0: 65 79 20 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c  ey = (iKey<<8) |
95d0: 20 2a 2b 2b 70 49 74 65 72 3b 0a 20 20 20 20 20   *++pIter;.     
95e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
95f0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49  }.    }.  }.  pI
9600: 74 65 72 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d  ter++;..  pInfo-
9610: 3e 6e 4b 65 79 20 3d 20 2a 28 69 36 34 2a 29 26  >nKey = *(i64*)&
9620: 69 4b 65 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  iKey;.  pInfo->n
9630: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9640: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9650: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9660: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9670: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9680: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9690: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
96a0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
96b0: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
96c0: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
96d0: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
96e0: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
96f0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9700: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9710: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9720: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9730: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9740: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9750: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9760: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9770: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9780: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9790: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
97a0: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
97b0: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
97c0: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
97d0: 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f  yload;.    pInfo
97e0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->iOverflow = 0;
97f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74  .  }else{.    bt
9800: 72 65 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75  reeParseCellAdju
9810: 73 74 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f  stSizeForOverflo
9820: 77 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  w(pPage, pCell, 
9830: 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74  pInfo);.  }.}.st
9840: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 50  atic void btreeP
9850: 61 72 73 65 43 65 6c 6c 50 74 72 49 6e 64 65 78  arseCellPtrIndex
9860: 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
9870: 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ge,         /* P
9880: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
9890: 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  he cell */.  u8 
98a0: 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20  *pCell,         
98b0: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
98c0: 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74  to the cell text
98d0: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
98e0: 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f  *pInfo         /
98f0: 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73  * Fill in this s
9900: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
9910: 20 75 38 20 2a 70 49 74 65 72 3b 20 20 20 20 20   u8 *pIter;     
9920: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
9930: 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
9940: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 33 32 20   pCell */.  u32 
9950: 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20 20 20 20  nPayload;       
9960: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9970: 20 62 79 74 65 73 20 6f 66 20 63 65 6c 6c 20 70   bytes of cell p
9980: 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20 61 73 73  ayload */..  ass
9990: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
99a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
99b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
99c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
99d0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
99e0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
99f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9a00: 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  KeyLeaf==0 );.  
9a10: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
9a20: 6f 50 61 79 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20  oPayload==0 );. 
9a30: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b   pIter = pCell +
9a40: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
9a50: 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f 61 64  Size;.  nPayload
9a60: 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69 66 28   = *pIter;.  if(
9a70: 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38 30 20   nPayload>=0x80 
9a80: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9a90: 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20 20 20  = &pIter[8];.   
9aa0: 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30 78 37   nPayload &= 0x7
9ab0: 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  f;.    do{.     
9ac0: 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e 50 61   nPayload = (nPa
9ad0: 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a 2b 2b  yload<<7) | (*++
9ae0: 70 49 74 65 72 20 26 20 30 78 37 66 29 3b 0a 20  pIter & 0x7f);. 
9af0: 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70 49 74     }while( *(pIt
9b00: 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70 49 74  er)>=0x80 && pIt
9b10: 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 20  er<pEnd );.  }. 
9b20: 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49 6e 66   pIter++;.  pInf
9b30: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
9b40: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61  ad;.  pInfo->nPa
9b50: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
9b60: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c  ;.  pInfo->pPayl
9b70: 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74  oad = pIter;.  t
9b80: 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61  estcase( nPayloa
9b90: 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d==pPage->maxLoc
9ba0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
9bb0: 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67  ( nPayload==pPag
9bc0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b  e->maxLocal+1 );
9bd0: 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c  .  if( nPayload<
9be0: 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c  =pPage->maxLocal
9bf0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
9c00: 69 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f  is the (easy) co
9c10: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
9c20: 74 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f  the entire paylo
9c30: 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f  ad fits.    ** o
9c40: 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
9c50: 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69  .  No overflow i
9c60: 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20  s required..    
9c70: 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  */.    pInfo->nS
9c80: 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b  ize = nPayload +
9c90: 20 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70   (u16)(pIter - p
9ca0: 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70  Cell);.    if( p
9cb0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20  Info->nSize<4 ) 
9cc0: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34  pInfo->nSize = 4
9cd0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
9ce0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
9cf0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
9d00: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
9d10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 62 74 72 65   }else{.    btre
9d20: 65 50 61 72 73 65 43 65 6c 6c 41 64 6a 75 73 74  eParseCellAdjust
9d30: 53 69 7a 65 46 6f 72 4f 76 65 72 66 6c 6f 77 28  SizeForOverflow(
9d40: 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 70 49  pPage, pCell, pI
9d50: 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  nfo);.  }.}.stat
9d60: 69 63 20 76 6f 69 64 20 62 74 72 65 65 50 61 72  ic void btreePar
9d70: 73 65 43 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67  seCell(.  MemPag
9d80: 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20 20 20  e *pPage,       
9d90: 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69    /* Page contai
9da0: 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f  ning the cell */
9db0: 0a 20 20 69 6e 74 20 69 43 65 6c 6c 2c 20 20 20  .  int iCell,   
9dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9dd0: 65 20 63 65 6c 6c 20 69 6e 64 65 78 2e 20 20 46  e cell index.  F
9de0: 69 72 73 74 20 63 65 6c 6c 20 69 73 20 30 20 2a  irst cell is 0 *
9df0: 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49  /.  CellInfo *pI
9e00: 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46  nfo         /* F
9e10: 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75  ill in this stru
9e20: 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 70 50  cture */.){.  pP
9e30: 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28  age->xParseCell(
9e40: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
9e50: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 2c 20 70  pPage, iCell), p
9e60: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
9e70: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
9e80: 75 74 69 6e 65 73 20 61 72 65 20 69 6d 70 6c 65  utines are imple
9e90: 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 74 68  mentations of th
9ea0: 65 20 4d 65 6d 50 61 67 65 2e 78 43 65 6c 6c 53  e MemPage.xCellS
9eb0: 69 7a 65 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a  ize.** method..*
9ec0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  *.** Compute the
9ed0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
9ee0: 20 62 79 74 65 73 20 74 68 61 74 20 61 20 43 65   bytes that a Ce
9ef0: 6c 6c 20 6e 65 65 64 73 20 69 6e 20 74 68 65 20  ll needs in the 
9f00: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 61 72 65  cell.** data are
9f10: 61 20 6f 66 20 74 68 65 20 62 74 72 65 65 2d 70  a of the btree-p
9f20: 61 67 65 2e 20 20 54 68 65 20 72 65 74 75 72 6e  age.  The return
9f30: 20 6e 75 6d 62 65 72 20 69 6e 63 6c 75 64 65 73   number includes
9f40: 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 64 61 74   the cell.** dat
9f50: 61 20 68 65 61 64 65 72 20 61 6e 64 20 74 68 65  a header and the
9f60: 20 6c 6f 63 61 6c 20 70 61 79 6c 6f 61 64 2c 20   local payload, 
9f70: 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 76 65 72  but not any over
9f80: 66 6c 6f 77 20 70 61 67 65 20 6f 72 0a 2a 2a 20  flow page or.** 
9f90: 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20 62  the space used b
9fa0: 79 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  y the cell point
9fb0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 63 65 6c 6c 53 69  er..**.** cellSi
9fc0: 7a 65 50 74 72 4e 6f 50 61 79 6c 6f 61 64 28 29  zePtrNoPayload()
9fd0: 20 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 69      =>   table i
9fe0: 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a  nternal nodes.**
9ff0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 29 20 20   cellSizePtr()  
a000: 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 20 20             =>   
a010: 61 6c 6c 20 69 6e 64 65 78 20 6e 6f 64 65 73 20  all index nodes 
a020: 26 20 74 61 62 6c 65 20 6c 65 61 66 20 6e 6f 64  & table leaf nod
a030: 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  es.*/.static u16
a040: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 4d 65 6d   cellSizePtr(Mem
a050: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20  Page *pPage, u8 
a060: 2a 70 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70  *pCell){.  u8 *p
a070: 49 74 65 72 20 3d 20 70 43 65 6c 6c 20 2b 20 70  Iter = pCell + p
a080: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
a090: 7a 65 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69  ze; /* For loopi
a0a0: 6e 67 20 6f 76 65 72 20 62 79 74 65 73 20 6f 66  ng over bytes of
a0b0: 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a   pCell */.  u8 *
a0c0: 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20  pEnd;           
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0e0: 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61 72 6b       /* End mark
a0f0: 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20 2a 2f   for a varint */
a100: 0a 20 20 75 33 32 20 6e 53 69 7a 65 3b 20 20 20  .  u32 nSize;   
a110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
a130: 69 7a 65 20 76 61 6c 75 65 20 74 6f 20 72 65 74  ize value to ret
a140: 75 72 6e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  urn */..#ifdef S
a150: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
a160: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
a170: 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
a180: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77 61  tion should alwa
a190: 79 73 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  ys be the same a
a1a0: 73 0a 20 20 2a 2a 20 74 68 65 20 28 43 65 6c 6c  s.  ** the (Cell
a1b0: 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76 61 6c 75  Info.nSize) valu
a1c0: 65 20 66 6f 75 6e 64 20 62 79 20 64 6f 69 6e 67  e found by doing
a1d0: 20 61 20 66 75 6c 6c 20 70 61 72 73 65 20 6f 66   a full parse of
a1e0: 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20   the.  ** cell. 
a1f0: 49 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  If SQLITE_DEBUG 
a200: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  is defined, an a
a210: 73 73 65 72 74 28 29 20 61 74 20 74 68 65 20 62  ssert() at the b
a220: 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a 20 74 68  ottom of.  ** th
a230: 69 73 20 66 75 6e 63 74 69 6f 6e 20 76 65 72 69  is function veri
a240: 66 69 65 73 20 74 68 61 74 20 74 68 69 73 20 69  fies that this i
a250: 6e 76 61 72 69 61 6e 74 20 69 73 20 6e 6f 74 20  nvariant is not 
a260: 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a 20 20 43  violated. */.  C
a270: 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67 69 6e 66  ellInfo debuginf
a280: 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72  o;.  pPage->xPar
a290: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
a2a0: 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e 66 6f 29  ell, &debuginfo)
a2b0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
a2c0: 72 74 28 20 70 50 61 67 65 2d 3e 6e 6f 50 61 79  rt( pPage->noPay
a2d0: 6c 6f 61 64 3d 3d 30 20 29 3b 0a 20 20 6e 53 69  load==0 );.  nSi
a2e0: 7a 65 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ze = *pIter;.  i
a2f0: 66 28 20 6e 53 69 7a 65 3e 3d 30 78 38 30 20 29  f( nSize>=0x80 )
a300: 7b 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70 49  {.    pEnd = &pI
a310: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 53 69 7a  ter[8];.    nSiz
a320: 65 20 26 3d 20 30 78 37 66 3b 0a 20 20 20 20 64  e &= 0x7f;.    d
a330: 6f 7b 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d  o{.      nSize =
a340: 20 28 6e 53 69 7a 65 3c 3c 37 29 20 7c 20 28 2a   (nSize<<7) | (*
a350: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
a360: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
a370: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
a380: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
a390: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 69 66  .  pIter++;.  if
a3a0: 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
a3b0: 29 7b 0a 20 20 20 20 2f 2a 20 70 49 74 65 72 20  ){.    /* pIter 
a3c0: 6e 6f 77 20 70 6f 69 6e 74 73 20 61 74 20 74 68  now points at th
a3d0: 65 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72  e 64-bit integer
a3e0: 20 6b 65 79 20 76 61 6c 75 65 2c 20 61 20 76 61   key value, a va
a3f0: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 0a 20  riable length . 
a400: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 54     ** integer. T
a410: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
a420: 63 6b 20 6d 6f 76 65 73 20 70 49 74 65 72 20 74  ck moves pIter t
a430: 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 66  o point at the f
a440: 69 72 73 74 20 62 79 74 65 0a 20 20 20 20 2a 2a  irst byte.    **
a450: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a460: 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 2e 20   the key value. 
a470: 2a 2f 0a 20 20 20 20 70 45 6e 64 20 3d 20 26 70  */.    pEnd = &p
a480: 49 74 65 72 5b 39 5d 3b 0a 20 20 20 20 77 68 69  Iter[9];.    whi
a490: 6c 65 28 20 28 2a 70 49 74 65 72 2b 2b 29 26 30  le( (*pIter++)&0
a4a0: 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e  x80 && pIter<pEn
a4b0: 64 20 29 3b 0a 20 20 7d 0a 20 20 74 65 73 74 63  d );.  }.  testc
a4c0: 61 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67  ase( nSize==pPag
a4d0: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20  e->maxLocal );. 
a4e0: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a4f0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a500: 6c 2b 31 20 29 3b 0a 20 20 69 66 28 20 6e 53 69  l+1 );.  if( nSi
a510: 7a 65 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f  ze<=pPage->maxLo
a520: 63 61 6c 20 29 7b 0a 20 20 20 20 6e 53 69 7a 65  cal ){.    nSize
a530: 20 2b 3d 20 28 75 33 32 29 28 70 49 74 65 72 20   += (u32)(pIter 
a540: 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  - pCell);.    if
a550: 28 20 6e 53 69 7a 65 3c 34 20 29 20 6e 53 69 7a  ( nSize<4 ) nSiz
a560: 65 20 3d 20 34 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 4;.  }else{.
a570: 20 20 20 20 69 6e 74 20 6d 69 6e 4c 6f 63 61 6c      int minLocal
a580: 20 3d 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63   = pPage->minLoc
a590: 61 6c 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20  al;.    nSize = 
a5a0: 6d 69 6e 4c 6f 63 61 6c 20 2b 20 28 6e 53 69 7a  minLocal + (nSiz
a5b0: 65 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 20 25 20  e - minLocal) % 
a5c0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  (pPage->pBt->usa
a5d0: 62 6c 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20  bleSize - 4);.  
a5e0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a5f0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a600: 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  al );.    testca
a610: 73 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65  se( nSize==pPage
a620: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
a630: 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 70 50      if( nSize>pP
a640: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b  age->maxLocal ){
a650: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 6d  .      nSize = m
a660: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 7d 0a 20  inLocal;.    }. 
a670: 20 20 20 6e 53 69 7a 65 20 2b 3d 20 34 20 2b 20     nSize += 4 + 
a680: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
a690: 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ell);.  }.  asse
a6a0: 72 74 28 20 6e 53 69 7a 65 3d 3d 64 65 62 75 67  rt( nSize==debug
a6b0: 69 6e 66 6f 2e 6e 53 69 7a 65 20 7c 7c 20 43 4f  info.nSize || CO
a6c0: 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65  RRUPT_DB );.  re
a6d0: 74 75 72 6e 20 28 75 31 36 29 6e 53 69 7a 65 3b  turn (u16)nSize;
a6e0: 0a 7d 0a 73 74 61 74 69 63 20 75 31 36 20 63 65  .}.static u16 ce
a6f0: 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61 79 6c 6f  llSizePtrNoPaylo
a700: 61 64 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ad(MemPage *pPag
a710: 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20  e, u8 *pCell){. 
a720: 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70 43 65   u8 *pIter = pCe
a730: 6c 6c 20 2b 20 34 3b 20 2f 2a 20 46 6f 72 20 6c  ll + 4; /* For l
a740: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 62 79 74 65  ooping over byte
a750: 73 20 6f 66 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  s of pCell */.  
a760: 75 38 20 2a 70 45 6e 64 3b 20 20 20 20 20 20 20  u8 *pEnd;       
a770: 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6d 61         /* End ma
a780: 72 6b 20 66 6f 72 20 61 20 76 61 72 69 6e 74 20  rk for a varint 
a790: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
a7a0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65  E_DEBUG.  /* The
a7b0: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
a7c0: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
a7d0: 20 73 68 6f 75 6c 64 20 61 6c 77 61 79 73 20 62   should always b
a7e0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 0a 20 20  e the same as.  
a7f0: 2a 2a 20 74 68 65 20 28 43 65 6c 6c 49 6e 66 6f  ** the (CellInfo
a800: 2e 6e 53 69 7a 65 29 20 76 61 6c 75 65 20 66 6f  .nSize) value fo
a810: 75 6e 64 20 62 79 20 64 6f 69 6e 67 20 61 20 66  und by doing a f
a820: 75 6c 6c 20 70 61 72 73 65 20 6f 66 20 74 68 65  ull parse of the
a830: 0a 20 20 2a 2a 20 63 65 6c 6c 2e 20 49 66 20 53  .  ** cell. If S
a840: 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
a850: 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72  efined, an asser
a860: 74 28 29 20 61 74 20 74 68 65 20 62 6f 74 74 6f  t() at the botto
a870: 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 66  m of.  ** this f
a880: 75 6e 63 74 69 6f 6e 20 76 65 72 69 66 69 65 73  unction verifies
a890: 20 74 68 61 74 20 74 68 69 73 20 69 6e 76 61 72   that this invar
a8a0: 69 61 6e 74 20 69 73 20 6e 6f 74 20 76 69 6f 6c  iant is not viol
a8b0: 61 74 65 64 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49  ated. */.  CellI
a8c0: 6e 66 6f 20 64 65 62 75 67 69 6e 66 6f 3b 0a 20  nfo debuginfo;. 
a8d0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
a8e0: 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  ll(pPage, pCell,
a8f0: 20 26 64 65 62 75 67 69 6e 66 6f 29 3b 0a 23 65   &debuginfo);.#e
a900: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
a910: 41 4d 45 54 45 52 28 70 50 61 67 65 29 3b 0a 23  AMETER(pPage);.#
a920: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
a930: 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
a940: 53 69 7a 65 3d 3d 34 20 29 3b 0a 20 20 70 45 6e  Size==4 );.  pEn
a950: 64 20 3d 20 70 49 74 65 72 20 2b 20 39 3b 0a 20  d = pIter + 9;. 
a960: 20 77 68 69 6c 65 28 20 28 2a 70 49 74 65 72 2b   while( (*pIter+
a970: 2b 29 26 30 78 38 30 20 26 26 20 70 49 74 65 72  +)&0x80 && pIter
a980: 3c 70 45 6e 64 20 29 3b 0a 20 20 61 73 73 65 72  <pEnd );.  asser
a990: 74 28 20 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69  t( debuginfo.nSi
a9a0: 7a 65 3d 3d 28 75 31 36 29 28 70 49 74 65 72 20  ze==(u16)(pIter 
a9b0: 2d 20 70 43 65 6c 6c 29 20 7c 7c 20 43 4f 52 52  - pCell) || CORR
a9c0: 55 50 54 5f 44 42 20 29 3b 0a 20 20 72 65 74 75  UPT_DB );.  retu
a9d0: 72 6e 20 28 75 31 36 29 28 70 49 74 65 72 20 2d  rn (u16)(pIter -
a9e0: 20 70 43 65 6c 6c 29 3b 0a 7d 0a 0a 0a 23 69 66   pCell);.}...#if
a9f0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
aa00: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 74 69  ./* This variati
aa10: 6f 6e 20 6f 6e 20 63 65 6c 6c 53 69 7a 65 50 74  on on cellSizePt
aa20: 72 28 29 20 69 73 20 75 73 65 64 20 69 6e 73 69  r() is used insi
aa30: 64 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73  de of assert() s
aa40: 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 6c  tatements.** onl
aa50: 79 2e 20 2a 2f 0a 73 74 61 74 69 63 20 75 31 36  y. */.static u16
aa60: 20 63 65 6c 6c 53 69 7a 65 28 4d 65 6d 50 61 67   cellSize(MemPag
aa70: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43  e *pPage, int iC
aa80: 65 6c 6c 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ell){.  return p
aa90: 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  Page->xCellSize(
aaa0: 70 50 61 67 65 2c 20 66 69 6e 64 43 65 6c 6c 28  pPage, findCell(
aab0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 29 3b 0a  pPage, iCell));.
aac0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
aad0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
aae0: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
aaf0: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
ab00: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
ab10: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
ab20: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
ab30: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
ab40: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
ab50: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
ab60: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
ab70: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
ab80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 74  /.static void pt
ab90: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
aba0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
abb0: 38 20 2a 70 43 65 6c 6c 2c 20 69 6e 74 20 2a 70  8 *pCell, int *p
abc0: 52 43 29 7b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  RC){.  CellInfo 
abd0: 69 6e 66 6f 3b 0a 20 20 69 66 28 20 2a 70 52 43  info;.  if( *pRC
abe0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73   ) return;.  ass
abf0: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
ac00: 0a 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65  .  pPage->xParse
ac10: 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
ac20: 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
ac30: 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
ac40: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
ac50: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
ac60: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
ac70: 77 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  w]);.    ptrmapP
ac80: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
ac90: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
aca0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
acb0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
acc0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
acd0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
ace0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
acf0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
ad00: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
ad10: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
ad20: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
ad30: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
ad40: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
ad50: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
ad60: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
ad70: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
ad80: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
ad90: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ada0: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
adb0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
adc0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
add0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
ade0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
adf0: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
ae00: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
ae10: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
ae20: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
ae30: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
ae40: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
ae50: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
ae60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
ae70: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
ae80: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
ae90: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
aea0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
aeb0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
aec0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
aed0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
aee0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
af10: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af30: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
af40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
af50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
af60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
af70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
af80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
af90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
afb0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
afc0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
afe0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
aff0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
b000: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b020: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b030: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b040: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b070: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b080: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
b090: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
b0a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b0b0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
b0c0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
b0d0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
b0e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
b0f0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
b100: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
b110: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
b120: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
b130: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
b140: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
b150: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
b160: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
b170: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b190: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b1a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
b1b0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
b1c0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
b1d0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
b1e0: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
b1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b200: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b210: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b220: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b230: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b240: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b250: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b260: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b280: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b2c0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b2d0: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b2e0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b2f0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b300: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b310: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b320: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b330: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b340: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b350: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b360: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b370: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
b380: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b390: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
b3a0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
b3b0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
b3c0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
b3d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b3e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
b3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
b400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
b410: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
b420: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
b430: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
b440: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b450: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
b460: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
b470: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
b480: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
b490: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b4a0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b4b0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
b4c0: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
b4d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
b4e0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
b4f0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
b500: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
b510: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
b520: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b530: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b540: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b560: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b580: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
b590: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
b5a0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
b5b0: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
b5c0: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
b5d0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
b5e0: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
b5f0: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
b600: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
b610: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b630: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b640: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
b650: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
b660: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b670: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b680: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b690: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b6a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b6b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b6c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b6d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b6e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b6f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b700: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b710: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b720: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b730: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b740: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b750: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b760: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b770: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b780: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b790: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b7a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b7b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b7c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b7d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b7e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b7f0: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b800: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b820: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b830: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b840: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b850: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b860: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b870: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b880: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b890: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b8a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b8b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b8c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b8d0: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b8e0: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b8f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b910: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b930: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b940: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b950: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b960: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b970: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b980: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b990: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b9a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b9b0: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b9c0: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b9d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b9e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b9f0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
ba00: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
ba10: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
ba20: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
ba30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
ba40: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
ba50: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
ba60: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
ba70: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
ba80: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
ba90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
baa0: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
bab0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
bac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
bad0: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
bae0: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
baf0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
bb00: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
bb10: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
bb20: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
bb30: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
bb40: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
bb50: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
bb60: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
bb70: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
bb80: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
bb90: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
bba0: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
bbb0: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
bbc0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
bbd0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
bbe0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
bbf0: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
bc00: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
bc10: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
bc20: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
bc30: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
bc40: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
bc50: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
bc60: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
bc70: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
bc80: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bca0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
bcb0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
bcc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
bcd0: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
bce0: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
bcf0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
bd00: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
bd10: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
bd20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
bd30: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
bd40: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
bd50: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
bd60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bd70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bd80: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
bd90: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
bda0: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
bdb0: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
bdc0: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
bdd0: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
bde0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
bdf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
be00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
be10: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
be20: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
be30: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
be40: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
be50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
be60: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
be70: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
be80: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
be90: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
bea0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
beb0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
bec0: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
bed0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
bee0: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
bef0: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
bf00: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
bf10: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bf20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
bf30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
bf40: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
bf60: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
bf70: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
bf80: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
bf90: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
bfa0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
bfb0: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
bfc0: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
bfd0: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
bfe0: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
bff0: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
c000: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
c010: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
c020: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c030: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
c040: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
c050: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
c060: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
c070: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
c080: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
c090: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
c0a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
c0b0: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
c0c0: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
c0d0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
c0e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
c0f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
c100: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
c110: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
c120: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
c130: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
c140: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
c150: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
c160: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
c170: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
c180: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
c190: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
c1a0: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
c1b0: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
c1c0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
c1d0: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
c1e0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
c1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
c200: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
c210: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
c220: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
c230: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
c240: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
c250: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
c260: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
c270: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
c280: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
c290: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
c2a0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
c2b0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
c2c0: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
c2d0: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
c2e0: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
c2f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
c300: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
c310: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
c320: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
c330: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
c340: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
c350: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
c360: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
c370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
c380: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
c390: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
c3a0: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
c3b0: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
c3c0: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
c3d0: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
c3e0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
c3f0: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
c400: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
c410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
c420: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
c430: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
c440: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
c450: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
c460: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
c470: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
c480: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
c490: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
c4a0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
c4b0: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
c4c0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
c4d0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c4e0: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
c4f0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
c500: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
c510: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
c520: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
c530: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
c540: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
c550: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
c560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c580: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
c590: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c5b0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c5d0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
c5e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
c5f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c600: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
c610: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
c620: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
c630: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
c640: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c650: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c660: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c670: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c680: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c690: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c6a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c6b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c6c0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c6d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c6e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c700: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c710: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c720: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c730: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c740: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c760: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c770: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c780: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c790: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c7a0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c7b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c7c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c7d0: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c7e0: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c7f0: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c800: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c810: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c820: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c830: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c840: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c850: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c860: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c870: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c880: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c890: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c8a0: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c8b0: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c8c0: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c8d0: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c8e0: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c8f0: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c900: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c910: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c920: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c930: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c940: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c950: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c960: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c970: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c980: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c990: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c9a0: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c9b0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c9c0: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c9d0: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c9e0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c9f0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ca00: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ca10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ca20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ca30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
ca40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ca50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
ca60: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
ca70: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
ca80: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
ca90: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
caa0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
cab0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
cac0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
cad0: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
cae0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
caf0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
cb00: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
cb10: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
cb20: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
cb30: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
cb40: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
cb50: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
cb60: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
cb70: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
cb80: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
cb90: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
cba0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
cbb0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
cbc0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
cbd0: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
cbe0: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
cbf0: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
cc00: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
cc10: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
cc20: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
cc30: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
cc40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
cc60: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
cc70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cc80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cc90: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
cca0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
ccb0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
ccc0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
ccd0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
cce0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
ccf0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
cd00: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
cd10: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
cd20: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
cd30: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
cd40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cd50: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
cd60: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
cd70: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
cd80: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
cd90: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cda0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
cdb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
cdc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
cdd0: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
cde0: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
cdf0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
ce00: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
ce10: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
ce20: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ce30: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
ce40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ce50: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
ce60: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
ce70: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
ce80: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
ce90: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
cea0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
ceb0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
cec0: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
ced0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
cee0: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
cef0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
cf00: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
cf10: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
cf20: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
cf30: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
cf40: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
cf50: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
cf60: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
cf70: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
cf80: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
cf90: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cfa0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
cfb0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
cfc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cfd0: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
cfe0: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
cff0: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
d000: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
d010: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d020: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
d030: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
d040: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
d050: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
d060: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
d070: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
d080: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
d090: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
d0a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
d0b0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
d0c0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
d0d0: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
d0e0: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
d0f0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
d100: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
d110: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
d120: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
d130: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
d140: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
d150: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
d160: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
d170: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
d180: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
d190: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
d1a0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
d1b0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
d1c0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
d1d0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
d1e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d1f0: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
d200: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
d210: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
d220: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
d230: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
d240: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
d250: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d280: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
d290: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
d2a0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
d2d0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
d2e0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
d2f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
d320: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
d330: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
d340: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d360: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
d370: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
d380: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
d390: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
d3a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
d3b0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
d3c0: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
d3d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d3e0: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
d3f0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
d400: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d410: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
d420: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
d430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d440: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
d450: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
d460: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d470: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
d480: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
d490: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
d4a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d4b0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d4c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d4d0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d4e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d4f0: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
d500: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
d510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
d520: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
d530: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
d540: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
d550: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
d560: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d580: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d590: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
d5b0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
d5c0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
d5d0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d5e0: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
d5f0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
d600: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
d610: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
d620: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
d630: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
d640: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
d650: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
d660: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d670: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d680: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d690: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d6a0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d6b0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d6c0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d6d0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d6e0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d6f0: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d700: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d710: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d720: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d730: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d740: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d750: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d760: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d770: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d780: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d790: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d7a0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d7b0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d7c0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d7e0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d800: 50 74 72 5d 29 29 3e 30 20 26 26 20 69 46 72 65  Ptr]))>0 && iFre
d810: 65 42 6c 6b 3c 69 53 74 61 72 74 20 29 7b 0a 20  eBlk<iStart ){. 
d820: 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42 6c       if( iFreeBl
d830: 6b 3c 69 50 74 72 2b 34 20 29 20 72 65 74 75 72  k<iPtr+4 ) retur
d840: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
d850: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 50 74  _BKPT;.      iPt
d860: 72 20 3d 20 69 46 72 65 65 42 6c 6b 3b 0a 20 20  r = iFreeBlk;.  
d870: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 46 72 65    }.    if( iFre
d880: 65 42 6c 6b 3e 69 4c 61 73 74 20 29 20 72 65 74  eBlk>iLast ) ret
d890: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d8a0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 61 73 73  PT_BKPT;.    ass
d8b0: 65 72 74 28 20 69 46 72 65 65 42 6c 6b 3e 69 50  ert( iFreeBlk>iP
d8c0: 74 72 20 7c 7c 20 69 46 72 65 65 42 6c 6b 3d 3d  tr || iFreeBlk==
d8d0: 30 20 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 41  0 );.  .    /* A
d8e0: 74 20 74 68 69 73 20 70 6f 69 6e 74 3a 0a 20 20  t this point:.  
d8f0: 20 20 2a 2a 20 20 20 20 69 46 72 65 65 42 6c 6b    **    iFreeBlk
d900: 3a 20 20 20 46 69 72 73 74 20 66 72 65 65 62 6c  :   First freebl
d910: 6f 63 6b 20 61 66 74 65 72 20 69 53 74 61 72 74  ock after iStart
d920: 2c 20 6f 72 20 7a 65 72 6f 20 69 66 20 6e 6f 6e  , or zero if non
d930: 65 0a 20 20 20 20 2a 2a 20 20 20 20 69 50 74 72  e.    **    iPtr
d940: 3a 20 20 20 20 20 20 20 54 68 65 20 61 64 64 72  :       The addr
d950: 65 73 73 20 6f 66 20 61 20 70 6f 69 6e 74 65 72  ess of a pointer
d960: 20 74 6f 20 69 46 72 65 65 42 6c 6b 0a 20 20 20   to iFreeBlk.   
d970: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b   **.    ** Check
d980: 20 74 6f 20 73 65 65 20 69 66 20 69 46 72 65 65   to see if iFree
d990: 42 6c 6b 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Blk should be co
d9a0: 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68 65  alesced onto the
d9b0: 20 65 6e 64 20 6f 66 20 69 53 74 61 72 74 2e 0a   end of iStart..
d9c0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
d9d0: 46 72 65 65 42 6c 6b 20 26 26 20 69 45 6e 64 2b  FreeBlk && iEnd+
d9e0: 33 3e 3d 69 46 72 65 65 42 6c 6b 20 29 7b 0a 20  3>=iFreeBlk ){. 
d9f0: 20 20 20 20 20 6e 46 72 61 67 20 3d 20 69 46 72       nFrag = iFr
da00: 65 65 42 6c 6b 20 2d 20 69 45 6e 64 3b 0a 20 20  eeBlk - iEnd;.  
da10: 20 20 20 20 69 66 28 20 69 45 6e 64 3e 69 46 72      if( iEnd>iFr
da20: 65 65 42 6c 6b 20 29 20 72 65 74 75 72 6e 20 53  eeBlk ) return S
da30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
da40: 50 54 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d  PT;.      iEnd =
da50: 20 69 46 72 65 65 42 6c 6b 20 2b 20 67 65 74 32   iFreeBlk + get2
da60: 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65 65  byte(&data[iFree
da70: 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  Blk+2]);.      i
da80: 66 28 20 69 45 6e 64 20 3e 20 70 50 61 67 65 2d  f( iEnd > pPage-
da90: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
daa0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
dab0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
dac0: 20 20 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e       iSize = iEn
dad0: 64 20 2d 20 69 53 74 61 72 74 3b 0a 20 20 20 20  d - iStart;.    
dae0: 20 20 69 46 72 65 65 42 6c 6b 20 3d 20 67 65 74    iFreeBlk = get
daf0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 46 72 65  2byte(&data[iFre
db00: 65 42 6c 6b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  eBlk]);.    }.  
db10: 0a 20 20 20 20 2f 2a 20 49 66 20 69 50 74 72 20  .    /* If iPtr 
db20: 69 73 20 61 6e 6f 74 68 65 72 20 66 72 65 65 62  is another freeb
db30: 6c 6f 63 6b 20 28 74 68 61 74 20 69 73 2c 20 69  lock (that is, i
db40: 66 20 69 50 74 72 20 69 73 20 6e 6f 74 20 74 68  f iPtr is not th
db50: 65 20 66 72 65 65 6c 69 73 74 0a 20 20 20 20 2a  e freelist.    *
db60: 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  * pointer in the
db70: 20 70 61 67 65 20 68 65 61 64 65 72 29 20 74 68   page header) th
db80: 65 6e 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  en check to see 
db90: 69 66 20 69 53 74 61 72 74 20 73 68 6f 75 6c 64  if iStart should
dba0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 6f 61 6c 65   be.    ** coale
dbb0: 73 63 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  sced onto the en
dbc0: 64 20 6f 66 20 69 50 74 72 2e 0a 20 20 20 20 2a  d of iPtr..    *
dbd0: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 3e 68  /.    if( iPtr>h
dbe0: 64 72 2b 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  dr+1 ){.      in
dbf0: 74 20 69 50 74 72 45 6e 64 20 3d 20 69 50 74 72  t iPtrEnd = iPtr
dc00: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
dc10: 61 5b 69 50 74 72 2b 32 5d 29 3b 0a 20 20 20 20  a[iPtr+2]);.    
dc20: 20 20 69 66 28 20 69 50 74 72 45 6e 64 2b 33 3e    if( iPtrEnd+3>
dc30: 3d 69 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20  =iStart ){.     
dc40: 20 20 20 69 66 28 20 69 50 74 72 45 6e 64 3e 69     if( iPtrEnd>i
dc50: 53 74 61 72 74 20 29 20 72 65 74 75 72 6e 20 53  Start ) return S
dc60: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
dc70: 50 54 3b 0a 20 20 20 20 20 20 20 20 6e 46 72 61  PT;.        nFra
dc80: 67 20 2b 3d 20 69 53 74 61 72 74 20 2d 20 69 50  g += iStart - iP
dc90: 74 72 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 69  trEnd;.        i
dca0: 53 69 7a 65 20 3d 20 69 45 6e 64 20 2d 20 69 50  Size = iEnd - iP
dcb0: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61  tr;.        iSta
dcc0: 72 74 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 20  rt = iPtr;.     
dcd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
dce0: 20 6e 46 72 61 67 3e 64 61 74 61 5b 68 64 72 2b   nFrag>data[hdr+
dcf0: 37 5d 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  7] ) return SQLI
dd00: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
dd10: 0a 20 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  .    data[hdr+7]
dd20: 20 2d 3d 20 6e 46 72 61 67 3b 0a 20 20 7d 0a 20   -= nFrag;.  }. 
dd30: 20 69 66 28 20 69 53 74 61 72 74 3d 3d 67 65 74   if( iStart==get
dd40: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
dd50: 35 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  5]) ){.    /* Th
dd60: 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b 20  e new freeblock 
dd70: 69 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  is at the beginn
dd80: 69 6e 67 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ing of the cell 
dd90: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2c 0a 20 20  content area,.  
dda0: 20 20 2a 2a 20 73 6f 20 6a 75 73 74 20 65 78 74    ** so just ext
ddb0: 65 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  end the cell con
ddc0: 74 65 6e 74 20 61 72 65 61 20 72 61 74 68 65 72  tent area rather
ddd0: 20 74 68 61 6e 20 63 72 65 61 74 65 20 61 6e 6f   than create ano
dde0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 66 72 65 65  ther.    ** free
ddf0: 6c 69 73 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  list entry */.  
de00: 20 20 69 66 28 20 69 50 74 72 21 3d 68 64 72 2b    if( iPtr!=hdr+
de10: 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  1 ) return SQLIT
de20: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
de30: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
de40: 74 61 5b 68 64 72 2b 31 5d 2c 20 69 46 72 65 65  ta[hdr+1], iFree
de50: 42 6c 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79  Blk);.    put2by
de60: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
de70: 20 69 45 6e 64 29 3b 0a 20 20 7d 65 6c 73 65 7b   iEnd);.  }else{
de80: 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 74  .    /* Insert t
de90: 68 65 20 6e 65 77 20 66 72 65 65 62 6c 6f 63 6b  he new freeblock
dea0: 20 69 6e 74 6f 20 74 68 65 20 66 72 65 65 6c 69   into the freeli
deb0: 73 74 20 2a 2f 0a 20 20 20 20 70 75 74 32 62 79  st */.    put2by
dec0: 74 65 28 26 64 61 74 61 5b 69 50 74 72 5d 2c 20  te(&data[iPtr], 
ded0: 69 53 74 61 72 74 29 3b 0a 20 20 20 20 70 75 74  iStart);.    put
dee0: 32 62 79 74 65 28 26 64 61 74 61 5b 69 53 74 61  2byte(&data[iSta
def0: 72 74 5d 2c 20 69 46 72 65 65 42 6c 6b 29 3b 0a  rt], iFreeBlk);.
df00: 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
df10: 74 61 5b 69 53 74 61 72 74 2b 32 5d 2c 20 69 53  ta[iStart+2], iS
df20: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
df30: 65 2d 3e 6e 46 72 65 65 20 2b 3d 20 69 4f 72 69  e->nFree += iOri
df40: 67 53 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20  gSize;.  return 
df50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
df60: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
df70: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
df80: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
df90: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
dfa0: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
dfb0: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
dfc0: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
dfd0: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
dfe0: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
dff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
e000: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
e010: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
e020: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
e030: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
e040: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
e050: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
e060: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
e070: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
e080: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
e090: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
e0a0: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
e0b0: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
e0c0: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
e0d0: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
e0e0: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
e0f0: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
e100: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
e110: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
e120: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
e130: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
e140: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
e150: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
e160: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
e170: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
e180: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
e190: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
e1a0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
e1b0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
e1c0: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28 75 38  Page->leaf = (u8
e1d0: 29 28 66 6c 61 67 42 79 74 65 3e 3e 33 29 3b 20  )(flagByte>>3); 
e1e0: 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c 45 41   assert( PTF_LEA
e1f0: 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20 20 66  F == 1<<3 );.  f
e200: 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54 46 5f  lagByte &= ~PTF_
e210: 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d 3e 63  LEAF;.  pPage->c
e220: 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20 34 2d  hildPtrSize = 4-
e230: 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
e240: 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a   pPage->xCellSiz
e250: 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 3b  e = cellSizePtr;
e260: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
e270: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
e280: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
e290: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
e2a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
e2b0: 4e 43 45 2d 4f 46 3a 20 52 2d 30 33 36 34 30 2d  NCE-OF: R-03640-
e2c0: 31 33 34 31 35 20 41 20 76 61 6c 75 65 20 6f 66  13415 A value of
e2d0: 20 35 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67   5 means the pag
e2e0: 65 20 69 73 20 61 6e 20 69 6e 74 65 72 69 6f 72  e is an interior
e2f0: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 62 2d  .    ** table b-
e300: 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20  tree page. */.  
e310: 20 20 61 73 73 65 72 74 28 20 28 50 54 46 5f 4c    assert( (PTF_L
e320: 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e 54 4b  EAFDATA|PTF_INTK
e330: 45 59 29 3d 3d 35 20 29 3b 0a 20 20 20 20 2f 2a  EY)==5 );.    /*
e340: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
e350: 32 30 35 30 31 2d 36 31 37 39 36 20 41 20 76 61  20501-61796 A va
e360: 6c 75 65 20 6f 66 20 31 33 20 6d 65 61 6e 73 20  lue of 13 means 
e370: 74 68 65 20 70 61 67 65 20 69 73 20 61 20 6c 65  the page is a le
e380: 61 66 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20  af.    ** table 
e390: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
e3a0: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
e3b0: 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f 49 4e  _LEAFDATA|PTF_IN
e3c0: 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29 3d 3d  TKEY|PTF_LEAF)==
e3d0: 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  13 );.    pPage-
e3e0: 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20  >intKey = 1;.   
e3f0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
e400: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 2d   ){.      pPage-
e410: 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 31 3b  >intKeyLeaf = 1;
e420: 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 6f  .      pPage->no
e430: 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20 20 20  Payload = 0;.   
e440: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
e450: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
e460: 65 43 65 6c 6c 50 74 72 3b 0a 20 20 20 20 7d 65  eCellPtr;.    }e
e470: 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
e480: 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20 30  ->intKeyLeaf = 0
e490: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e  ;.      pPage->n
e4a0: 6f 50 61 79 6c 6f 61 64 20 3d 20 31 3b 0a 20 20  oPayload = 1;.  
e4b0: 20 20 20 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c      pPage->xCell
e4c0: 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Size = cellSizeP
e4d0: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
e4e0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
e4f0: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
e500: 65 43 65 6c 6c 50 74 72 4e 6f 50 61 79 6c 6f 61  eCellPtrNoPayloa
e510: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  d;.    }.    pPa
e520: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70  ge->maxLocal = p
e530: 42 74 2d 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20  Bt->maxLeaf;.   
e540: 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c   pPage->minLocal
e550: 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b   = pBt->minLeaf;
e560: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
e570: 67 42 79 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44  gByte==PTF_ZEROD
e580: 41 54 41 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ATA ){.    /* EV
e590: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 37 32  IDENCE-OF: R-272
e5a0: 32 35 2d 35 33 39 33 36 20 41 20 76 61 6c 75 65  25-53936 A value
e5b0: 20 6f 66 20 32 20 6d 65 61 6e 73 20 74 68 65 20   of 2 means the 
e5c0: 70 61 67 65 20 69 73 20 61 6e 20 69 6e 74 65 72  page is an inter
e5d0: 69 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78  ior.    ** index
e5e0: 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f   b-tree page. */
e5f0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54  .    assert( (PT
e600: 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20 29  F_ZERODATA)==2 )
e610: 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
e620: 45 2d 4f 46 3a 20 52 2d 31 36 35 37 31 2d 31 31  E-OF: R-16571-11
e630: 36 31 35 20 41 20 76 61 6c 75 65 20 6f 66 20 31  615 A value of 1
e640: 30 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  0 means the page
e650: 20 69 73 20 61 20 6c 65 61 66 0a 20 20 20 20 2a   is a leaf.    *
e660: 2a 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 70  * index b-tree p
e670: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  age. */.    asse
e680: 72 74 28 20 28 50 54 46 5f 5a 45 52 4f 44 41 54  rt( (PTF_ZERODAT
e690: 41 7c 50 54 46 5f 4c 45 41 46 29 3d 3d 31 30 20  A|PTF_LEAF)==10 
e6a0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  );.    pPage->in
e6b0: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
e6c0: 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20  age->intKeyLeaf 
e6d0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  = 0;.    pPage->
e6e0: 6e 6f 50 61 79 6c 6f 61 64 20 3d 20 30 3b 0a 20  noPayload = 0;. 
e6f0: 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65     pPage->xParse
e700: 43 65 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73  Cell = btreePars
e710: 65 43 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20  eCellPtrIndex;. 
e720: 20 20 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63     pPage->maxLoc
e730: 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  al = pBt->maxLoc
e740: 61 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d  al;.    pPage->m
e750: 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d  inLocal = pBt->m
e760: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65  inLocal;.  }else
e770: 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
e780: 45 2d 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36  E-OF: R-47608-56
e790: 34 36 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61  469 Any other va
e7a0: 6c 75 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72  lue for the b-tr
e7b0: 65 65 20 70 61 67 65 20 74 79 70 65 20 69 73 0a  ee page type is.
e7c0: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e      ** an error.
e7d0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
e7e0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
e7f0: 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  PT;.  }.  pPage-
e800: 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64  >max1bytePayload
e810: 20 3d 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65   = pBt->max1byte
e820: 50 61 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72  Payload;.  retur
e830: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
e840: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
e850: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
e860: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
e870: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
e880: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
e890: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
e8a0: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
e8b0: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
e8c0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
e8d0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
e8e0: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
e8f0: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
e900: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
e910: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
e920: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
e930: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
e940: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
e950: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
e960: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
e970: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
e980: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
e990: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
e9a0: 74 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69  tic int btreeIni
e9b0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
e9c0: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
e9d0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
e9e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e9f0: 67 65 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29  ge->pBt->db!=0 )
ea00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
ea10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
ea20: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
ea30: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
ea40: 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69  Page->pgno==sqli
ea50: 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
ea60: 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  er(pPage->pDbPag
ea70: 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e) );.  assert( 
ea80: 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33  pPage == sqlite3
ea90: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
eaa0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
eab0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
eac0: 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74  ->aData == sqlit
ead0: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
eae0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
eaf0: 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  ;..  if( !pPage-
eb00: 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75  >isInit ){.    u
eb10: 31 36 20 70 63 3b 20 20 20 20 20 20 20 20 20 20  16 pc;          
eb20: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
eb30: 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68  a freeblock with
eb40: 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
eb50: 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b  ] */.    u8 hdr;
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
eb70: 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69  ffset to beginni
eb80: 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ng of page heade
eb90: 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74  r */.    u8 *dat
eba0: 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  a;          /* E
ebb0: 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61  qual to pPage->a
ebc0: 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68  Data */.    BtSh
ebd0: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
ebe0: 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74    /* The main bt
ebf0: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
ec00: 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53  .    int usableS
ec10: 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e  ize;    /* Amoun
ec20: 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63  t of usable spac
ec30: 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a  e on each page *
ec40: 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66  /.    u16 cellOf
ec50: 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73  fset;    /* Offs
ec60: 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66  et from start of
ec70: 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63   page to first c
ec80: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
ec90: 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20     int nFree;   
eca0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
ecb0: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
ecc0: 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  on the page */. 
ecd0: 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20     int top;     
ece0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
ecf0: 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  yte of the cell 
ed00: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a  content area */.
ed10: 20 20 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72      int iCellFir
ed20: 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20  st;    /* First 
ed30: 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f  allowable cell o
ed40: 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73  r freeblock offs
ed50: 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  et */.    int iC
ed60: 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20  ellLast;     /* 
ed70: 4c 61 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65  Last possible ce
ed80: 6c 6c 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20  ll or freeblock 
ed90: 6f 66 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70  offset */..    p
eda0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
edb0: 0a 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ..    hdr = pPag
edc0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
edd0: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
ede0: 61 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56  aData;.    /* EV
edf0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35  IDENCE-OF: R-285
ee00: 39 34 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65  94-02890 The one
ee10: 2d 62 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66  -byte flag at of
ee20: 66 73 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e  fset 0 indicatin
ee30: 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74  g.    ** the b-t
ee40: 72 65 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a  ree page type. *
ee50: 2f 0a 20 20 20 20 69 66 28 20 64 65 63 6f 64 65  /.    if( decode
ee60: 46 6c 61 67 73 28 70 50 61 67 65 2c 20 64 61 74  Flags(pPage, dat
ee70: 61 5b 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e  a[hdr]) ) return
ee80: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
ee90: 42 4b 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74  BKPT;.    assert
eea0: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  ( pBt->pageSize>
eeb0: 3d 35 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67  =512 && pBt->pag
eec0: 65 53 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a  eSize<=65536 );.
eed0: 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50      pPage->maskP
eee0: 61 67 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d  age = (u16)(pBt-
eef0: 3e 70 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a  >pageSize - 1);.
ef00: 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72      pPage->nOver
ef10: 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73  flow = 0;.    us
ef20: 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
ef30: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20  usableSize;.    
ef40: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
ef50: 74 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d  t = cellOffset =
ef60: 20 68 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65   hdr + 8 + pPage
ef70: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a  ->childPtrSize;.
ef80: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
ef90: 45 6e 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62  End = &data[usab
efa0: 6c 65 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61  leSize];.    pPa
efb0: 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26  ge->aCellIdx = &
efc0: 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d  data[cellOffset]
efd0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61  ;.    pPage->aDa
efe0: 74 61 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70  taOfst = &data[p
eff0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
f000: 7a 65 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ze];.    /* EVID
f010: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35  ENCE-OF: R-58015
f020: 2d 34 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62  -48175 The two-b
f030: 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f  yte integer at o
f040: 66 66 73 65 74 20 35 20 64 65 73 69 67 6e 61 74  ffset 5 designat
f050: 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  es.    ** the st
f060: 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  art of the cell 
f070: 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20  content area. A 
f080: 7a 65 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74  zero value for t
f090: 68 69 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20  his integer is. 
f0a0: 20 20 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65     ** interprete
f0b0: 64 20 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20  d as 65536. */. 
f0c0: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
f0d0: 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68  eNotZero(&data[h
f0e0: 64 72 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45  dr+5]);.    /* E
f0f0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
f100: 30 30 32 2d 33 32 37 37 34 20 54 68 65 20 74 77  002-32774 The tw
f110: 6f 2d 62 79 74 65 20 69 6e 74 65 67 65 72 20 61  o-byte integer a
f120: 74 20 6f 66 66 73 65 74 20 33 20 67 69 76 65 73  t offset 3 gives
f130: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62   the.    ** numb
f140: 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74  er of cells on t
f150: 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  he page. */.    
f160: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67  pPage->nCell = g
f170: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
f180: 72 2b 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70  r+3]);.    if( p
f190: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43  Page->nCell>MX_C
f1a0: 45 4c 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ELL(pBt) ){.    
f1b0: 20 20 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c    /* To many cel
f1c0: 6c 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  ls for a single 
f1d0: 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
f1e0: 6d 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 20  must be corrupt 
f1f0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
f200: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
f210: 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  KPT;.    }.    t
f220: 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
f230: 6e 43 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70  nCell==MX_CELL(p
f240: 42 74 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56  Bt) );.    /* EV
f250: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
f260: 38 39 2d 35 37 39 37 39 20 49 66 20 61 20 70 61  89-57979 If a pa
f270: 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
f280: 65 6c 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f  ells (which is o
f290: 6e 6c 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69  nly.    ** possi
f2a0: 62 6c 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70  ble for a root p
f2b0: 61 67 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74  age of a table t
f2c0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  hat contains no 
f2d0: 72 6f 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20  rows) then the. 
f2e0: 20 20 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20     ** offset to 
f2f0: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
f300: 20 61 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c   area will equal
f310: 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   the page size m
f320: 69 6e 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  inus the.    ** 
f330: 62 79 74 65 73 20 6f 66 20 72 65 73 65 72 76 65  bytes of reserve
f340: 64 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20  d space. */.    
f350: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
f360: 43 65 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75  Cell>0 || top==u
f370: 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52  sableSize || COR
f380: 52 55 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20  RUPT_DB );..    
f390: 2f 2a 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64  /* A malformed d
f3a0: 61 74 61 62 61 73 65 20 70 61 67 65 20 6d 69 67  atabase page mig
f3b0: 68 74 20 63 61 75 73 65 20 75 73 20 74 6f 20 72  ht cause us to r
f3c0: 65 61 64 20 70 61 73 74 20 74 68 65 20 65 6e 64  ead past the end
f3d0: 0a 20 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20  .    ** of page 
f3e0: 77 68 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63  when parsing a c
f3f0: 65 6c 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  ell.  .    **.  
f400: 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
f410: 6e 67 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  ng block of code
f420: 20 63 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f   checks early to
f430: 20 73 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65   see if a cell e
f440: 78 74 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61  xtends.    ** pa
f450: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
f460: 70 61 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e  page boundary an
f470: 64 20 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f  d causes SQLITE_
f480: 43 4f 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20  CORRUPT to be . 
f490: 20 20 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69     ** returned i
f4a0: 66 20 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a  f it does..    *
f4b0: 2f 0a 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74  /.    iCellFirst
f4c0: 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
f4d0: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  2*pPage->nCell;.
f4e0: 20 20 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20      iCellLast = 
f4f0: 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a  usableSize - 4;.
f500: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d      if( pBt->db-
f510: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
f520: 43 65 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20  CellSizeCk ){.  
f530: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
f540: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
f550: 6e 74 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69  nto the cell poi
f560: 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20  nter array */.  
f570: 20 20 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20      int sz;     
f580: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
f590: 20 61 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20   a cell */..    
f5a0: 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
f5b0: 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d  af ) iCellLast--
f5c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
f5d0: 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
f5e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70   i++){.        p
f5f0: 63 20 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67  c = get2byteAlig
f600: 6e 65 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66  ned(&data[cellOf
f610: 66 73 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20  fset+i*2]);.    
f620: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
f630: 3d 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a  ==iCellFirst );.
f640: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
f650: 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20  ( pc==iCellLast 
f660: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f670: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f680: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f690: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
f6a0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
f6b0: 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a  BKPT;.        }.
f6c0: 20 20 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61          sz = pPa
f6d0: 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50  ge->xCellSize(pP
f6e0: 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
f6f0: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
f700: 65 28 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65  e( pc+sz==usable
f710: 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
f720: 69 66 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65  if( pc+sz>usable
f730: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
f740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f750: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
f760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f770: 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65        if( !pPage
f780: 2d 3e 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61  ->leaf ) iCellLa
f790: 73 74 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20  st++;.    }  .. 
f7a0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
f7b0: 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61  e total free spa
f7c0: 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20  ce on the page. 
f7d0: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
f7e0: 46 3a 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30  F: R-23588-34450
f7f0: 20 54 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e   The two-byte in
f800: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
f810: 31 20 67 69 76 65 73 20 74 68 65 0a 20 20 20 20  1 gives the.    
f820: 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  ** start of the 
f830: 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20  first freeblock 
f840: 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  on the page, or 
f850: 69 73 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65  is zero if there
f860: 20 61 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66   are no.    ** f
f870: 72 65 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20  reeblocks. */.  
f880: 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
f890: 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20  &data[hdr+1]);. 
f8a0: 20 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b     nFree = data[
f8b0: 68 64 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f  hdr+7] + top;  /
f8c0: 2a 20 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20  * Init nFree to 
f8d0: 6e 6f 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72  non-freeblock fr
f8e0: 65 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ee space */.    
f8f0: 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20  while( pc>0 ){. 
f900: 20 20 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73       u16 next, s
f910: 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ize;.      if( p
f920: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
f930: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
f940: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
f950: 4e 43 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d  NCE-OF: R-55530-
f960: 35 32 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d  52930 In a well-
f970: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
f980: 67 65 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20  ge, there will. 
f990: 20 20 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73         ** always
f9a0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
f9b0: 20 63 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65   cell before the
f9c0: 20 66 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b   first freeblock
f9d0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
f9e0: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20       ** Or, the 
f9f0: 66 72 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66  freeblock is off
fa00: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
fa10: 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  page.        */.
fa20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
fa30: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
fa40: 50 54 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20  PT; .      }.   
fa50: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
fa60: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
fa70: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
fa80: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
fa90: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65  );.      if( (ne
faa0: 78 74 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63  xt>0 && next<=pc
fab0: 2b 73 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73  +size+3) || pc+s
fac0: 69 7a 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  ize>usableSize )
fad0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65  {.        /* Fre
fae0: 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65  e blocks must be
faf0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
fb00: 64 65 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73  der. And the las
fb10: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20  t byte of.      
fb20: 20 20 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c    ** the free-bl
fb30: 6f 63 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20  ock must lie on 
fb40: 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61 67  the database pag
fb50: 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  e.  */.        r
fb60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
fb70: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
fb80: 20 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20    }.      nFree 
fb90: 3d 20 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a  = nFree + size;.
fba0: 20 20 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b        pc = next;
fbb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
fbc0: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46  t this point, nF
fbd0: 72 65 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ree contains the
fbe0: 20 73 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73   sum of the offs
fbf0: 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a  et to the start.
fc00: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65      ** of the ce
fc10: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20  ll-content area 
fc20: 70 6c 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20  plus the number 
fc30: 6f 66 20 66 72 65 65 20 62 79 74 65 73 20 77 69  of free bytes wi
fc40: 74 68 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  thin.    ** the 
fc50: 63 65 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65  cell-content are
fc60: 61 2e 20 49 66 20 74 68 69 73 20 69 73 20 67 72  a. If this is gr
fc70: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 75  eater than the u
fc80: 73 61 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a  sable-size.    *
fc90: 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74  * of the page, t
fca0: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73  hen the page mus
fcb0: 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  t be corrupted. 
fcc0: 54 68 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a  This check also.
fcd0: 20 20 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f      ** serves to
fce0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
fcf0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
fd00: 74 61 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tart of the cell
fd10: 2d 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20  -content.    ** 
fd20: 61 72 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20  area, according 
fd30: 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 61 64  to the page head
fd40: 65 72 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20  er, lies within 
fd50: 74 68 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  the page..    */
fd60: 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75  .    if( nFree>u
fd70: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
fd80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fd90: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a  _CORRUPT_BKPT; .
fda0: 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
fdb0: 3e 6e 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e  >nFree = (u16)(n
fdc0: 46 72 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73  Free - iCellFirs
fdd0: 74 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  t);.    pPage->i
fde0: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20  sInit = 1;.  }. 
fdf0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fe00: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  K;.}../*.** Set 
fe10: 75 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f  up a raw page so
fe20: 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c   that it looks l
fe30: 69 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70  ike a database p
fe40: 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e  age holding.** n
fe50: 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74  o entries..*/.st
fe60: 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61  atic void zeroPa
fe70: 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
fe80: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
fe90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
fea0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
feb0: 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20  ata;.  BtShared 
fec0: 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42  *pBt = pPage->pB
fed0: 74 3b 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50  t;.  u8 hdr = pP
fee0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
fef0: 20 20 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20    u16 first;..  
ff00: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
ff10: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
ff20: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
ff30: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
ff40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ff50: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
ff60: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
ff70: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
ff80: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ff90: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
ffa0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
ffb0: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
ffc0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
ffd0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
ffe0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
fff0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10000 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10010 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
10020 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
10030 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45   BTS_SECURE_DELE
10040 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  TE ){.    memset
10050 28 26 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20  (&data[hdr], 0, 
10060 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
10070 2d 20 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61  - hdr);.  }.  da
10080 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29  ta[hdr] = (char)
10090 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
100a0 20 68 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50   hdr + ((flags&P
100b0 54 46 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32  TF_LEAF)==0 ? 12
100c0 20 3a 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28   : 8);.  memset(
100d0 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c  &data[hdr+1], 0,
100e0 20 34 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b   4);.  data[hdr+
100f0 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79  7] = 0;.  put2by
10100 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c  te(&data[hdr+5],
10110 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
10120 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
10130 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75  e = (u16)(pBt->u
10140 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
10150 74 29 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67  t);.  decodeFlag
10160 73 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b  s(pPage, flags);
10170 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
10180 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
10190 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20  pPage->aDataEnd 
101a0 3d 20 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61  = &data[pBt->usa
101b0 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67  bleSize];.  pPag
101c0 65 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64  e->aCellIdx = &d
101d0 61 74 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50  ata[first];.  pP
101e0 61 67 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d  age->aDataOfst =
101f0 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68   &data[pPage->ch
10200 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70  ildPtrSize];.  p
10210 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  Page->nOverflow 
10220 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70  = 0;.  assert( p
10230 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
10240 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
10250 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70  ze<=65536 );.  p
10260 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d  Page->maskPage =
10270 20 28 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65   (u16)(pBt->page
10280 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61  Size - 1);.  pPa
10290 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
102a0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
102b0 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
102c0 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
102d0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
102e0 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
102f0 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
10300 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
10310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
10320 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
10330 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
10340 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
10350 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
10360 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
10370 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
10380 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
10390 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
103a0 0a 20 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61  .  if( pgno!=pPa
103b0 67 65 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20  ge->pgno ){.    
103c0 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
103d0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
103e0 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ta(pDbPage);.   
103f0 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20   pPage->pDbPage 
10400 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70  = pDbPage;.    p
10410 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
10420 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  .    pPage->pgno
10430 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61   = pgno;.    pPa
10440 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20  ge->hdrOffset = 
10450 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20  pgno==1 ? 100 : 
10460 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
10470 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73   pPage->aData==s
10480 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
10490 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20  ta(pDbPage) );. 
104a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a   return pPage; .
104b0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70  }../*.** Get a p
104c0 61 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67  age from the pag
104d0 65 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20  er.  Initialize 
104e0 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
104f0 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
10500 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
10510 20 6e 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c   needed.  See al
10520 73 6f 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73  so: btreeGetUnus
10530 65 64 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  edPage()..**.** 
10540 49 66 20 74 68 65 20 50 41 47 45 52 5f 47 45 54  If the PAGER_GET
10550 5f 4e 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20  _NOCONTENT flag 
10560 69 73 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73  is set, it means
10570 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20   that we do not 
10580 63 61 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68  care.** about th
10590 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
105a0 20 70 61 67 65 20 61 74 20 74 68 69 73 20 74 69   page at this ti
105b0 6d 65 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67  me.  So do not g
105c0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a  o to the disk.**
105d0 20 74 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f   to fetch the co
105e0 6e 74 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c  ntent.  Just fil
105f0 6c 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  l in the content
10600 20 77 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20   with zeros for 
10610 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68  now..** If in th
10620 65 20 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c  e future we call
10630 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
10640 74 65 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67  te() on this pag
10650 65 2c 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73  e, that.** means
10660 20 77 65 20 68 61 76 65 20 73 74 61 72 74 65 64   we have started
10670 20 74 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64   to be concerned
10680 20 61 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61   about content a
10690 6e 64 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72  nd the disk.** r
106a0 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72  ead should occur
106b0 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a   at that point..
106c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
106d0 72 65 65 47 65 74 50 61 67 65 28 0a 20 20 42 74  reeGetPage(.  Bt
106e0 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
106f0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
10700 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
10710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10720 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
10730 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65  to fetch */.  Me
10740 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
10750 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
10760 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 70 61   page in this pa
10770 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74  rameter */.  int
10780 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
10790 20 20 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e    /* PAGER_GET_N
107a0 4f 43 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45  OCONTENT or PAGE
107b0 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a  R_GET_READONLY *
107c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
107d0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
107e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  ;..  assert( fla
107f0 67 73 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  gs==0 || flags==
10800 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54  PAGER_GET_NOCONT
10810 45 4e 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ENT || flags==PA
10820 47 45 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59  GER_GET_READONLY
10830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
10840 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
10850 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
10860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10870 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
10880 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
10890 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c  e**)&pDbPage, fl
108a0 61 67 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ags);.  if( rc )
108b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70   return rc;.  *p
108c0 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67  pPage = btreePag
108d0 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50  eFromDbPage(pDbP
108e0 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b  age, pgno, pBt);
108f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
10900 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
10910 74 72 69 65 76 65 20 61 20 70 61 67 65 20 66 72  trieve a page fr
10920 6f 6d 20 74 68 65 20 70 61 67 65 72 20 63 61 63  om the pager cac
10930 68 65 2e 20 49 66 20 74 68 65 20 72 65 71 75 65  he. If the reque
10940 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74  sted page is not
10950 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74  .** already in t
10960 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20 72  he pager cache r
10970 65 74 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74  eturn NULL. Init
10980 69 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61  ialize the MemPa
10990 67 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65  ge.pBt and.** Me
109a0 6d 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d  mPage.aData elem
109b0 65 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a  ents if needed..
109c0 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
109d0 65 20 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b  e *btreePageLook
109e0 75 70 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  up(BtShared *pBt
109f0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
10a00 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b  DbPage *pDbPage;
10a10 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10a20 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
10a30 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
10a40 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33  DbPage = sqlite3
10a50 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d  PagerLookup(pBt-
10a60 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  >pPager, pgno);.
10a70 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29 7b    if( pDbPage ){
10a80 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
10a90 65 50 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28  ePageFromDbPage(
10aa0 70 44 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70  pDbPage, pgno, p
10ab0 42 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Bt);.  }.  retur
10ac0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
10ad0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
10ae0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10af0 6c 65 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20  le in pages. If 
10b00 74 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e  there is any kin
10b10 64 20 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72  d of.** error, r
10b20 65 74 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64  eturn ((unsigned
10b30 20 69 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61   int)-1)..*/.sta
10b40 74 69 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61  tic Pgno btreePa
10b50 67 65 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64  gecount(BtShared
10b60 20 2a 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e   *pBt){.  return
10b70 20 70 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75   pBt->nPage;.}.u
10b80 33 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  32 sqlite3BtreeL
10b90 61 73 74 50 61 67 65 28 42 74 72 65 65 20 2a 70  astPage(Btree *p
10ba0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
10bb0 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
10bc0 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65  tex(p) );.  asse
10bd0 72 74 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50  rt( ((p->pBt->nP
10be0 61 67 65 29 26 30 78 38 30 30 30 30 30 30 29 3d  age)&0x8000000)=
10bf0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  =0 );.  return b
10c00 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d  treePagecount(p-
10c10 3e 70 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pBt);.}../*.** 
10c20 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
10c30 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
10c40 69 74 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a  itialize it..**.
10c50 2a 2a 20 49 66 20 70 43 75 72 21 3d 30 20 74 68  ** If pCur!=0 th
10c60 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 62  en the page is b
10c70 65 69 6e 67 20 66 65 74 63 68 65 64 20 61 73 20  eing fetched as 
10c80 70 61 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f  part of a moveTo
10c90 43 68 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e  Child().** call.
10ca0 20 20 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20    Do additional 
10cb0 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
10cc0 6f 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20 74  on the page in t
10cd0 68 69 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64  his case..** And
10ce0 20 69 66 20 74 68 65 20 66 65 74 63 68 20 66 61   if the fetch fa
10cf0 69 6c 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ils, this routin
10d00 65 20 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74  e must decrement
10d10 20 70 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a   pCur->iPage..**
10d20 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 69 73 20  .** The page is 
10d30 66 65 74 63 68 65 64 20 61 73 20 72 65 61 64 2d  fetched as read-
10d40 77 72 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75  write unless pCu
10d50 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e  r is not NULL an
10d60 64 20 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f  d is.** a read-o
10d70 6e 6c 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a  nly cursor..**.*
10d80 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
10d90 63 75 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61  curs, then *ppPa
10da0 67 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e  ge is undefined.
10db0 20 49 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69   It.** may remai
10dc0 6e 20 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20  n unchanged, or 
10dd0 69 74 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  it may be set to
10de0 20 61 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75   an invalid valu
10df0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10e00 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
10e10 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10e20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
10e30 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
10e40 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
10e50 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10e70 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61  Number of the pa
10e80 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d  ge to get */.  M
10e90 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10eb0 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
10ec0 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f   pointer here */
10ed0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
10ee0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
10ef0 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20     /* Cursor to 
10f00 72 65 63 65 69 76 65 20 74 68 65 20 70 61 67 65  receive the page
10f10 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  , or NULL */.  i
10f20 6e 74 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20  nt bReadOnly    
10f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f40 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
10f50 64 2d 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29  d-only page */.)
10f60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62  {.  int rc;.  Db
10f70 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
10f80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10f90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10fa0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
10fb0 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
10fc0 70 70 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61  ppPage==&pCur->a
10fd0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
10fe0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
10ff0 70 43 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64  pCur==0 || bRead
11000 4f 6e 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50  Only==pCur->curP
11010 61 67 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61  agerFlags );.  a
11020 73 73 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c  ssert( pCur==0 |
11030 7c 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20  | pCur->iPage>0 
11040 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62  );..  if( pgno>b
11050 74 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42  treePagecount(pB
11060 74 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  t) ){.    rc = S
11070 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
11080 50 54 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74  PT;.    goto get
11090 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f  AndInitPage_erro
110a0 72 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  r;.  }.  rc = sq
110b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
110c0 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  t->pPager, pgno,
110d0 20 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50   (DbPage**)&pDbP
110e0 61 67 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b  age, bReadOnly);
110f0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
11100 20 67 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74   goto getAndInit
11110 50 61 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a  Page_error;.  }.
11120 20 20 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d    *ppPage = (Mem
11130 50 61 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67  Page*)sqlite3Pag
11140 65 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61  erGetExtra(pDbPa
11150 67 65 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50  ge);.  if( (*ppP
11160 61 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  age)->isInit==0 
11170 29 7b 0a 20 20 20 20 62 74 72 65 65 50 61 67 65  ){.    btreePage
11180 46 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61  FromDbPage(pDbPa
11190 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a  ge, pgno, pBt);.
111a0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e      rc = btreeIn
111b0 69 74 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b  itPage(*ppPage);
111c0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
111d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
111e0 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50  releasePage(*ppP
111f0 61 67 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  age);.      goto
11200 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f   getAndInitPage_
11210 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  error;.    }.  }
11220 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70 50  .  assert( (*ppP
11230 61 67 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  age)->pgno==pgno
11240 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a   );.  assert( (*
11250 70 70 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d  ppPage)->aData==
11260 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11270 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
11280 0a 20 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69  .  /* If obtaini
11290 6e 67 20 61 20 63 68 69 6c 64 20 70 61 67 65 20  ng a child page 
112a0 66 6f 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65  for a cursor, we
112b0 20 6d 75 73 74 20 76 65 72 69 66 79 20 74 68 61   must verify tha
112c0 74 20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20  t the page is.  
112d0 2a 2a 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69  ** compatible wi
112e0 74 68 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  th the root page
112f0 2e 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20  . */.  if( pCur 
11300 26 26 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e  && ((*ppPage)->n
11310 43 65 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61  Cell<1 || (*ppPa
11320 67 65 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75  ge)->intKey!=pCu
11330 72 2d 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b  r->curIntKey) ){
11340 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
11350 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
11360 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a     releasePage(*
11370 70 70 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74  ppPage);.    got
11380 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  o getAndInitPage
11390 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65  _error;.  }.  re
113a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
113b0 0a 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f  .getAndInitPage_
113c0 65 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75  error:.  if( pCu
113d0 72 20 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d  r ) pCur->iPage-
113e0 2d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  -;.  testcase( p
113f0 67 6e 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  gno==0 );.  asse
11400 72 74 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72  rt( pgno!=0 || r
11410 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
11420 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  T );.  return rc
11430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
11440 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
11450 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
11460 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
11470 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
11480 20 74 6f 20 62 74 72 65 65 47 65 74 50 61 67 65   to btreeGetPage
11490 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
114a0 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e   releasePageNotN
114b0 75 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ull(MemPage *pPa
114c0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
114d0 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
114e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
114f0 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  pBt );.  assert(
11500 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21   pPage->pDbPage!
11510 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
11520 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
11530 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50  xtra(pPage->pDbP
11540 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70  age) == (void*)p
11550 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
11560 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
11570 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
11580 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44  Page)==pPage->aD
11590 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
115a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
115b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
115c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
115d0 74 65 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74  te3PagerUnrefNot
115e0 4e 75 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50  Null(pPage->pDbP
115f0 61 67 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  age);.}.static v
11600 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28  oid releasePage(
11610 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b  MemPage *pPage){
11620 0a 20 20 69 66 28 20 70 50 61 67 65 20 29 20 72  .  if( pPage ) r
11630 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
11640 6c 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  l(pPage);.}../*.
11650 2a 2a 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64  ** Get an unused
11660 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   page..**.** Thi
11670 73 20 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b  s works just lik
11680 65 20 62 74 72 65 65 47 65 74 50 61 67 65 28 29  e btreeGetPage()
11690 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
116a0 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49  on:.**.**   *  I
116b0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 61 6c  f the page is al
116c0 72 65 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72  ready in use for
116d0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
116e0 6f 73 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79  ose, immediately
116f0 0a 2a 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65  .**      release
11700 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61   it and return a
11710 6e 20 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54  n SQLITE_CURRUPT
11720 20 65 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20   error..**   *  
11730 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 69 73  Make sure the is
11740 49 6e 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65  Init flag is cle
11750 61 72 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ar.*/.static int
11760 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64 50   btreeGetUnusedP
11770 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
11780 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54  *pBt,       /* T
11790 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67  he btree */.  Pg
117a0 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20  no pgno,        
117b0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
117c0 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74 63  the page to fetc
117d0 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  h */.  MemPage *
117e0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52  *ppPage,    /* R
117f0 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 69  eturn the page i
11800 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  n this parameter
11810 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
11820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
11830 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
11840 54 20 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52  T or PAGER_GET_R
11850 45 41 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20  EADONLY */.){.  
11860 69 6e 74 20 72 63 20 3d 20 62 74 72 65 65 47 65  int rc = btreeGe
11870 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c  tPage(pBt, pgno,
11880 20 70 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b   ppPage, flags);
11890 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
118a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
118b0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
118c0 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67  Refcount((*ppPag
118d0 65 29 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29  e)->pDbPage)>1 )
118e0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
118f0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
11900 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
11910 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11920 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
11930 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70  T;.    }.    (*p
11940 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d  pPage)->isInit =
11950 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
11960 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20   *ppPage = 0;.  
11970 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
11980 0a 0a 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20  .../*.** During 
11990 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e  a rollback, when
119a0 20 74 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61   the pager reloa
119b0 64 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ds information i
119c0 6e 74 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a  nto the cache.**
119d0 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 63   so that the cac
119e0 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74  he is restored t
119f0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
11a00 74 61 74 65 20 61 74 20 74 68 65 20 73 74 61 72  tate at the star
11a10 74 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e  t of.** the tran
11a20 73 61 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63  saction, for eac
11a30 68 20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20  h page restored 
11a40 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
11a50 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  called..**.** Th
11a60 69 73 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73  is routine needs
11a70 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 65 78   to reset the ex
11a80 74 72 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e  tra data section
11a90 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
11aa0 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67  he.** page to ag
11ab0 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
11ac0 74 6f 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  tored data..*/.s
11ad0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 52  tatic void pageR
11ae0 65 69 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44  einit(DbPage *pD
11af0 61 74 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ata){.  MemPage 
11b00 2a 70 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20  *pPage;.  pPage 
11b10 3d 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c  = (MemPage *)sql
11b20 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
11b30 61 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  a(pData);.  asse
11b40 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
11b50 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
11b60 74 61 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70  ta)>0 );.  if( p
11b70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a  Page->isInit ){.
11b80 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
11b90 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
11ba0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
11bb0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
11bc0 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20  isInit = 0;.    
11bd0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
11be0 50 61 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61  PageRefcount(pDa
11bf0 74 61 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f  ta)>1 ){.      /
11c00 2a 20 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f  * pPage might no
11c10 74 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67  t be a btree pag
11c20 65 3b 20 20 69 74 20 6d 69 67 68 74 20 62 65 20  e;  it might be 
11c30 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
11c40 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72  .      ** or ptr
11c50 6d 61 70 20 70 61 67 65 20 6f 72 20 61 20 66 72  map page or a fr
11c60 65 65 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f  ee page.  In tho
11c70 73 65 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f  se cases, the fo
11c80 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a  llowing.      **
11c90 20 63 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e   call to btreeIn
11ca0 69 74 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69  itPage() will li
11cb0 6b 65 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49  kely return SQLI
11cc0 54 45 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20  TE_CORRUPT..    
11cd0 20 20 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d    ** But no harm
11ce0 20 69 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73   is done by this
11cf0 2e 20 20 41 6e 64 20 69 74 20 69 73 20 76 65 72  .  And it is ver
11d00 79 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  y important that
11d10 0a 20 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49  .      ** btreeI
11d20 6e 69 74 50 61 67 65 28 29 20 62 65 20 63 61 6c  nitPage() be cal
11d30 6c 65 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72  led on every btr
11d40 65 65 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61  ee page so we ma
11d50 6b 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ke.      ** the 
11d60 63 61 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70  call for every p
11d70 61 67 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69  age that comes i
11d80 6e 20 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67  n for re-initing
11d90 2e 20 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65  . */.      btree
11da0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
11db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
11dc0 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  .** Invoke the b
11dd0 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20  usy handler for 
11de0 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74  a btree..*/.stat
11df0 69 63 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f  ic int btreeInvo
11e00 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
11e10 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53  id *pArg){.  BtS
11e20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
11e30 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
11e40 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
11e50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
11e60 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
11e70 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
11e80 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
11e90 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11ea0 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
11eb0 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
11ec0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
11ed0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
11ee0 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
11ef0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
11f00 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
11f10 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
11f20 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20  NULL.** then an 
11f30 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61  ephemeral databa
11f40 73 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  se is created.  
11f50 54 68 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61  The ephemeral da
11f60 74 61 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20  tabase might.** 
11f70 62 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  be exclusively i
11f80 6e 20 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20  n memory, or it 
11f90 6d 69 67 68 74 20 75 73 65 20 61 20 64 69 73 6b  might use a disk
11fa0 2d 62 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61  -based memory ca
11fb0 63 68 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77  che..** Either w
11fc0 61 79 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61  ay, the ephemera
11fd0 6c 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  l database will 
11fe0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
11ff0 20 64 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65   deleted .** whe
12000 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  n sqlite3BtreeCl
12010 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ose() is called.
12020 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
12030 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
12040 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d  " then an in-mem
12050 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20  ory database is 
12060 63 72 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20  created.** that 
12070 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  is automatically
12080 20 64 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20   destroyed when 
12090 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
120a0 0a 2a 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20  .** The "flags" 
120b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 20 62  parameter is a b
120c0 69 74 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68  itmask that migh
120d0 74 20 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c  t contain bits l
120e0 69 6b 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49  ike.** BTREE_OMI
120f0 54 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72  T_JOURNAL and/or
12100 20 42 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a   BTREE_MEMORY..*
12110 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
12120 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
12130 6f 70 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61  opened in the sa
12140 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  me database conn
12150 65 63 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65  ection.** and we
12160 20 61 72 65 20 69 6e 20 73 68 61 72 65 64 20 63   are in shared c
12170 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20  ache mode, then 
12180 74 68 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61  the open will fa
12190 69 6c 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51  il with an.** SQ
121a0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
121b0 65 72 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f  error.  We canno
121c0 74 20 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d  t allow two or m
121d0 6f 72 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20  ore BtShared.** 
121e0 6f 62 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73  objects in the s
121f0 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
12200 6e 65 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f  nection since do
12210 69 6e 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64  ing so will lead
12220 0a 2a 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20  .** to problems 
12230 77 69 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  with locking..*/
12240 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12250 65 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  eOpen(.  sqlite3
12260 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
12270 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66   /* VFS to use f
12280 6f 72 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a  or this b-tree *
12290 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
122a0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
122b0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
122c0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42  containing the B
122d0 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f  Tree database */
122e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
122f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
12300 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
12310 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74  e handle */.  Bt
12320 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20  ree **ppBtree,  
12330 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
12340 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62   to new Btree ob
12350 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65 72  ject written her
12360 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
12370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
12380 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69  * Options */.  i
12390 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20  nt vfsFlags     
123a0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
123b0 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
123c0 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
123d0 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74  pen() */.){.  Bt
123e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b  Shared *pBt = 0;
123f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12400 53 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62  Shared part of b
12410 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
12420 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20  /.  Btree *p;   
12430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12440 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20     /* Handle to 
12450 72 65 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69  return */.  sqli
12460 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
12470 4f 70 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72  Open = 0;  /* Pr
12480 65 76 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f  events a race co
12490 6e 64 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20  ndition. Ticket 
124a0 23 33 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72  #3537 */.  int r
124b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
124c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
124d0 75 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68  ult code from th
124e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
124f0 20 75 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20   u8 nReserve;   
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12510 2f 2a 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65  /* Byte of unuse
12520 64 20 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20  d space on each 
12530 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  page */.  unsign
12540 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
12550 72 5b 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61  r[100];  /* Data
12560 62 61 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74  base header cont
12570 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75  ent */..  /* Tru
12580 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20  e if opening an 
12590 65 70 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f  ephemeral, tempo
125a0 72 61 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f  rary database */
125b0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54  .  const int isT
125c0 65 6d 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  empDb = zFilenam
125d0 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d  e==0 || zFilenam
125e0 65 5b 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53  e[0]==0;..  /* S
125f0 65 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  et the variable 
12600 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20  isMemdb to true 
12610 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
12620 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20   database, or . 
12630 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20   ** false for a 
12640 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62  file-based datab
12650 61 73 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ase..  */.#ifdef
12660 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
12670 4f 52 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e  ORYDB.  const in
12680 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23  t isMemdb = 0;.#
12690 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
126a0 20 69 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c   isMemdb = (zFil
126b0 65 6e 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28  ename && strcmp(
126c0 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
126d0 6f 72 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20  ory:")==0).     
126e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126f0 20 20 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26    || (isTempDb &
12700 26 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  & sqlite3TempInM
12710 65 6d 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20  emory(db)).     
12720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12730 20 20 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26    || (vfsFlags &
12740 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
12750 4f 52 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a  ORY)!=0;.#endif.
12760 0a 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30  .  assert( db!=0
12770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56   );.  assert( pV
12780 66 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  fs!=0 );.  asser
12790 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
127a0 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
127b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66   );.  assert( (f
127c0 6c 61 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67  lags&0xff)==flag
127d0 73 20 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20  s );   /* flags 
127e0 66 69 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f  fit in 8 bits */
127f0 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54  ..  /* Only a BT
12800 52 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62  REE_SINGLE datab
12810 61 73 65 20 63 61 6e 20 62 65 20 42 54 52 45 45  ase can be BTREE
12820 5f 55 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20  _UNORDERED */.  
12830 61 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26  assert( (flags &
12840 20 42 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44   BTREE_UNORDERED
12850 29 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  )==0 || (flags &
12860 20 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d   BTREE_SINGLE)!=
12870 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52  0 );..  /* A BTR
12880 45 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61  EE_SINGLE databa
12890 73 65 20 69 73 20 61 6c 77 61 79 73 20 61 20 74  se is always a t
128a0 65 6d 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20  emporary and/or 
128b0 65 70 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61  ephemeral */.  a
128c0 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
128d0 42 54 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30  BTREE_SINGLE)==0
128e0 20 7c 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a   || isTempDb );.
128f0 0a 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29  .  if( isMemdb )
12900 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42  {.    flags |= B
12910 54 52 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d  TREE_MEMORY;.  }
12920 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73  .  if( (vfsFlags
12930 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   & SQLITE_OPEN_M
12940 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69  AIN_DB)!=0 && (i
12950 73 4d 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70  sMemdb || isTemp
12960 44 62 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c  Db) ){.    vfsFl
12970 61 67 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20  ags = (vfsFlags 
12980 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
12990 41 49 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45  AIN_DB) | SQLITE
129a0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20  _OPEN_TEMP_DB;. 
129b0 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33   }.  p = sqlite3
129c0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
129d0 66 28 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28  f(Btree));.  if(
129e0 20 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72   !p ){.    retur
129f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
12a00 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73    }.  p->inTrans
12a10 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
12a20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 23 69 66   p->db = db;.#if
12a30 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12a40 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
12a50 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65 65 20 3d  p->lock.pBtree =
12a60 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 69 54   p;.  p->lock.iT
12a70 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e 64 69 66  able = 1;.#endif
12a80 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
12a90 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
12aa0 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
12ab0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
12ac0 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
12ad0 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
12ae0 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
12af0 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
12b00 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
12b10 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
12b20 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
12b30 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
12b40 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
12b50 20 69 73 54 65 6d 70 44 62 3d 3d 30 20 26 26 20   isTempDb==0 && 
12b60 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c 7c 20 28  (isMemdb==0 || (
12b70 76 66 73 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  vfsFlags&SQLITE_
12b80 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29 20 29 7b  OPEN_URI)!=0) ){
12b90 0a 20 20 20 20 69 66 28 20 76 66 73 46 6c 61 67  .    if( vfsFlag
12ba0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
12bb0 53 48 41 52 45 44 43 41 43 48 45 20 29 7b 0a 20  SHAREDCACHE ){. 
12bc0 20 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61       int nFilena
12bd0 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
12be0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 2b  en30(zFilename)+
12bf0 31 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  1;.      int nFu
12c00 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
12c10 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
12c20 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
12c30 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
12c40 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41 58 28 6e  ite3Malloc(MAX(n
12c50 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 46 69  FullPathname,nFi
12c60 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  lename));.      
12c70 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c  MUTEX_LOGIC( sql
12c80 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
12c90 78 53 68 61 72 65 64 3b 20 29 0a 0a 20 20 20 20  xShared; )..    
12ca0 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d 20    p->sharable = 
12cb0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 46  1;.      if( !zF
12cc0 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
12cd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
12ce0 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ree(p);.        
12cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12d00 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  MEM;.      }.   
12d10 20 20 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29     if( isMemdb )
12d20 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
12d30 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
12d40 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 46 69 6c 65  zFilename, nFile
12d50 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
12d60 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
12d70 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
12d80 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
12d90 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 20 20 20 20 20 20 20 20 6e 46 75 6c 6c             nFull
12dc0 50 61 74 68 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Pathname, zFullP
12dd0 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
12de0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
12df0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
12e00 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
12e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
12e20 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
12e30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
12e40 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
12e50 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f     }.#if SQLITE_
12e60 54 48 52 45 41 44 53 41 46 45 0a 20 20 20 20 20  THREADSAFE.     
12e70 20 6d 75 74 65 78 4f 70 65 6e 20 3d 20 73 71 6c   mutexOpen = sql
12e80 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
12e90 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
12ea0 49 43 5f 4f 50 45 4e 29 3b 0a 20 20 20 20 20 20  IC_OPEN);.      
12eb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
12ec0 74 65 72 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a  ter(mutexOpen);.
12ed0 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72 65        mutexShare
12ee0 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78  d = sqlite3Mutex
12ef0 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
12f00 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
12f10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
12f20 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
12f30 65 78 53 68 61 72 65 64 29 3b 0a 23 65 6e 64 69  exShared);.#endi
12f40 66 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d  f.      for(pBt=
12f50 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
12f60 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
12f70 63 68 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70  cheList); pBt; p
12f80 42 74 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a  Bt=pBt->pNext){.
12f90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12fa0 70 42 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pBt->nRef>0 );. 
12fb0 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74         if( 0==st
12fc0 72 63 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rcmp(zFullPathna
12fd0 6d 65 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  me, sqlite3Pager
12fe0 46 69 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50  Filename(pBt->pP
12ff0 61 67 65 72 2c 20 30 29 29 0a 20 20 20 20 20 20  ager, 0)).      
13000 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73 71             && sq
13010 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 70 42  lite3PagerVfs(pB
13020 74 2d 3e 70 50 61 67 65 72 29 3d 3d 70 56 66 73  t->pPager)==pVfs
13030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
13040 74 20 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  t iDb;.         
13050 20 66 6f 72 28 69 44 62 3d 64 62 2d 3e 6e 44 62   for(iDb=db->nDb
13060 2d 31 3b 20 69 44 62 3e 3d 30 3b 20 69 44 62 2d  -1; iDb>=0; iDb-
13070 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -){.            
13080 42 74 72 65 65 20 2a 70 45 78 69 73 74 69 6e 67  Btree *pExisting
13090 20 3d 20 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e   = db->aDb[iDb].
130a0 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pBt;.           
130b0 20 69 66 28 20 70 45 78 69 73 74 69 6e 67 20 26   if( pExisting &
130c0 26 20 70 45 78 69 73 74 69 6e 67 2d 3e 70 42 74  & pExisting->pBt
130d0 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ==pBt ){.       
130e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
130f0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13100 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 20  Shared);.       
13110 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
13120 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
13130 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  Open);.         
13140 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
13150 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
13160 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
13170 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
13180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
13190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
131a0 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20  STRAINT;.       
131b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
131c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
131d0 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
131e0 20 20 20 20 20 70 42 74 2d 3e 6e 52 65 66 2b 2b       pBt->nRef++
131f0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
13200 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
13210 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
13220 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
13230 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20  utexShared);.   
13240 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13250 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
13260 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
13270 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 65 6c  ITE_DEBUG.    el
13280 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20  se{.      /* In 
13290 64 65 62 75 67 20 6d 6f 64 65 2c 20 77 65 20 6d  debug mode, we m
132a0 61 72 6b 20 61 6c 6c 20 70 65 72 73 69 73 74 65  ark all persiste
132b0 6e 74 20 64 61 74 61 62 61 73 65 73 20 61 73 20  nt databases as 
132c0 73 68 61 72 61 62 6c 65 0a 20 20 20 20 20 20 2a  sharable.      *
132d0 2a 20 65 76 65 6e 20 77 68 65 6e 20 74 68 65 79  * even when they
132e0 20 61 72 65 20 6e 6f 74 2e 20 20 54 68 69 73 20   are not.  This 
132f0 65 78 65 72 63 69 73 65 73 20 74 68 65 20 6c 6f  exercises the lo
13300 63 6b 69 6e 67 20 63 6f 64 65 20 61 6e 64 0a 20  cking code and. 
13310 20 20 20 20 20 2a 2a 20 67 69 76 65 73 20 6d 6f       ** gives mo
13320 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 66  re opportunity f
13330 6f 72 20 61 73 73 65 72 74 73 28 73 71 6c 69 74  or asserts(sqlit
13340 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 29 29  e3_mutex_held())
13350 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  .      ** statem
13360 65 6e 74 73 20 74 6f 20 66 69 6e 64 20 6c 6f 63  ents to find loc
13370 6b 69 6e 67 20 70 72 6f 62 6c 65 6d 73 2e 0a 20  king problems.. 
13380 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d       */.      p-
13390 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
133a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
133b0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 42 74  #endif.  if( pBt
133c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20  ==0 ){.    /*.  
133d0 20 20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    ** The followi
133e0 6e 67 20 61 73 73 65 72 74 73 20 6d 61 6b 65 20  ng asserts make 
133f0 73 75 72 65 20 74 68 61 74 20 73 74 72 75 63 74  sure that struct
13400 75 72 65 73 20 75 73 65 64 20 62 79 20 74 68 65  ures used by the
13410 20 62 74 72 65 65 20 61 72 65 0a 20 20 20 20 2a   btree are.    *
13420 2a 20 74 68 65 20 72 69 67 68 74 20 73 69 7a 65  * the right size
13430 2e 20 20 54 68 69 73 20 69 73 20 74 6f 20 67 75  .  This is to gu
13440 61 72 64 20 61 67 61 69 6e 73 74 20 73 69 7a 65  ard against size
13450 20 63 68 61 6e 67 65 73 20 74 68 61 74 20 72 65   changes that re
13460 73 75 6c 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e  sult.    ** when
13470 20 63 6f 6d 70 69 6c 69 6e 67 20 6f 6e 20 61 20   compiling on a 
13480 64 69 66 66 65 72 65 6e 74 20 61 72 63 68 69 74  different archit
13490 65 63 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20  ecture..    */. 
134a0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
134b0 66 28 69 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20  f(i64)==8 );.   
134c0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
134d0 75 36 34 29 3d 3d 38 20 29 3b 0a 20 20 20 20 61  u64)==8 );.    a
134e0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
134f0 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
13500 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
13510 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
13520 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
13530 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
13540 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
13550 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
13560 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
13570 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
13580 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
13590 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
135a0 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
135b0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
135c0 65 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73  e3PagerOpen(pVfs
135d0 2c 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  , &pBt->pPager, 
135e0 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c       EXTRA_SIZE,
13610 20 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73   flags, vfsFlags
13620 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20  , pageReinit);. 
13630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13650 6c 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61  lite3PagerSetMma
13660 70 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67  pLimit(pBt->pPag
13670 65 72 2c 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b  er, db->szMmap);
13680 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13690 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
136a0 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
136b0 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
136c0 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
136d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
136e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
136f0 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
13700 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
13710 0a 20 20 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c  .    pBt->openFl
13720 61 67 73 20 3d 20 28 75 38 29 66 6c 61 67 73 3b  ags = (u8)flags;
13730 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 64  .    pBt->db = d
13740 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  b;.    sqlite3Pa
13750 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
13760 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 62  r(pBt->pPager, b
13770 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
13780 6e 64 6c 65 72 2c 20 70 42 74 29 3b 0a 20 20 20  ndler, pBt);.   
13790 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
137a0 20 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73   .    pBt->pCurs
137b0 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d  or = 0;.    pBt-
137c0 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20  >pPage1 = 0;.   
137d0 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
137e0 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d  rIsreadonly(pBt-
137f0 3e 70 50 61 67 65 72 29 20 29 20 70 42 74 2d 3e  >pPager) ) pBt->
13800 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13810 52 45 41 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65  READ_ONLY;.#ifde
13820 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
13830 44 45 4c 45 54 45 0a 20 20 20 20 70 42 74 2d 3e  DELETE.    pBt->
13840 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f  btsFlags |= BTS_
13850 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23  SECURE_DELETE;.#
13860 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 45 56 49  endif.    /* EVI
13870 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37  DENCE-OF: R-5187
13880 33 2d 33 39 36 31 38 20 54 68 65 20 70 61 67 65  3-39618 The page
13890 20 73 69 7a 65 20 66 6f 72 20 61 20 64 61 74 61   size for a data
138a0 62 61 73 65 20 66 69 6c 65 20 69 73 0a 20 20 20  base file is.   
138b0 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62   ** determined b
138c0 79 20 74 68 65 20 32 2d 62 79 74 65 20 69 6e 74  y the 2-byte int
138d0 65 67 65 72 20 6c 6f 63 61 74 65 64 20 61 74 20  eger located at 
138e0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 31 36 20  an offset of 16 
138f0 62 79 74 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a  bytes from.    *
13900 2a 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  * the beginning 
13910 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
13920 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74  file. */.    pBt
13930 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 7a 44  ->pageSize = (zD
13940 62 48 65 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20  bHeader[16]<<8) 
13950 7c 20 28 7a 44 62 48 65 61 64 65 72 5b 31 37 5d  | (zDbHeader[17]
13960 3c 3c 31 36 29 3b 0a 20 20 20 20 69 66 28 20 70  <<16);.    if( p
13970 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32  Bt->pageSize<512
13980 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   || pBt->pageSiz
13990 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  e>SQLITE_MAX_PAG
139a0 45 5f 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20  E_SIZE.         
139b0 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69  || ((pBt->pageSi
139c0 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53  ze-1)&pBt->pageS
139d0 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ize)!=0 ){.     
139e0 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
139f0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
13a00 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
13a10 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  UM.      /* If t
13a20 68 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a  he magic name ":
13a30 6d 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72  memory:" will cr
13a40 65 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  eate an in-memor
13a50 79 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  y database, then
13a60 0a 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20  .      ** leave 
13a70 74 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d  the autoVacuum m
13a80 6f 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74  ode at 0 (do not
13a90 20 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65   auto-vacuum), e
13aa0 76 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  ven if.      ** 
13ab0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
13ac0 55 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75  UTOVACUUM is tru
13ad0 65 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20  e. On the other 
13ae0 68 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a  hand, if.      *
13af0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  * SQLITE_OMIT_ME
13b00 4d 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20  MORYDB has been 
13b10 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a  defined, then ":
13b20 6d 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74  memory:" is just
13b30 20 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75   a.      ** regu
13b40 6c 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49  lar file-name. I
13b50 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
13b60 61 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c  auto-vacuum appl
13b70 69 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61  ies as per norma
13b80 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  l..      */.    
13b90 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20    if( zFilename 
13ba0 26 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20  && !isMemdb ){. 
13bb0 20 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f         pBt->auto
13bc0 56 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45  Vacuum = (SQLITE
13bd0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
13be0 55 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  UUM ? 1 : 0);.  
13bf0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
13c00 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
13c10 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
13c20 55 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a  UM==2 ? 1 : 0);.
13c30 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
13c40 20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20       nReserve = 
13c50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
13c60 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
13c70 4f 46 3a 20 52 2d 33 37 34 39 37 2d 34 32 34 31  OF: R-37497-4241
13c80 32 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  2 The size of th
13c90 65 20 72 65 73 65 72 76 65 64 20 72 65 67 69 6f  e reserved regio
13ca0 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 65  n is.      ** de
13cb0 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
13cc0 6f 6e 65 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  one-byte unsigne
13cd0 64 20 69 6e 74 65 67 65 72 20 66 6f 75 6e 64 20  d integer found 
13ce0 61 74 20 61 6e 20 6f 66 66 73 65 74 20 6f 66 20  at an offset of 
13cf0 32 30 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f  20.      ** into
13d00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13d10 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  le header. */.  
13d20 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a      nReserve = z
13d30 44 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20  DbHeader[20];.  
13d40 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
13d50 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53 49 5a  s |= BTS_PAGESIZ
13d60 45 5f 46 49 58 45 44 3b 0a 23 69 66 6e 64 65 66  E_FIXED;.#ifndef
13d70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13d80 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 70 42  OVACUUM.      pB
13d90 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
13da0 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
13db0 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  ader[36 + 4*4])?
13dc0 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42 74 2d  1:0);.      pBt-
13dd0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
13de0 65 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64  et4byte(&zDbHead
13df0 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a  er[36 + 7*4])?1:
13e00 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  0);.#endif.    }
13e10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13e20 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
13e30 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
13e40 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
13e50 52 65 73 65 72 76 65 29 3b 0a 20 20 20 20 69 66  Reserve);.    if
13e60 28 20 72 63 20 29 20 67 6f 74 6f 20 62 74 72 65  ( rc ) goto btre
13e70 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
13e80 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
13e90 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
13ea0 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  - nReserve;.    
13eb0 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61  assert( (pBt->pa
13ec0 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29  geSize & 7)==0 )
13ed0 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ;  /* 8-byte ali
13ee0 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69  gnment of pageSi
13ef0 7a 65 20 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64  ze */.   .#if !d
13f00 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
13f10 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
13f20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
13f30 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
13f40 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
13f50 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62 6a  new BtShared obj
13f60 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65  ect to the linke
13f70 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65 20  d list sharable 
13f80 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20 2a  BtShareds..    *
13f90 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  /.    if( p->sha
13fa0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
13fb0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
13fc0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
13fd0 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
13fe0 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pBt->nRef = 1;. 
13ff0 20 20 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43       MUTEX_LOGIC
14000 28 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20  ( mutexShared = 
14010 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
14020 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
14030 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 29 0a  TATIC_MASTER);).
14040 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
14050 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73  _THREADSAFE && s
14060 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
14070 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
14080 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6d 75  .        pBt->mu
14090 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
140a0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
140b0 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
140c0 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6d 75 74      if( pBt->mut
140d0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ex==0 ){.       
140e0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
140f0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
14100 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14110 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14120 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14130 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
14140 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14150 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14160 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
14170 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
14180 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14190 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
141a0 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
141b0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
141c0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
141d0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
141e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
141f0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
14200 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
14210 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
14220 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14230 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14240 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
14250 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
14260 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
14270 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
14280 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
14290 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
142a0 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
142b0 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
142c0 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
142d0 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
142e0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
142f0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
14300 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
14310 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
14320 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
14330 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
14340 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
14350 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
14360 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
14370 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
14380 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
14390 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
143a0 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
143b0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
143c0 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
143d0 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
143e0 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
143f0 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
14400 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
14410 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
14420 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
14430 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
14440 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
14450 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
14460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
14470 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
14480 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
14490 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
144a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
144b0 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
144c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
144d0 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
144e0 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
144f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
14500 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
14510 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
14520 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
14530 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
14540 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
14550 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
14560 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
14570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
14580 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
14590 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
145a0 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
145b0 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
145c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
145d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
145e0 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
145f0 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
14600 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
14610 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
14620 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14630 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
14640 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
14650 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
14660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
14670 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
14680 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
14690 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
146a0 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
146b0 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  o the.    ** def
146c0 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
146d0 70 74 2c 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  pt, when opening
146e0 20 6f 6e 20 61 6e 20 65 78 69 73 74 69 6e 67 20   on an existing 
146f0 73 68 61 72 65 64 20 70 61 67 65 72 2d 63 61 63  shared pager-cac
14700 68 65 2c 0a 20 20 20 20 2a 2a 20 64 6f 20 6e 6f  he,.    ** do no
14710 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61 67  t change the pag
14720 65 72 2d 63 61 63 68 65 20 73 69 7a 65 2e 0a 20  er-cache size.. 
14730 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
14740 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
14750 28 70 2c 20 30 2c 20 30 29 3d 3d 30 20 29 7b 0a  (p, 0, 0)==0 ){.
14760 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
14770 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  erSetCachesize(p
14780 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53  ->pBt->pPager, S
14790 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
147a0 43 48 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  CHE_SIZE);.    }
147b0 0a 20 20 7d 0a 20 20 69 66 28 20 6d 75 74 65 78  .  }.  if( mutex
147c0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  Open ){.    asse
147d0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
147e0 78 5f 68 65 6c 64 28 6d 75 74 65 78 4f 70 65 6e  x_held(mutexOpen
147f0 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
14800 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74  _mutex_leave(mut
14810 65 78 4f 70 65 6e 29 3b 0a 20 20 7d 0a 20 20 72  exOpen);.  }.  r
14820 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14830 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
14840 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63   BtShared.nRef c
14850 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20 69 74  ounter.  When it
14860 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 0a 2a   reaches zero,.*
14870 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42 74 53  * remove the BtS
14880 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 20  hared structure 
14890 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69 6e 67  from the sharing
148a0 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e 0a 2a   list.  Return.*
148b0 2a 20 74 72 75 65 20 69 66 20 74 68 65 20 42 74  * true if the Bt
148c0 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e  Shared.nRef coun
148d0 74 65 72 20 72 65 61 63 68 65 73 20 7a 65 72 6f  ter reaches zero
148e0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 66   and return.** f
148f0 61 6c 73 65 20 69 66 20 69 74 20 69 73 20 73 74  alse if it is st
14900 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2f  ill positive..*/
14910 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6d 6f  .static int remo
14920 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
14930 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  t(BtShared *pBt)
14940 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
14950 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
14960 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43  HE.  MUTEX_LOGIC
14970 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20  ( sqlite3_mutex 
14980 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20 42 74  *pMaster; ).  Bt
14990 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b 0a 20  Shared *pList;. 
149a0 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d 20 30   int removed = 0
149b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
149c0 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74 68 65  ite3_mutex_nothe
149d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
149e0 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28  ;.  MUTEX_LOGIC(
149f0 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
14a00 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14a10 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
14a20 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20 73 71  _MASTER); ).  sq
14a30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14a40 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 70 42  r(pMaster);.  pB
14a50 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28  t->nRef--;.  if(
14a60 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b   pBt->nRef<=0 ){
14a70 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41 4c 28  .    if( GLOBAL(
14a80 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65  BtShared*,sqlite
14a90 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
14aa0 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20  )==pBt ){.      
14ab0 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14ac0 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14ad0 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74 2d 3e  cheList) = pBt->
14ae0 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65  pNext;.    }else
14af0 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20  {.      pList = 
14b00 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a  GLOBAL(BtShared*
14b10 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  ,sqlite3SharedCa
14b20 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  cheList);.      
14b30 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28 70 4c  while( ALWAYS(pL
14b40 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d 3e 70  ist) && pList->p
14b50 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20  Next!=pBt ){.   
14b60 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74       pList=pList
14b70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
14b80 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
14b90 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20 20 20  S(pList) ){.    
14ba0 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74      pList->pNext
14bb0 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a 20   = pBt->pNext;. 
14bc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14bd0 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
14be0 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20 20 20  ADSAFE ){.      
14bf0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
14c00 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29 3b 0a  ee(pBt->mutex);.
14c10 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f 76 65      }.    remove
14c20 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73 71 6c  d = 1;.  }.  sql
14c30 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14c40 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  (pMaster);.  ret
14c50 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23 65 6c  urn removed;.#el
14c60 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  se.  return 1;.#
14c70 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  endif.}../*.** M
14c80 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e 70 54  ake sure pBt->pT
14c90 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73 20 74  mpSpace points t
14ca0 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  o an allocation 
14cb0 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53  of .** MX_CELL_S
14cc0 49 5a 45 28 70 42 74 29 20 62 79 74 65 73 20 77  IZE(pBt) bytes w
14cd0 69 74 68 20 61 20 34 2d 62 79 74 65 20 70 72 65  ith a 4-byte pre
14ce0 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74 2d 63  fix for a left-c
14cf0 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65 72 2e  hild.** pointer.
14d00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14d10 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
14d20 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
14d30 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70 54  {.  if( !pBt->pT
14d40 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 70  mpSpace ){.    p
14d50 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
14d60 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f  sqlite3PageMallo
14d70 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  c( pBt->pageSize
14d80 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 65 20   );..    /* One 
14d90 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66 20 70  of the uses of p
14da0 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 69 73  Bt->pTmpSpace is
14db0 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c 6c 73   to format cells
14dc0 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69   before.    ** i
14dd0 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20 69 6e  nserting them in
14de0 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65 20 28  to a leaf page (
14df0 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49 6e 43  function fillInC
14e00 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20 20 2a  ell()). If.    *
14e10 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65 73 73  * a cell is less
14e20 20 74 68 61 6e 20 34 20 62 79 74 65 73 20 69 6e   than 4 bytes in
14e30 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72 6f 75   size, it is rou
14e40 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62 79 74  nded up to 4 byt
14e50 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 65  es.    ** by the
14e60 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69 6e 65   various routine
14e70 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c 61 74  s that manipulat
14e80 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73 2e 20  e binary cells. 
14e90 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63 61 6e  Which.    ** can
14ea0 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c 6c 49   mean that fillI
14eb0 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69 6e 69  nCell() only ini
14ec0 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66 69 72  tializes the fir
14ed0 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20 2a 2a  st 2 or 3.    **
14ee0 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70 53 70   bytes of pTmpSp
14ef0 61 63 65 2c 20 62 75 74 20 74 68 61 74 20 74 68  ace, but that th
14f00 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
14f10 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  are copied from.
14f20 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f 20 61      ** it into a
14f30 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
14f40 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63 74 75  This is not actu
14f50 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d 2c 20  ally a problem, 
14f60 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f  but it.    ** do
14f70 65 73 20 63 61 75 73 65 20 61 20 76 61 6c 67 72  es cause a valgr
14f80 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e 20 74  ind error when t
14f90 68 65 20 31 20 6f 72 20 32 20 62 79 74 65 73 20  he 1 or 2 bytes 
14fa0 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64 20 0a  of unitialized .
14fb0 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 70      ** data is p
14fc0 61 73 73 65 64 20 74 6f 20 73 79 73 74 65 6d 20  assed to system 
14fd0 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20 53 6f  call write(). So
14fe0 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 65   to avoid this e
14ff0 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a 65 72  rror,.    ** zer
15000 6f 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  o the first 4 by
15010 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70 61 63  tes of temp spac
15020 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a 0a 20  e here..    **. 
15030 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50 72 6f     ** Also:  Pro
15040 76 69 64 65 20 66 6f 75 72 20 62 79 74 65 73 20  vide four bytes 
15050 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 73  of initialized s
15060 70 61 63 65 20 62 65 66 6f 72 65 20 74 68 65 0a  pace before the.
15070 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69 6e 67      ** beginning
15080 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20 61 73   of pTmpSpace as
15090 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c 61 62   an area availab
150a0 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20 74 68  le to prepend th
150b0 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d 63 68  e.    ** left-ch
150c0 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ild pointer to t
150d0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
150e0 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20  a cell..    */. 
150f0 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d 70     if( pBt->pTmp
15100 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 6d  Space ){.      m
15110 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d 70 53  emset(pBt->pTmpS
15120 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20 20 20  pace, 0, 8);.   
15130 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63     pBt->pTmpSpac
15140 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  e += 4;.    }.  
15150 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  }.}../*.** Free 
15160 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  the pBt->pTmpSpa
15170 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f  ce allocation.*/
15180 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65  .static void fre
15190 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
151a0 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
151b0 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
151c0 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  ){.    pBt->pTmp
151d0 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20 20 20  Space -= 4;.    
151e0 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
151f0 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  pBt->pTmpSpace);
15200 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
15210 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ace = 0;.  }.}..
15220 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
15230 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
15240 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
15250 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
15260 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
15270 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
15280 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
15290 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
152a0 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
152b0 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
152c0 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
152d0 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
152e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
152f0 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
15300 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
15310 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
15320 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42 74 2d  );.  pCur = pBt-
15330 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68 69 6c  >pCursor;.  whil
15340 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20 42  e( pCur ){.    B
15350 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20 3d 20  tCursor *pTmp = 
15360 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72 20 3d  pCur;.    pCur =
15370 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
15380 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42 74 72    if( pTmp->pBtr
15390 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 73  ee==p ){.      s
153a0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
153b0 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a 20 20  Cursor(pTmp);.  
153c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f    }.  }..  /* Ro
153d0 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76  llback any activ
153e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
153f0 64 20 66 72 65 65 20 74 68 65 20 68 61 6e 64 6c  d free the handl
15400 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  e structure..  *
15410 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 71  * The call to sq
15420 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15430 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79 20 74  ck() drops any t
15440 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c 64 20  able-locks held 
15450 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 6e  by.  ** this han
15460 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  dle..  */.  sqli
15470 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
15480 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  (p, SQLITE_OK, 0
15490 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
154a0 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a  eLeave(p);..  /*
154b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 74   If there are st
154c0 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61  ill other outsta
154d0 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73  nding references
154e0 20 74 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62   to the shared-b
154f0 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74  tree.  ** struct
15500 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e  ure, return now.
15510 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   The remainder o
15520 66 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  f this procedure
15530 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70   cleans .  ** up
15540 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65   the shared-btre
15550 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
15560 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d  ( p->wantToLock=
15570 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d  =0 && p->locked=
15580 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e  =0 );.  if( !p->
15590 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f  sharable || remo
155a0 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73  veFromSharingLis
155b0 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a  t(pBt) ){.    /*
155c0 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c   The pBt is no l
155d0 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61  onger on the sha
155e0 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65  ring list, so we
155f0 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20   can access.    
15600 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20 68 61  ** it without ha
15610 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65  ving to hold the
15620 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20   mutex..    **. 
15630 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20     ** Clean out 
15640 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 42  and delete the B
15650 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a  tShared object..
15660 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
15670 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
15680 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
15690 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70  agerClose(pBt->p
156a0 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
156b0 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
156c0 20 26 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61   && pBt->pSchema
156d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78   ){.      pBt->x
156e0 46 72 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e  FreeSchema(pBt->
156f0 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a  pSchema);.    }.
15700 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15710 65 28 30 2c 20 70 42 74 2d 3e 70 53 63 68 65 6d  e(0, pBt->pSchem
15720 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
15730 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
15740 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
15750 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
15760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
15770 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
15780 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
15790 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
157a0 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
157b0 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
157c0 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
157d0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
157e0 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
157f0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
15800 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
15810 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
15820 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15840 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
15850 6f 66 74 22 20 6c 69 6d 69 74 20 6f 6e 20 74 68  oft" limit on th
15860 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
15870 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e 0a  s in the cache..
15880 2a 2a 20 55 6e 75 73 65 64 20 61 6e 64 20 75 6e  ** Unused and un
15890 6d 6f 64 69 66 69 65 64 20 70 61 67 65 73 20 77  modified pages w
158a0 69 6c 6c 20 62 65 20 72 65 63 79 63 6c 65 64 20  ill be recycled 
158b0 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
158c0 6f 66 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 74  of.** pages in t
158d0 68 65 20 63 61 63 68 65 20 65 78 63 65 65 64 73  he cache exceeds
158e0 20 74 68 69 73 20 73 6f 66 74 20 6c 69 6d 69 74   this soft limit
158f0 2e 20 20 42 75 74 20 74 68 65 20 73 69 7a 65 20  .  But the size 
15900 6f 66 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  of the.** cache 
15910 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 67 72  is allowed to gr
15920 6f 77 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  ow larger than t
15930 68 69 73 20 6c 69 6d 69 74 20 69 66 20 69 74 20  his limit if it 
15940 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 64 69 72 74  contains.** dirt
15950 79 20 70 61 67 65 73 20 6f 72 20 70 61 67 65 73  y pages or pages
15960 20 73 74 69 6c 6c 20 69 6e 20 61 63 74 69 76 65   still in active
15970 20 75 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   use..*/.int sql
15980 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
15990 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
159a0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
159b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
159c0 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
159d0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
159e0 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
159f0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
15a00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
15a10 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
15a20 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
15a30 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
15a40 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15a50 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
15a60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15a70 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 22 73  ** Change the "s
15a80 70 69 6c 6c 22 20 6c 69 6d 69 74 20 6f 6e 20 74  pill" limit on t
15a90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
15aa0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  es in the cache.
15ab0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
15ac0 72 20 6f 66 20 70 61 67 65 73 20 65 78 63 65 65  r of pages excee
15ad0 64 73 20 74 68 69 73 20 6c 69 6d 69 74 20 64 75  ds this limit du
15ae0 72 69 6e 67 20 61 20 77 72 69 74 65 20 74 72 61  ring a write tra
15af0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65  nsaction,.** the
15b00 20 70 61 67 65 72 20 6d 69 67 68 74 20 61 74 74   pager might att
15b10 65 6d 70 74 20 74 6f 20 22 73 70 69 6c 6c 22 20  empt to "spill" 
15b20 70 61 67 65 73 20 74 6f 20 74 68 65 20 6a 6f 75  pages to the jou
15b30 72 6e 61 6c 20 65 61 72 6c 79 20 69 6e 0a 2a 2a  rnal early in.**
15b40 20 6f 72 64 65 72 20 74 6f 20 66 72 65 65 20 75   order to free u
15b50 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  p memory..**.** 
15b60 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  The value return
15b70 65 64 20 69 73 20 74 68 65 20 63 75 72 72 65 6e  ed is the curren
15b80 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 20 20 49  t spill size.  I
15b90 66 20 7a 65 72 6f 20 69 73 20 70 61 73 73 65 64  f zero is passed
15ba0 0a 2a 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  .** as an argume
15bb0 6e 74 2c 20 6e 6f 20 63 68 61 6e 67 65 73 20 61  nt, no changes a
15bc0 72 65 20 6d 61 64 65 20 74 6f 20 74 68 65 20 73  re made to the s
15bd0 70 69 6c 6c 20 73 69 7a 65 20 73 65 74 74 69 6e  pill size settin
15be0 67 2c 20 73 6f 0a 2a 2a 20 75 73 69 6e 67 20 6d  g, so.** using m
15bf0 78 50 61 67 65 20 6f 66 20 30 20 69 73 20 61 20  xPage of 0 is a 
15c00 77 61 79 20 74 6f 20 71 75 65 72 79 20 74 68 65  way to query the
15c10 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c 20 73   current spill s
15c20 69 7a 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ize..*/.int sqli
15c30 74 65 33 42 74 72 65 65 53 65 74 53 70 69 6c 6c  te3BtreeSetSpill
15c40 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69  Size(Btree *p, i
15c50 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74  nt mxPage){.  Bt
15c60 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
15c70 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b  >pBt;.  int res;
15c80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
15c90 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
15ca0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
15cb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
15cc0 65 72 28 70 29 3b 0a 20 20 72 65 73 20 3d 20 73  er(p);.  res = s
15cd0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53 70  qlite3PagerSetSp
15ce0 69 6c 6c 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  illsize(pBt->pPa
15cf0 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
15d00 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15d10 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15d20 65 73 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  es;.}..#if SQLIT
15d30 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
15d40 30 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  0./*.** Change t
15d50 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
15d60 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 64 61  amount of the da
15d70 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61 74  tabase file that
15d80 20 6d 61 79 20 62 65 0a 2a 2a 20 6d 65 6d 6f 72   may be.** memor
15d90 79 20 6d 61 70 70 65 64 2e 0a 2a 2f 0a 69 6e 74  y mapped..*/.int
15da0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
15db0 4d 6d 61 70 4c 69 6d 69 74 28 42 74 72 65 65 20  MmapLimit(Btree 
15dc0 2a 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  *p, sqlite3_int6
15dd0 34 20 73 7a 4d 6d 61 70 29 7b 0a 20 20 42 74 53  4 szMmap){.  BtS
15de0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15df0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
15e00 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
15e10 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
15e20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
15e30 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
15e40 69 74 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70  ite3PagerSetMmap
15e50 4c 69 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65  Limit(pBt->pPage
15e60 72 2c 20 73 7a 4d 6d 61 70 29 3b 0a 20 20 73 71  r, szMmap);.  sq
15e70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15e80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
15e90 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
15ea0 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
15eb0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
15ec0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
15ed0 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e 63  way data is sync
15ee0 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72  ed to disk in or
15ef0 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20  der to increase 
15f00 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68  or decrease.** h
15f10 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61  ow well the data
15f20 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61 6d  base resists dam
15f30 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
15f40 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a  ashes and power.
15f50 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65  ** failures.  Le
15f60 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d  vel 1 is the sam
15f70 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75  e as asynchronou
15f80 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63  s (no syncs() oc
15f90 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65  cur and.** there
15fa0 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62 61   is a high proba
15fb0 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
15fc0 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68  )  Level 2 is th
15fd0 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72  e default.  Ther
15fe0 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c  e.** is a very l
15ff0 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20  ow but non-zero 
16000 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
16010 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20  amage.  Level 3 
16020 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70  reduces the.** p
16030 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61  robability of da
16040 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72  mage to near zer
16050 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72 69  o but with a wri
16060 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72  te performance r
16070 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66  eduction..*/.#if
16080 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16090 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69  _PAGER_PRAGMAS.i
160a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
160b0 65 74 50 61 67 65 72 46 6c 61 67 73 28 0a 20 20  etPagerFlags(.  
160c0 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20  Btree *p,       
160d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
160e0 72 65 65 20 74 6f 20 73 65 74 20 74 68 65 20 73  ree to set the s
160f0 61 66 65 74 79 20 6c 65 76 65 6c 20 6f 6e 20 2a  afety level on *
16100 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 67 46  /.  unsigned pgF
16110 6c 61 67 73 20 20 20 20 20 20 20 2f 2a 20 56 61  lags       /* Va
16120 72 69 6f 75 73 20 50 41 47 45 52 5f 2a 20 66 6c  rious PAGER_* fl
16130 61 67 73 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  ags */.){.  BtSh
16140 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
16150 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  Bt;.  assert( sq
16160 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16170 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
16180 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16190 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69  Enter(p);.  sqli
161a0 74 65 33 50 61 67 65 72 53 65 74 46 6c 61 67 73  te3PagerSetFlags
161b0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67  (pBt->pPager, pg
161c0 46 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  Flags);.  sqlite
161d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
161e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
161f0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
16200 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
16210 69 66 20 74 68 65 20 67 69 76 65 6e 20 62 74 72  if the given btr
16220 65 65 20 69 73 20 73 65 74 20 74 6f 20 73 61 66  ee is set to saf
16230 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e  ety level 1.  In
16240 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c   other.** words,
16250 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
16260 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75 72 73  no sync() occurs
16270 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
16280 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
16290 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
162a0 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  led(Btree *p){. 
162b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
162c0 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
162d0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  c;.  assert( sql
162e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
162f0 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
16300 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65    .  sqlite3Btre
16310 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73  eEnter(p);.  ass
16320 65 72 74 28 20 70 42 74 20 26 26 20 70 42 74 2d  ert( pBt && pBt-
16330 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72 63 20  >pPager );.  rc 
16340 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  = sqlite3PagerNo
16350 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67 65 72  sync(pBt->pPager
16360 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
16370 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
16380 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16390 20 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61   Change the defa
163a0 75 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61  ult pages size a
163b0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
163c0 20 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20   reserved bytes 
163d0 70 65 72 20 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c  per page..** Or,
163e0 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
163f0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
16400 65 6e 20 66 69 78 65 64 2c 20 72 65 74 75 72 6e  en fixed, return
16410 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
16420 20 0a 2a 2a 20 77 69 74 68 6f 75 74 20 63 68 61   .** without cha
16430 6e 67 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 0a  nging anything..
16440 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73  **.** The page s
16450 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
16460 77 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e  wer of 2 between
16470 20 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20   512 and 65536. 
16480 20 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   If the page.** 
16490 73 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f  size supplied do
164a0 65 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73  es not meet this
164b0 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e   constraint then
164c0 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69   the page size i
164d0 73 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64  s not.** changed
164e0 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a  ..**.** Page siz
164f0 65 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e  es are constrain
16500 65 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72  ed to be a power
16510 20 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20   of two so that 
16520 74 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66  the region.** of
16530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
16540 6c 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  le used for lock
16550 69 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61  ing (beginning a
16560 74 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a  t PENDING_BYTE,.
16570 2a 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74  ** the first byt
16580 65 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62  e past the 1GB b
16590 6f 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30  oundary, 0x40000
165a0 30 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63  000) needs to oc
165b0 63 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65  cur.** at the be
165c0 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67  ginning of a pag
165d0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  e..**.** If para
165e0 6d 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69  meter nReserve i
165f0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
16600 2c 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  , then the numbe
16610 72 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a  r of reserved.**
16620 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
16630 69 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65  is left unchange
16640 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
16650 69 46 69 78 21 3d 30 20 74 68 65 6e 20 74 68 65  iFix!=0 then the
16660 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
16670 58 45 44 20 66 6c 61 67 20 69 73 20 73 65 74 20  XED flag is set 
16680 73 6f 20 74 68 61 74 20 74 68 65 20 70 61 67 65  so that the page
16690 20 73 69 7a 65 0a 2a 2a 20 61 6e 64 20 61 75 74   size.** and aut
166a0 6f 76 61 63 75 75 6d 20 6d 6f 64 65 20 63 61 6e  ovacuum mode can
166b0 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 63 68   no longer be ch
166c0 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
166d0 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
166e0 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
166f0 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
16700 74 20 6e 52 65 73 65 72 76 65 2c 20 69 6e 74 20  t nReserve, int 
16710 69 46 69 78 29 7b 0a 20 20 69 6e 74 20 72 63 20  iFix){.  int rc 
16720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
16730 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
16740 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
16750 20 6e 52 65 73 65 72 76 65 3e 3d 2d 31 20 26 26   nReserve>=-1 &&
16760 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20 29   nReserve<=255 )
16770 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
16780 45 6e 74 65 72 28 70 29 3b 0a 23 69 66 20 53 51  Enter(p);.#if SQ
16790 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20  LITE_HAS_CODEC. 
167a0 20 69 66 28 20 6e 52 65 73 65 72 76 65 3e 70 42   if( nReserve>pB
167b0 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72 76  t->optimalReserv
167c0 65 20 29 20 70 42 74 2d 3e 6f 70 74 69 6d 61 6c  e ) pBt->optimal
167d0 52 65 73 65 72 76 65 20 3d 20 28 75 38 29 6e 52  Reserve = (u8)nR
167e0 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
167f0 20 69 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61   if( pBt->btsFla
16800 67 73 20 26 20 42 54 53 5f 50 41 47 45 53 49 5a  gs & BTS_PAGESIZ
16810 45 5f 46 49 58 45 44 20 29 7b 0a 20 20 20 20 73  E_FIXED ){.    s
16820 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
16830 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
16840 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
16850 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
16860 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
16870 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
16880 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
16890 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 61  bleSize;.  }.  a
168a0 73 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e  ssert( nReserve>
168b0 3d 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 3d  =0 && nReserve<=
168c0 32 35 35 20 29 3b 0a 20 20 69 66 28 20 70 61 67  255 );.  if( pag
168d0 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
168e0 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
168f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26 0a  AX_PAGE_SIZE &&.
16900 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53 69          ((pageSi
16910 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 3d  ze-1)&pageSize)=
16920 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
16930 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29  ( (pageSize & 7)
16940 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
16950 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72  t( !pBt->pCursor
16960 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67   );.    pBt->pag
16970 65 53 69 7a 65 20 3d 20 28 75 33 32 29 70 61 67  eSize = (u32)pag
16980 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65 54  eSize;.    freeT
16990 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
169a0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
169b0 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
169c0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
169d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e  pBt->pageSize, n
169e0 52 65 73 65 72 76 65 29 3b 0a 20 20 70 42 74 2d  Reserve);.  pBt-
169f0 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42  >usableSize = pB
16a00 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 28 75  t->pageSize - (u
16a10 31 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 69  16)nReserve;.  i
16a20 66 28 20 69 46 69 78 20 29 20 70 42 74 2d 3e 62  f( iFix ) pBt->b
16a30 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 50  tsFlags |= BTS_P
16a40 41 47 45 53 49 5a 45 5f 46 49 58 45 44 3b 0a 20  AGESIZE_FIXED;. 
16a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16a60 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16a70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
16a80 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  urn the currentl
16a90 79 20 64 65 66 69 6e 65 64 20 70 61 67 65 20 73  y defined page s
16aa0 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ize.*/.int sqlit
16ab0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 53 69  e3BtreeGetPageSi
16ac0 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ze(Btree *p){.  
16ad0 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
16ae0 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
16af0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
16b00 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
16b10 6c 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73  lite3BtreeGetRes
16b20 65 72 76 65 28 29 2c 20 65 78 63 65 70 74 20 74  erve(), except t
16b30 68 61 74 20 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e  hat it.** may on
16b40 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20  ly be called if 
16b50 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
16b60 20 74 68 61 74 20 74 68 65 20 62 2d 74 72 65 65   that the b-tree
16b70 20 6d 75 74 65 78 20 69 73 20 61 6c 72 65 61 64   mutex is alread
16b80 79 0a 2a 2a 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a  y.** held..**.**
16b90 20 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 20   This is useful 
16ba0 69 6e 20 6f 6e 65 20 73 70 65 63 69 61 6c 20 63  in one special c
16bb0 61 73 65 20 69 6e 20 74 68 65 20 62 61 63 6b 75  ase in the backu
16bc0 70 20 41 50 49 20 63 6f 64 65 20 77 68 65 72 65  p API code where
16bd0 20 69 74 20 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20   it is.** known 
16be0 74 68 61 74 20 74 68 65 20 73 68 61 72 65 64 20  that the shared 
16bf0 62 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20  b-tree mutex is 
16c00 68 65 6c 64 2c 20 62 75 74 20 74 68 65 20 6d 75  held, but the mu
16c10 74 65 78 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 64  tex on the .** d
16c20 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
16c30 68 61 74 20 6f 77 6e 73 20 2a 70 20 69 73 20 6e  hat owns *p is n
16c40 6f 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ot. In this case
16c50 20 69 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   if sqlite3Btree
16c60 45 6e 74 65 72 28 29 0a 2a 2a 20 77 65 72 65 20  Enter().** were 
16c70 74 6f 20 62 65 20 63 61 6c 6c 65 64 2c 20 69 74  to be called, it
16c80 20 6d 69 67 68 74 20 63 6f 6c 6c 69 64 65 20 77   might collide w
16c90 69 74 68 20 73 6f 6d 65 20 6f 74 68 65 72 20 6f  ith some other o
16ca0 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 0a  peration on the.
16cb0 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
16cc0 6c 65 20 74 68 61 74 20 6f 77 6e 73 20 2a 70 2c  le that owns *p,
16cd0 20 63 61 75 73 69 6e 67 20 75 6e 64 65 66 69 6e   causing undefin
16ce0 65 64 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a  ed behavior..*/.
16cf0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
16d00 47 65 74 52 65 73 65 72 76 65 4e 6f 4d 75 74 65  GetReserveNoMute
16d10 78 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  x(Btree *p){.  i
16d20 6e 74 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  nt n;.  assert( 
16d30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16d40 6c 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  ld(p->pBt->mutex
16d50 29 20 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42  ) );.  n = p->pB
16d60 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d  t->pageSize - p-
16d70 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
16d80 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
16d90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
16da0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
16db0 73 20 6f 66 20 73 70 61 63 65 20 61 74 20 74 68  s of space at th
16dc0 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 70  e end of every p
16dd0 61 67 65 20 74 68 61 74 0a 2a 2a 20 61 72 65 20  age that.** are 
16de0 69 6e 74 65 6e 74 75 61 6c 6c 79 20 6c 65 66 74  intentually left
16df0 20 75 6e 75 73 65 64 2e 20 20 54 68 69 73 20 69   unused.  This i
16e00 73 20 74 68 65 20 22 72 65 73 65 72 76 65 64 22  s the "reserved"
16e10 20 73 70 61 63 65 20 74 68 61 74 20 69 73 0a 2a   space that is.*
16e20 2a 20 73 6f 6d 65 74 69 6d 65 73 20 75 73 65 64  * sometimes used
16e30 20 62 79 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a   by extensions..
16e40 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
16e50 48 41 53 5f 4d 55 54 45 58 20 69 73 20 64 65 66  HAS_MUTEX is def
16e60 69 6e 65 64 20 74 68 65 6e 20 74 68 65 20 6e 75  ined then the nu
16e70 6d 62 65 72 20 72 65 74 75 72 6e 65 64 20 69 73  mber returned is
16e80 20 74 68 65 0a 2a 2a 20 67 72 65 61 74 65 72 20   the.** greater 
16e90 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
16ea0 65 73 65 72 76 65 64 20 73 70 61 63 65 20 61 6e  eserved space an
16eb0 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 72 65  d the maximum re
16ec0 71 75 65 73 74 65 64 0a 2a 2a 20 72 65 73 65 72  quested.** reser
16ed0 76 65 20 73 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74  ve space..*/.int
16ee0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16ef0 4f 70 74 69 6d 61 6c 52 65 73 65 72 76 65 28 42  OptimalReserve(B
16f00 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
16f10 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
16f20 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
16f30 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
16f40 52 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 70  ReserveNoMutex(p
16f50 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16f60 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
16f70 20 6e 3c 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d   n<p->pBt->optim
16f80 61 6c 52 65 73 65 72 76 65 20 29 20 6e 20 3d 20  alReserve ) n = 
16f90 70 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52  p->pBt->optimalR
16fa0 65 73 65 72 76 65 3b 0a 23 65 6e 64 69 66 0a 20  eserve;.#endif. 
16fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16fc0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
16fd0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  n;.}.../*.** Set
16fe0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   the maximum pag
16ff0 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64 61  e count for a da
17000 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67 65  tabase if mxPage
17010 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a 2a   is positive..**
17020 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65 20   No changes are 
17030 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20 69  made if mxPage i
17040 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  s 0 or negative.
17050 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
17060 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  f the value of m
17070 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
17080 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  e maximum page c
17090 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
170a0 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67 65  ite3BtreeMaxPage
170b0 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  Count(Btree *p, 
170c0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
170d0 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
170e0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
170f0 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  n = sqlite3Pager
17100 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d 3e  MaxPageCount(p->
17110 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
17120 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
17130 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
17140 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
17150 2a 2a 20 53 65 74 20 74 68 65 20 42 54 53 5f 53  ** Set the BTS_S
17160 45 43 55 52 45 5f 44 45 4c 45 54 45 20 66 6c 61  ECURE_DELETE fla
17170 67 20 69 66 20 6e 65 77 46 6c 61 67 20 69 73 20  g if newFlag is 
17180 30 20 6f 72 20 31 2e 20 20 49 66 20 6e 65 77 46  0 or 1.  If newF
17190 6c 61 67 20 69 73 20 2d 31 2c 0a 2a 2a 20 74 68  lag is -1,.** th
171a0 65 6e 20 6d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  en make no chang
171b0 65 73 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75  es.  Always retu
171c0 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
171d0 74 68 65 20 42 54 53 5f 53 45 43 55 52 45 5f 44  the BTS_SECURE_D
171e0 45 4c 45 54 45 0a 2a 2a 20 73 65 74 74 69 6e 67  ELETE.** setting
171f0 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e 67   after the chang
17200 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
17210 33 42 74 72 65 65 53 65 63 75 72 65 44 65 6c 65  3BtreeSecureDele
17220 74 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  te(Btree *p, int
17230 20 6e 65 77 46 6c 61 67 29 7b 0a 20 20 69 6e 74   newFlag){.  int
17240 20 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   b;.  if( p==0 )
17250 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 71 6c   return 0;.  sql
17260 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
17270 29 3b 0a 20 20 69 66 28 20 6e 65 77 46 6c 61 67  );.  if( newFlag
17280 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 70 42  >=0 ){.    p->pB
17290 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
172a0 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
172b0 45 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 46 6c  E;.    if( newFl
172c0 61 67 20 29 20 70 2d 3e 70 42 74 2d 3e 62 74 73  ag ) p->pBt->bts
172d0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
172e0 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 20  URE_DELETE;.  } 
172f0 0a 20 20 62 20 3d 20 28 70 2d 3e 70 42 74 2d 3e  .  b = (p->pBt->
17300 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 53  btsFlags & BTS_S
17310 45 43 55 52 45 5f 44 45 4c 45 54 45 29 21 3d 30  ECURE_DELETE)!=0
17320 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17330 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17340 72 6e 20 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn b;.}../*.** C
17350 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
17360 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
17370 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
17380 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
17390 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
173a0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
173b0 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
173c0 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
173d0 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
173e0 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
173f0 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
17400 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
17410 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
17420 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
17430 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
17440 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
17450 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
17460 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
17470 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
17480 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
17490 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
174a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
174b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
174c0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
174d0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
174e0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
174f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17500 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
17510 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
17520 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
17530 70 29 3b 0a 20 20 69 66 28 20 28 70 42 74 2d 3e  p);.  if( (pBt->
17540 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
17550 41 47 45 53 49 5a 45 5f 46 49 58 45 44 29 21 3d  AGESIZE_FIXED)!=
17560 30 20 26 26 20 28 61 76 20 3f 31 3a 30 29 21 3d  0 && (av ?1:0)!=
17570 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
17580 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
17590 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
175a0 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
175b0 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 20 3f  utoVacuum = av ?
175c0 31 3a 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  1:0;.    pBt->in
175d0 63 72 56 61 63 75 75 6d 20 3d 20 61 76 3d 3d 32  crVacuum = av==2
175e0 20 3f 31 3a 30 3b 0a 20 20 7d 0a 20 20 73 71 6c   ?1:0;.  }.  sql
175f0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17600 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
17610 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
17620 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
17630 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76 61   of the 'auto-va
17640 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e 20  cuum' property. 
17650 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 69  If auto-vacuum i
17660 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31 20  s .** enabled 1 
17670 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
17680 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74  erwise 0..*/.int
17690 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
176a0 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65  AutoVacuum(Btree
176b0 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c   *p){.#ifdef SQL
176c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
176d0 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54 52  UUM.  return BTR
176e0 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f  EE_AUTOVACUUM_NO
176f0 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  NE;.#else.  int 
17700 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
17710 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
17720 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70 42   = (.    (!p->pB
17730 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f 42  t->autoVacuum)?B
17740 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  TREE_AUTOVACUUM_
17750 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e 70  NONE:.    (!p->p
17760 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3f  Bt->incrVacuum)?
17770 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
17780 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45 45  _FULL:.    BTREE
17790 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
177a0 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  .  );.  sqlite3B
177b0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
177c0 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
177d0 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  f.}.../*.** Get 
177e0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70  a reference to p
177f0 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61 74  Page1 of the dat
17800 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 69  abase file.  Thi
17810 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61  s will.** also a
17820 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f 63  cquire a readloc
17830 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e 0a  k on that file..
17840 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
17850 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
17860 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65 20  uccess.  If the 
17870 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a  file is not a.**
17880 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74   well-formed dat
17890 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
178a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
178b0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 20  is returned..** 
178c0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
178d0 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 64  eturned if the d
178e0 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65  atabase is locke
178f0 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  d.  SQLITE_NOMEM
17900 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
17910 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66  if we run out of
17920 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61   memory. .*/.sta
17930 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65  tic int lockBtre
17940 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
17950 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
17960 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
17970 6c 74 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62  lt code from sub
17980 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d  functions */.  M
17990 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 20  emPage *pPage1; 
179a0 20 20 20 20 2f 2a 20 50 61 67 65 20 31 20 6f 66      /* Page 1 of
179b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
179c0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67  le */.  int nPag
179d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
179e0 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
179f0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
17a00 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 46 69  */.  int nPageFi
17a10 6c 65 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  le = 0;   /* Num
17a20 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
17a30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
17a40 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65  e */.  int nPage
17a50 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 4e  Header;     /* N
17a60 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
17a70 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  n the database a
17a80 63 63 6f 72 64 69 6e 67 20 74 6f 20 68 64 72 20  ccording to hdr 
17a90 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
17aa0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
17ab0 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
17ac0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
17ad0 50 61 67 65 31 3d 3d 30 20 29 3b 0a 20 20 72 63  Page1==0 );.  rc
17ae0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53   = sqlite3PagerS
17af0 68 61 72 65 64 4c 6f 63 6b 28 70 42 74 2d 3e 70  haredLock(pBt->p
17b00 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
17b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
17b20 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
17b30 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
17b40 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29  , 1, &pPage1, 0)
17b50 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17b60 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
17b70 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65  c;..  /* Do some
17b80 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c   checking to hel
17b90 70 20 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c  p insure the fil
17ba0 65 20 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c  e we opened real
17bb0 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c  ly is.  ** a val
17bc0 69 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  id database file
17bd0 2e 20 0a 20 20 2a 2f 0a 20 20 6e 50 61 67 65 20  . .  */.  nPage 
17be0 3d 20 6e 50 61 67 65 48 65 61 64 65 72 20 3d 20  = nPageHeader = 
17bf0 67 65 74 34 62 79 74 65 28 32 38 2b 28 75 38 2a  get4byte(28+(u8*
17c00 29 70 50 61 67 65 31 2d 3e 61 44 61 74 61 29 3b  )pPage1->aData);
17c10 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
17c20 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
17c30 61 67 65 72 2c 20 26 6e 50 61 67 65 46 69 6c 65  ager, &nPageFile
17c40 29 3b 0a 20 20 69 66 28 20 6e 50 61 67 65 3d 3d  );.  if( nPage==
17c50 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 32 34 2b 28  0 || memcmp(24+(
17c60 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61 74  u8*)pPage1->aDat
17c70 61 2c 20 39 32 2b 28 75 38 2a 29 70 50 61 67 65  a, 92+(u8*)pPage
17c80 31 2d 3e 61 44 61 74 61 2c 34 29 21 3d 30 20 29  1->aData,4)!=0 )
17c90 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50  {.    nPage = nP
17ca0 61 67 65 46 69 6c 65 3b 0a 20 20 7d 0a 20 20 69  ageFile;.  }.  i
17cb0 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
17cc0 20 20 75 33 32 20 70 61 67 65 53 69 7a 65 3b 0a    u32 pageSize;.
17cd0 20 20 20 20 75 33 32 20 75 73 61 62 6c 65 53 69      u32 usableSi
17ce0 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
17cf0 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
17d00 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
17d10 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 2f  TE_NOTADB;.    /
17d20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
17d30 2d 34 33 37 33 37 2d 33 39 39 39 39 20 45 76 65  -43737-39999 Eve
17d40 72 79 20 76 61 6c 69 64 20 53 51 4c 69 74 65 20  ry valid SQLite 
17d50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 65  database file be
17d60 67 69 6e 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  gins.    ** with
17d70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 31   the following 1
17d80 36 20 62 79 74 65 73 20 28 69 6e 20 68 65 78 29  6 bytes (in hex)
17d90 3a 20 35 33 20 35 31 20 34 63 20 36 39 20 37 34  : 53 51 4c 69 74
17da0 20 36 35 20 32 30 20 36 36 20 36 66 20 37 32 20   65 20 66 6f 72 
17db0 36 64 0a 20 20 20 20 2a 2a 20 36 31 20 37 34 20  6d.    ** 61 74 
17dc0 32 30 20 33 33 20 30 30 2e 20 2a 2f 0a 20 20 20  20 33 00. */.   
17dd0 20 69 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65   if( memcmp(page
17de0 31 2c 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c  1, zMagicHeader,
17df0 20 31 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20   16)!=0 ){.     
17e00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
17e10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
17e20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
17e30 49 54 5f 57 41 4c 0a 20 20 20 20 69 66 28 20 70  IT_WAL.    if( p
17e40 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
17e50 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
17e60 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
17e70 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
17e80 28 20 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b  ( page1[19]>1 ){
17e90 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
17ea0 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17eb0 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69     }.#else.    i
17ec0 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 32 20 29  f( page1[18]>2 )
17ed0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73  {.      pBt->bts
17ee0 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
17ef0 44 5f 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  D_ONLY;.    }.  
17f00 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e    if( page1[19]>
17f10 32 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  2 ){.      goto 
17f20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
17f30 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
17f40 20 49 66 20 74 68 65 20 77 72 69 74 65 20 76 65   If the write ve
17f50 72 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  rsion is set to 
17f60 32 2c 20 74 68 69 73 20 64 61 74 61 62 61 73 65  2, this database
17f70 20 73 68 6f 75 6c 64 20 62 65 20 61 63 63 65 73   should be acces
17f80 73 65 64 0a 20 20 20 20 2a 2a 20 69 6e 20 57 41  sed.    ** in WA
17f90 4c 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20 6c  L mode. If the l
17fa0 6f 67 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  og is not alread
17fb0 79 20 6f 70 65 6e 2c 20 6f 70 65 6e 20 69 74 20  y open, open it 
17fc0 6e 6f 77 2e 20 54 68 65 6e 20 0a 20 20 20 20 2a  now. Then .    *
17fd0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
17fe0 4f 4b 20 61 6e 64 20 72 65 74 75 72 6e 20 77 69  OK and return wi
17ff0 74 68 6f 75 74 20 70 6f 70 75 6c 61 74 69 6e 67  thout populating
18000 20 42 74 53 68 61 72 65 64 2e 70 50 61 67 65 31   BtShared.pPage1
18010 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c  ..    ** The cal
18020 6c 65 72 20 64 65 74 65 63 74 73 20 74 68 69 73  ler detects this
18030 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 69 73 20   and calls this 
18040 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 2e 20  function again. 
18050 54 68 69 73 20 69 73 0a 20 20 20 20 2a 2a 20 72  This is.    ** r
18060 65 71 75 69 72 65 64 20 61 73 20 74 68 65 20 76  equired as the v
18070 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
18080 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 74 68   currently in th
18090 65 20 70 61 67 65 31 20 62 75 66 66 65 72 0a 20  e page1 buffer. 
180a0 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
180b0 20 74 68 65 20 6c 61 74 65 73 74 20 76 65 72 73   the latest vers
180c0 69 6f 6e 20 2d 20 74 68 65 72 65 20 6d 61 79 20  ion - there may 
180d0 62 65 20 61 20 6e 65 77 65 72 20 6f 6e 65 20 69  be a newer one i
180e0 6e 20 74 68 65 20 6c 6f 67 0a 20 20 20 20 2a 2a  n the log.    **
180f0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
18100 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3d    if( page1[19]=
18110 3d 32 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46  =2 && (pBt->btsF
18120 6c 61 67 73 20 26 20 42 54 53 5f 4e 4f 5f 57 41  lags & BTS_NO_WA
18130 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  L)==0 ){.      i
18140 6e 74 20 69 73 4f 70 65 6e 20 3d 20 30 3b 0a 20  nt isOpen = 0;. 
18150 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18160 33 50 61 67 65 72 4f 70 65 6e 57 61 6c 28 70 42  3PagerOpenWal(pB
18170 74 2d 3e 70 50 61 67 65 72 2c 20 26 69 73 4f 70  t->pPager, &isOp
18180 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  en);.      if( r
18190 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
181a0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67          goto pag
181b0 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
181c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
181d0 69 73 4f 70 65 6e 3d 3d 30 20 29 7b 0a 23 69 66  isOpen==0 ){.#if
181e0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
181f0 4c 54 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56  LT_WAL_SAFETYLEV
18200 45 4c 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 65  EL.        /* De
18210 66 61 75 6c 74 20 74 6f 20 73 70 65 63 69 66 69  fault to specifi
18220 65 64 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  ed safety_level 
18230 66 6f 72 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a  for WAL mode */.
18240 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
18250 3e 64 62 21 3d 30 20 26 26 20 70 42 74 2d 3e 64  >db!=0 && pBt->d
18260 62 2d 3e 61 44 62 21 3d 30 20 29 7b 0a 20 20 20  b->aDb!=0 ){.   
18270 20 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a         int iDb;.
18280 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
18290 33 20 2a 64 62 20 3d 20 70 42 74 2d 3e 64 62 3b  3 *db = pBt->db;
182a0 0a 20 20 20 20 20 20 20 20 20 20 44 62 20 2a 61  .          Db *a
182b0 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20  Db = db->aDb;.  
182c0 20 20 20 20 20 20 20 20 75 38 20 6c 65 76 65 6c          u8 level
182d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
182e0 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
182f0 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
18300 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
18310 61 44 62 5b 69 44 62 5d 2e 70 42 74 20 26 26 20  aDb[iDb].pBt && 
18320 61 44 62 5b 69 44 62 5d 2e 70 42 74 2d 3e 70 42  aDb[iDb].pBt->pB
18330 74 3d 3d 70 42 74 20 29 20 62 72 65 61 6b 3b 0a  t==pBt ) break;.
18340 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18350 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 44        assert( iD
18360 62 3c 64 62 2d 3e 6e 44 62 20 29 3b 0a 20 20 20  b<db->nDb );.   
18370 20 20 20 20 20 20 20 6c 65 76 65 6c 20 3d 20 64         level = d
18380 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 73 61 66 65  b->aDb[iDb].safe
18390 74 79 5f 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20  ty_level;.      
183a0 20 20 20 20 69 66 28 20 21 53 51 4c 49 54 45 5f      if( !SQLITE_
183b0 44 62 53 61 66 65 74 79 4c 65 76 65 6c 49 73 46  DbSafetyLevelIsF
183c0 69 78 65 64 28 6c 65 76 65 6c 29 20 26 26 20 0a  ixed(level) && .
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
183e0 4c 49 54 45 5f 44 62 53 61 66 65 74 79 4c 65 76  LITE_DbSafetyLev
183f0 65 6c 56 61 6c 75 65 28 6c 65 76 65 6c 29 20 21  elValue(level) !
18400 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
18410 5f 57 41 4c 5f 53 41 46 45 54 59 4c 45 56 45 4c  _WAL_SAFETYLEVEL
18420 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
18430 20 61 44 62 5b 69 44 62 5d 2e 73 61 66 65 74 79   aDb[iDb].safety
18440 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45 5f  _level = SQLITE_
18450 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 41 46 45  DEFAULT_WAL_SAFE
18460 54 59 4c 45 56 45 4c 3b 0a 20 20 20 20 20 20 20  TYLEVEL;.       
18470 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
18480 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
18490 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 51 4c  pBt->pPager, SQL
184a0 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f  ITE_DEFAULT_WAL_
184b0 53 41 46 45 54 59 4c 45 56 45 4c 2c 20 0a 20 20  SAFETYLEVEL, .  
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 20 20 28 64 62 2d 3e 66 6c 61 67 73 26       (db->flags&
184f0 53 51 4c 49 54 45 5f 46 75 6c 6c 46 53 79 6e 63  SQLITE_FullFSync
18500 29 21 3d 30 2c 0a 20 20 20 20 20 20 20 20 20 20  )!=0,.          
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62               (db
18530 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 43  ->flags&SQLITE_C
18540 6b 70 74 46 75 6c 6c 46 53 79 6e 63 29 21 3d 30  kptFullFSync)!=0
18550 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18560 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
18570 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
18580 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
18590 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
185a0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
185b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
185c0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d 0a 23  _NOTADB;.    }.#
185d0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 45 56  endif..    /* EV
185e0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 35 34  IDENCE-OF: R-154
185f0 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d 61 78  65-20813 The max
18600 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d 75 6d  imum and minimum
18610 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c 6f 61   embedded payloa
18620 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74 69 6f  d.    ** fractio
18630 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61 66 20  ns and the leaf 
18640 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69 6f 6e  payload fraction
18650 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
18660 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32 2e 0a  64, 32, and 32..
18670 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
18680 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
18690 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
186a0 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
186b0 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
186c0 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
186d0 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
186e0 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
186f0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
18700 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
18710 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
18720 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
18730 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
18740 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
18750 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
18760 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20 54 68  R-51873-39618 Th
18770 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f 72 20  e page size for 
18780 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
18790 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65 72 6d  is.    ** determ
187a0 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d 62 79  ined by the 2-by
187b0 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63 61 74  te integer locat
187c0 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65 74 20  ed at an offset 
187d0 6f 66 20 31 36 20 62 79 74 65 73 20 66 72 6f 6d  of 16 bytes from
187e0 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65 67 69  .    ** the begi
187f0 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74  nning of the dat
18800 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
18810 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20 28 70     pageSize = (p
18820 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  age1[16]<<8) | (
18830 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29 3b 0a  page1[17]<<16);.
18840 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
18850 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31 36 38  OF: R-25008-2168
18860 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  8 The size of a 
18870 70 61 67 65 20 69 73 20 61 20 70 6f 77 65 72 20  page is a power 
18880 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20 62 65  of two.    ** be
18890 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35  tween 512 and 65
188a0 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e 20 2a  536 inclusive. *
188b0 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65  /.    if( ((page
188c0 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65  Size-1)&pageSize
188d0 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70 61 67  )!=0.     || pag
188e0 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
188f0 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20 20 20  _PAGE_SIZE .    
18900 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d 32 35   || pageSize<=25
18910 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  6 .    ){.      
18920 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18930 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18940 20 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53    assert( (pageS
18950 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20  ize & 7)==0 );. 
18960 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18970 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32 30 35  F: R-59310-51205
18980 20 54 68 65 20 22 72 65 73 65 72 76 65 64 20 73   The "reserved s
18990 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20 74 68  pace" size in th
189a0 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a 2a 20  e 1-byte.    ** 
189b0 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
189c0 74 20 32 30 20 69 73 20 74 68 65 20 6e 75 6d 62  t 20 is the numb
189d0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
189e0 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
189f0 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68 20 70  of.    ** each p
18a00 61 67 65 20 74 6f 20 72 65 73 65 72 76 65 20 66  age to reserve f
18a10 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e 20 0a  or extensions. .
18a20 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56      **.    ** EV
18a30 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 34  IDENCE-OF: R-374
18a40 39 37 2d 34 32 34 31 32 20 54 68 65 20 73 69 7a  97-42412 The siz
18a50 65 20 6f 66 20 74 68 65 20 72 65 73 65 72 76 65  e of the reserve
18a60 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20 20 20  d region is.    
18a70 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
18a80 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20 75 6e   the one-byte un
18a90 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66  signed integer f
18aa0 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ound at an offse
18ab0 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a 20 69  t of 20.    ** i
18ac0 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
18ad0 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 2a 2f   file header. */
18ae0 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20  .    usableSize 
18af0 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70 61 67  = pageSize - pag
18b00 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66 28 20  e1[20];.    if( 
18b10 28 75 33 32 29 70 61 67 65 53 69 7a 65 21 3d 70  (u32)pageSize!=p
18b20 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
18b30 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
18b40 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
18b50 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
18b60 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
18b70 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
18b80 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
18b90 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
18ba0 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
18bb0 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
18bc0 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
18bd0 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
18be0 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
18bf0 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
18c00 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
18c10 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
18c20 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
18c30 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
18c40 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
18c50 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
18c60 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
18c70 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
18c80 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
18c90 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
18ca0 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
18cb0 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
18cc0 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
18cd0 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
18ce0 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54 65 6d  e;.      freeTem
18cf0 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
18d00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
18d10 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
18d20 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
18d30 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  t->pageSize,.   
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d60 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c 65 53  pageSize-usableS
18d70 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
18d80 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
18d90 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d 3e 66   if( (pBt->db->f
18da0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
18db0 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30 20 26  coveryMode)==0 &
18dc0 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46 69 6c  & nPage>nPageFil
18dd0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
18de0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18df0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
18e00 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
18e10 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  d;.    }.    /* 
18e20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
18e30 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77 65 76  8312-64704 Howev
18e40 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65 20 73  er, the usable s
18e50 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ize is not allow
18e60 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ed to.    ** be 
18e70 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e 20 49  less than 480. I
18e80 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69  n other words, i
18e90 66 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  f the page size 
18ea0 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74 68 65  is 512, then the
18eb0 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76 65 64  .    ** reserved
18ec0 20 73 70 61 63 65 20 73 69 7a 65 20 63 61 6e 6e   space size cann
18ed0 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20 2a 2f  ot exceed 32. */
18ee0 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53  .    if( usableS
18ef0 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20 20 20  ize<480 ){.     
18f00 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74   goto page1_init
18f10 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20  _failed;.    }. 
18f20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
18f30 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20   = pageSize;.   
18f40 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
18f50 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23   = usableSize;.#
18f60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18f70 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
18f80 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
18f90 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26 70  m = (get4byte(&p
18fa0 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f  age1[36 + 4*4])?
18fb0 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69  1:0);.    pBt->i
18fc0 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74  ncrVacuum = (get
18fd0 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36 20  4byte(&page1[36 
18fe0 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
18ff0 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d  ndif.  }..  /* m
19000 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d  axLocal is the m
19010 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
19020 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72   payload to stor
19030 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20  e locally for.  
19040 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65  ** a cell.  Make
19050 20 73 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c   sure it is smal
19060 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74  l enough so that
19070 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e   at least minFan
19080 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63  out.  ** cells c
19090 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f  an will fit on o
190a0 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61 73 73  ne page.  We ass
190b0 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20 70 61  ume a 10-byte pa
190c0 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20  ge header..  ** 
190d0 42 65 73 69 64 65 73 20 74 68 65 20 70 61 79 6c  Besides the payl
190e0 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75  oad, the cell mu
190f0 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20  st store:.  **  
19100 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65     2-byte pointe
19110 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20  r to the cell.  
19120 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 63 68  **     4-byte ch
19130 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  ild pointer.  **
19140 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79       9-byte nKey
19150 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20   value.  **     
19160 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c  4-byte nData val
19170 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
19180 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  te overflow page
19190 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f   pointer.  ** So
191a0 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73   a cell consists
191b0 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69   of a 2-byte poi
191c0 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72 20 77  nter, a header w
191d0 68 69 63 68 20 69 73 20 61 73 20 6d 75 63 68 20  hich is as much 
191e0 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74 65 73  as.  ** 17 bytes
191f0 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79   long, 0 to N by
19200 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20  tes of payload, 
19210 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  and an optional 
19220 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a  4 byte overflow.
19230 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e 74 65    ** page pointe
19240 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d  r..  */.  pBt->m
19250 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 28  axLocal = (u16)(
19260 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
19270 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20 32 33  -12)*64/255 - 23
19280 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  );.  pBt->minLoc
19290 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42 74 2d  al = (u16)((pBt-
192a0 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
192b0 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a 20 20  32/255 - 23);.  
192c0 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 28  pBt->maxLeaf = (
192d0 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62 6c 65  u16)(pBt->usable
192e0 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20 70 42  Size - 35);.  pB
192f0 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28 75 31  t->minLeaf = (u1
19300 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  6)((pBt->usableS
19310 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
19320 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42 74 2d   23);.  if( pBt-
19330 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20 29 7b  >maxLocal>127 ){
19340 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31 62 79  .    pBt->max1by
19350 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32 37 3b  tePayload = 127;
19360 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42  .  }else{.    pB
19370 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79 6c 6f  t->max1bytePaylo
19380 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e 6d 61  ad = (u8)pBt->ma
19390 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 61 73  xLocal;.  }.  as
193a0 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
193b0 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
193c0 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
193d0 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
193e0 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d 3e 6e  pPage1;.  pBt->n
193f0 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Page = nPage;.  
19400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19410 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
19420 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
19430 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
19440 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
19450 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19460 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
19470 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19480 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72  number of cursor
19490 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e 20 54  s open on pBt. T
194a0 68 69 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a  his is for use.*
194b0 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 65 78  * in assert() ex
194c0 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74  pressions, so it
194d0 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65   is only compile
194e0 64 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  d if NDEBUG is n
194f0 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a  ot.** defined..*
19500 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74 65 20  *.** Only write 
19510 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f 75 6e  cursors are coun
19520 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20 69 73  ted if wrOnly is
19530 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f 6e 6c   true.  If wrOnl
19540 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20 74 68  y is.** false th
19550 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61  en all cursors a
19560 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a 0a 2a  re counted..**.*
19570 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73  * For the purpos
19580 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  es of this routi
19590 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69 73 20  ne, a cursor is 
195a0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
195b0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
195c0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
195d0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
195e0 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20 74 68  ase.  Cursors th
195f0 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  at.** have been 
19600 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74 68 65  tripped into the
19610 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 73 74   CURSOR_FAULT st
19620 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f 75 6e  ate are not coun
19630 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
19640 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43 75 72  nt countValidCur
19650 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
19660 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79 29 7b  Bt, int wrOnly){
19670 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
19680 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a  r;.  int r = 0;.
19690 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e    for(pCur=pBt->
196a0 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70  pCursor; pCur; p
196b0 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29  Cur=pCur->pNext)
196c0 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f 6e 6c  {.    if( (wrOnl
196d0 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d 3e 63  y==0 || (pCur->c
196e0 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 57  urFlags & BTCF_W
196f0 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a 20 20  riteFlag)!=0).  
19700 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61     && pCur->eSta
19710 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te!=CURSOR_FAULT
19720 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72   ) r++; .  }.  r
19730 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69  eturn r;.}.#endi
19740 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72  f../*.** If ther
19750 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e  e are no outstan
19760 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64  ding cursors and
19770 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74   we are not in t
19780 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20  he middle.** of 
19790 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75  a transaction bu
197a0 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65 61  t there is a rea
197b0 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
197c0 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20  tabase, then.** 
197d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72  this routine unr
197e0 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70 61  efs the first pa
197f0 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
19800 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a  se file which .*
19810 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  * has the effect
19820 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68   of releasing th
19830 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  e read lock..**.
19840 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
19850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
19860 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
19870 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
19880 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
19890 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
198a0 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
198b0 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
198c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
198d0 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
198e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ;.  assert( coun
198f0 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28 70 42  tValidCursors(pB
19900 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  t,0)==0 || pBt->
19910 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 54 52  inTransaction>TR
19920 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20 69 66  ANS_NONE );.  if
19930 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
19940 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
19950 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21   && pBt->pPage1!
19960 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  =0 ){.    MemPag
19970 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
19980 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61 73 73  >pPage1;.    ass
19990 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61 44 61  ert( pPage1->aDa
199a0 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
199b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  ( sqlite3PagerRe
199c0 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
199d0 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20 70 42  er)==1 );.    pB
199e0 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20  t->pPage1 = 0;. 
199f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f     releasePageNo
19a00 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b 0a 20  tNull(pPage1);. 
19a10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70   }.}../*.** If p
19a20 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  Bt points to an 
19a30 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65 6e 20  empty file then 
19a40 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65 6d 70  convert that emp
19a50 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74 6f 20  ty file.** into 
19a60 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61 74 61  a new empty data
19a70 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69  base by initiali
19a80 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70  zing the first p
19a90 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20 64 61  age of.** the da
19aa0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
19ab0 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
19ac0 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
19ad0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
19ae0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
19af0 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
19b00 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
19b10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
19b20 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
19b30 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65    if( pBt->nPage
19b40 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  >0 ){.    return
19b50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19b60 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
19b70 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge1;.  assert( p
19b80 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20  P1!=0 );.  data 
19b90 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20  = pP1->aData;.  
19ba0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19bb0 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50  rWrite(pP1->pDbP
19bc0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
19bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65   return rc;.  me
19be0 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69  mcpy(data, zMagi
19bf0 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  cHeader, sizeof(
19c00 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a  zMagicHeader));.
19c10 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
19c20 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d  (zMagicHeader)==
19c30 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31 36 5d  16 );.  data[16]
19c40 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61   = (u8)((pBt->pa
19c50 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66 66 29  geSize>>8)&0xff)
19c60 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d 20 28  ;.  data[17] = (
19c70 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65 53 69  u8)((pBt->pageSi
19c80 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b 0a 20  ze>>16)&0xff);. 
19c90 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
19ca0 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
19cb0 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
19cc0 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
19cd0 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
19ce0 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
19cf0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
19d00 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
19d10 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
19d20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
19d30 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
19d40 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
19d50 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
19d60 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
19d70 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
19d80 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
19d90 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
19da0 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
19db0 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
19dc0 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54  ->btsFlags |= BT
19dd0 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44  S_PAGESIZE_FIXED
19de0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
19df0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
19e00 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19e10 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c  autoVacuum==1 ||
19e20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
19e30 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
19e40 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
19e50 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72  ==1 || pBt->incr
19e60 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70  Vacuum==0 );.  p
19e70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
19e80 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75   + 4*4], pBt->au
19e90 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74  toVacuum);.  put
19ea0 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
19eb0 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72   7*4], pBt->incr
19ec0 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a  Vacuum);.#endif.
19ed0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 31    pBt->nPage = 1
19ee0 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d 20 31  ;.  data[31] = 1
19ef0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19f00 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
19f10 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 66 69  nitialize the fi
19f20 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
19f30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 63  database file (c
19f40 72 65 61 74 69 6e 67 20 61 20 64 61 74 61 62 61  reating a databa
19f50 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69 6e 67  se.** consisting
19f60 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
19f70 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d 61 20  e and no schema 
19f80 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75 72 6e  objects). Return
19f90 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 66   SQLITE_OK.** if
19fa0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
19fb0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
19fc0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  code otherwise..
19fd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
19fe0 72 65 65 4e 65 77 44 62 28 42 74 72 65 65 20 2a  reeNewDb(Btree *
19ff0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
1a000 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
1a010 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
1a020 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72 63 20  nPage = 0;.  rc 
1a030 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 2d  = newDatabase(p-
1a040 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  >pBt);.  sqlite3
1a050 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1a060 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a070 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
1a080 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
1a090 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
1a0a0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
1a0b0 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
1a0c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1a0d0 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
1a0e0 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
1a0f0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
1a100 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
1a110 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
1a120 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
1a130 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
1a140 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
1a150 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
1a160 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
1a170 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
1a180 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
1a190 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
1a1a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
1a1b0 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
1a1c0 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
1a1d0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
1a1e0 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
1a1f0 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
1a200 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
1a210 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
1a220 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
1a230 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
1a240 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
1a250 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
1a260 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
1a270 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
1a280 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
1a290 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
1a2a0 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
1a2b0 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
1a2c0 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
1a2d0 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
1a2e0 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
1a2f0 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
1a300 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
1a310 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1a320 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
1a330 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a340 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
1a350 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a360 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
1a370 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
1a380 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
1a390 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
1a3a0 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
1a3b0 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
1a3c0 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
1a3d0 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
1a3e0 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
1a3f0 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
1a400 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
1a410 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
1a420 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
1a430 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
1a440 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
1a450 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a460 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
1a470 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
1a480 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
1a490 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
1a4a0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
1a4b0 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a4c0 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
1a4d0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
1a4e0 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
1a4f0 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
1a500 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
1a510 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
1a520 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
1a530 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
1a540 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
1a550 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
1a560 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
1a570 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
1a580 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
1a590 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
1a5a0 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
1a5b0 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
1a5c0 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
1a5d0 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
1a5e0 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
1a5f0 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
1a600 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
1a610 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
1a620 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
1a630 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
1a640 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
1a650 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
1a660 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
1a670 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
1a680 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
1a690 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
1a6a0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
1a6b0 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
1a6c0 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
1a6d0 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
1a6e0 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
1a6f0 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
1a700 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1a710 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
1a720 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
1a730 77 72 66 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74  wrflag){.  sqlit
1a740 65 33 20 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a  e3 *pBlock = 0;.
1a750 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a760 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  = p->pBt;.  int 
1a770 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a780 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1a790 6e 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65  nter(p);.  btree
1a7a0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
1a7b0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
1a7c0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
1a7d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
1a7e0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
1a7f0 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
1a800 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
1a810 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
1a820 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
1a830 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
1a840 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
1a850 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
1a860 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
1a870 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
1a880 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
1a890 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
1a8a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a8b0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  }.  assert( pBt-
1a8c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
1a8d0 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 49  TRANS_WRITE || I
1a8e0 66 4e 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e  fNotOmitAV(pBt->
1a8f0 62 44 6f 54 72 75 6e 63 61 74 65 29 3d 3d 30 20  bDoTruncate)==0 
1a900 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74  );..  /* Write t
1a910 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
1a920 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20  not possible on 
1a930 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
1a940 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 28 70  base */.  if( (p
1a950 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
1a960 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30  TS_READ_ONLY)!=0
1a970 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1a980 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1a990 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 67 6f 74 6f  ADONLY;.    goto
1a9a0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
1a9b0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1a9c0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
1a9d0 43 48 45 0a 20 20 2f 2a 20 49 66 20 61 6e 6f 74  CHE.  /* If anot
1a9e0 68 65 72 20 64 61 74 61 62 61 73 65 20 68 61 6e  her database han
1a9f0 64 6c 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  dle has already 
1aa00 6f 70 65 6e 65 64 20 61 20 77 72 69 74 65 20 74  opened a write t
1aa10 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 2a 2a  ransaction .  **
1aa20 20 6f 6e 20 74 68 69 73 20 73 68 61 72 65 64 2d   on this shared-
1aa30 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
1aa40 61 6e 64 20 61 20 73 65 63 6f 6e 64 20 77 72 69  and a second wri
1aa50 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
1aa60 73 0a 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64  s.  ** requested
1aa70 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
1aa80 4c 4f 43 4b 45 44 2e 0a 20 20 2a 2f 0a 20 20 69  LOCKED..  */.  i
1aa90 66 28 20 28 77 72 66 6c 61 67 20 26 26 20 70 42  f( (wrflag && pB
1aaa0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1aab0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 0a 20  ==TRANS_WRITE). 
1aac0 20 20 7c 7c 20 28 70 42 74 2d 3e 62 74 73 46 6c    || (pBt->btsFl
1aad0 61 67 73 20 26 20 42 54 53 5f 50 45 4e 44 49 4e  ags & BTS_PENDIN
1aae0 47 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 70  G)!=0.  ){.    p
1aaf0 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57 72  Block = pBt->pWr
1ab00 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73  iter->db;.  }els
1ab10 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20 29  e if( wrflag>1 )
1ab20 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 49  {.    BtLock *pI
1ab30 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49 74  ter;.    for(pIt
1ab40 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70  er=pBt->pLock; p
1ab50 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65  Iter; pIter=pIte
1ab60 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  r->pNext){.     
1ab70 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1ab80 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1ab90 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72 2d   pBlock = pIter-
1aba0 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
1abb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1abc0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1abd0 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20 20  if( pBlock ){.  
1abe0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
1abf0 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
1ac00 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 72  , pBlock);.    r
1ac10 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1ac20 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1ac30 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
1ac40 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  gun;.  }.#endif.
1ac50 0a 20 20 2f 2a 20 41 6e 79 20 72 65 61 64 2d 6f  .  /* Any read-o
1ac60 6e 6c 79 20 6f 72 20 72 65 61 64 2d 77 72 69 74  nly or read-writ
1ac70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6d  e transaction im
1ac80 70 6c 69 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  plies a read-loc
1ac90 6b 20 6f 6e 20 0a 20 20 2a 2a 20 70 61 67 65 20  k on .  ** page 
1aca0 31 2e 20 53 6f 20 69 66 20 73 6f 6d 65 20 6f 74  1. So if some ot
1acb0 68 65 72 20 73 68 61 72 65 64 2d 63 61 63 68 65  her shared-cache
1acc0 20 63 6c 69 65 6e 74 20 61 6c 72 65 61 64 79 20   client already 
1acd0 68 61 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  has a write-lock
1ace0 20 0a 20 20 2a 2a 20 6f 6e 20 70 61 67 65 20 31   .  ** on page 1
1acf0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
1ad00 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e  n cannot be open
1ad10 65 64 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 71 75  ed. */.  rc = qu
1ad20 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
1ad30 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45  bleLock(p, MASTE
1ad40 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43  R_ROOT, READ_LOC
1ad50 4b 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45  K);.  if( SQLITE
1ad60 5f 4f 4b 21 3d 72 63 20 29 20 67 6f 74 6f 20 74  _OK!=rc ) goto t
1ad70 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 0a 20 20 70  rans_begun;..  p
1ad80 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
1ad90 7e 42 54 53 5f 49 4e 49 54 49 41 4c 4c 59 5f 45  ~BTS_INITIALLY_E
1ada0 4d 50 54 59 3b 0a 20 20 69 66 28 20 70 42 74 2d  MPTY;.  if( pBt-
1adb0 3e 6e 50 61 67 65 3d 3d 30 20 29 20 70 42 74 2d  >nPage==0 ) pBt-
1adc0 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1add0 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
1ade0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 2f 2a 20  ;.  do {.    /* 
1adf0 43 61 6c 6c 20 6c 6f 63 6b 42 74 72 65 65 28 29  Call lockBtree()
1ae00 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 70 42   until either pB
1ae10 74 2d 3e 70 50 61 67 65 31 20 69 73 20 70 6f 70  t->pPage1 is pop
1ae20 75 6c 61 74 65 64 20 6f 72 0a 20 20 20 20 2a 2a  ulated or.    **
1ae30 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 72 65 74   lockBtree() ret
1ae40 75 72 6e 73 20 73 6f 6d 65 74 68 69 6e 67 20 6f  urns something o
1ae50 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
1ae60 5f 4f 4b 2e 20 6c 6f 63 6b 42 74 72 65 65 28 29  _OK. lockBtree()
1ae70 0a 20 20 20 20 2a 2a 20 6d 61 79 20 72 65 74 75  .    ** may retu
1ae80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74  rn SQLITE_OK but
1ae90 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
1aea0 65 31 20 73 65 74 20 74 6f 20 30 20 69 66 20 61  e1 set to 0 if a
1aeb0 66 74 65 72 0a 20 20 20 20 2a 2a 20 72 65 61 64  fter.    ** read
1aec0 69 6e 67 20 70 61 67 65 20 31 20 69 74 20 64 69  ing page 1 it di
1aed0 73 63 6f 76 65 72 73 20 74 68 61 74 20 74 68 65  scovers that the
1aee0 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
1aef0 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 20 20  e database .    
1af00 2a 2a 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 70  ** file is not p
1af10 42 74 2d 3e 70 61 67 65 53 69 7a 65 2e 20 49 6e  Bt->pageSize. In
1af20 20 74 68 69 73 20 63 61 73 65 20 6c 6f 63 6b 42   this case lockB
1af30 74 72 65 65 28 29 20 77 69 6c 6c 20 75 70 64 61  tree() will upda
1af40 74 65 0a 20 20 20 20 2a 2a 20 70 42 74 2d 3e 70  te.    ** pBt->p
1af50 61 67 65 53 69 7a 65 20 74 6f 20 74 68 65 20 70  ageSize to the p
1af60 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68 65 20  age-size of the 
1af70 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20  file on disk..  
1af80 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
1af90 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 26  pBt->pPage1==0 &
1afa0 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63  & SQLITE_OK==(rc
1afb0 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
1afc0 29 29 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  )) );..    if( r
1afd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1afe0 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  wrflag ){.      
1aff0 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46 6c 61  if( (pBt->btsFla
1b000 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f 4e  gs & BTS_READ_ON
1b010 4c 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  LY)!=0 ){.      
1b020 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
1b030 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
1b040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1b050 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
1b060 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  gin(pBt->pPager,
1b070 77 72 66 6c 61 67 3e 31 2c 73 71 6c 69 74 65 33  wrflag>1,sqlite3
1b080 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 70 2d 3e  TempInMemory(p->
1b090 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db));.        if
1b0a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b0b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1b0c0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
1b0d0 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
1b0e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1b0f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 6e  E_OK ){.      un
1b110 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
1b120 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  d(pBt);.    }.  
1b130 7d 77 68 69 6c 65 28 20 28 72 63 26 30 78 46 46  }while( (rc&0xFF
1b140 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  )==SQLITE_BUSY &
1b150 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  & pBt->inTransac
1b160 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  tion==TRANS_NONE
1b170 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 62 74   &&.          bt
1b180 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
1b190 64 6c 65 72 28 70 42 74 29 20 29 3b 0a 0a 20 20  dler(pBt) );..  
1b1a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b1b0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
1b1c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
1b1d0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
1b1e0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
1b1f0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
1b200 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1b210 48 45 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  HE.      if( p->
1b220 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20  sharable ){.    
1b230 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c      assert( p->l
1b240 6f 63 6b 2e 70 42 74 72 65 65 3d 3d 70 20 26 26  ock.pBtree==p &&
1b250 20 70 2d 3e 6c 6f 63 6b 2e 69 54 61 62 6c 65 3d   p->lock.iTable=
1b260 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  =1 );.        p-
1b270 3e 6c 6f 63 6b 2e 65 4c 6f 63 6b 20 3d 20 52 45  >lock.eLock = RE
1b280 41 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  AD_LOCK;.       
1b290 20 70 2d 3e 6c 6f 63 6b 2e 70 4e 65 78 74 20 3d   p->lock.pNext =
1b2a0 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20   pBt->pLock;.   
1b2b0 20 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20       pBt->pLock 
1b2c0 3d 20 26 70 2d 3e 6c 6f 63 6b 3b 0a 20 20 20 20  = &p->lock;.    
1b2d0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
1b2e0 0a 20 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  .    p->inTrans 
1b2f0 3d 20 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f  = (wrflag?TRANS_
1b300 57 52 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44  WRITE:TRANS_READ
1b310 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e  );.    if( p->in
1b320 54 72 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61  Trans>pBt->inTra
1b330 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20  nsaction ){.    
1b340 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
1b350 74 69 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e  tion = p->inTran
1b360 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  s;.    }.    if(
1b370 20 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20   wrflag ){.     
1b380 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1b390 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a   = pBt->pPage1;.
1b3a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1b3b0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
1b3c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1b3d0 70 42 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a  pBt->pWriter );.
1b3e0 20 20 20 20 20 20 70 42 74 2d 3e 70 57 72 69 74        pBt->pWrit
1b3f0 65 72 20 3d 20 70 3b 0a 20 20 20 20 20 20 70 42  er = p;.      pB
1b400 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
1b410 42 54 53 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  BTS_EXCLUSIVE;. 
1b420 20 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e       if( wrflag>
1b430 31 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  1 ) pBt->btsFlag
1b440 73 20 7c 3d 20 42 54 53 5f 45 58 43 4c 55 53 49  s |= BTS_EXCLUSI
1b450 56 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  VE;.#endif..    
1b460 20 20 2f 2a 20 49 66 20 74 68 65 20 64 62 2d 73    /* If the db-s
1b470 69 7a 65 20 68 65 61 64 65 72 20 66 69 65 6c 64  ize header field
1b480 20 69 73 20 69 6e 63 6f 72 72 65 63 74 20 28 61   is incorrect (a
1b490 73 20 69 74 20 6d 61 79 20 62 65 20 69 66 20 61  s it may be if a
1b4a0 6e 20 6f 6c 64 0a 20 20 20 20 20 20 2a 2a 20 63  n old.      ** c
1b4b0 6c 69 65 6e 74 20 68 61 73 20 62 65 65 6e 20 77  lient has been w
1b4c0 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1b4d0 61 73 65 20 66 69 6c 65 29 2c 20 75 70 64 61 74  ase file), updat
1b4e0 65 20 69 74 20 6e 6f 77 2e 20 44 6f 69 6e 67 0a  e it now. Doing.
1b4f0 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 73 6f        ** this so
1b500 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
1b510 20 6c 61 74 65 72 20 6d 65 61 6e 73 20 74 68 65   later means the
1b520 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 63   database size c
1b530 61 6e 20 73 61 66 65 6c 79 20 0a 20 20 20 20 20  an safely .     
1b540 20 2a 2a 20 72 65 2d 72 65 61 64 20 74 68 65 20   ** re-read the 
1b550 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 72  database size fr
1b560 6f 6d 20 70 61 67 65 20 31 20 69 66 20 61 20 73  om page 1 if a s
1b570 61 76 65 70 6f 69 6e 74 20 6f 72 20 74 72 61 6e  avepoint or tran
1b580 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  saction.      **
1b590 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1b5a0 20 77 69 74 68 69 6e 20 74 68 65 20 74 72 61 6e   within the tran
1b5b0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1b5c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
1b5d0 3e 6e 50 61 67 65 21 3d 67 65 74 34 62 79 74 65  >nPage!=get4byte
1b5e0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1b5f0 32 38 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  28]) ){.        
1b600 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1b610 72 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70  rWrite(pPage1->p
1b620 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1b630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1b650 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1b660 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20 70 42 74  ->aData[28], pBt
1b670 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20  ->nPage);.      
1b680 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1b690 7d 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  }.  }...trans_be
1b6a0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
1b6b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
1b6c0 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
1b6d0 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
1b6e0 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
1b6f0 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
1b700 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
1b710 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
1b720 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
1b730 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
1b740 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
1b750 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
1b760 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
1b770 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
1b780 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
1b790 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
1b7a0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1b7b0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
1b7c0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
1b7d0 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
1b7e0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
1b7f0 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
1b800 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
1b810 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
1b820 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
1b830 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1b840 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
1b850 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
1b860 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1b870 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
1b880 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
1b890 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
1b8a0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
1b8b0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
1b8c0 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
1b8d0 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
1b8e0 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
1b8f0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
1b900 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
1b910 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
1b920 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
1b930 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1b960 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
1b970 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b9a0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
1b9b0 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
1b9c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
1b9f0 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
1ba00 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1ba10 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
1ba20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
1ba30 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
1ba40 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
1ba50 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ba60 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
1ba70 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
1ba80 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
1ba90 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 69  Page(pPage);.  i
1baa0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bab0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
1bac0 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
1bad0 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
1bae0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1baf0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
1bb00 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
1bb10 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
1bb20 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
1bb30 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f 76 66      ptrmapPutOvf
1bb40 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
1bb50 6c 2c 20 26 72 63 29 3b 0a 0a 20 20 20 20 69 66  l, &rc);..    if
1bb60 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1bb70 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68 69  {.      Pgno chi
1bb80 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  ldPgno = get4byt
1bb90 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20  e(pCell);.      
1bba0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63  ptrmapPut(pBt, c
1bbb0 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50  hildPgno, PTRMAP
1bbc0 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c 20 26 72  _BTREE, pgno, &r
1bbd0 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1bbe0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1bbf0 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68  f ){.    Pgno ch
1bc00 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
1bc10 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1bc20 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1bc30 74 2b 38 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61  t+8]);.    ptrma
1bc40 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
1bc50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
1bc60 45 2c 20 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20  E, pgno, &rc);. 
1bc70 20 7d 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74   }..set_child_pt
1bc80 72 6d 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61  rmaps_out:.  pPa
1bc90 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
1bca0 6e 69 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72  nitOrig;.  retur
1bcb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
1bcc0 6f 6d 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67  omewhere on pPag
1bcd0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1bce0 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 20 4d  o page iFrom.  M
1bcf0 6f 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74  odify this point
1bd00 65 72 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  er so.** that it
1bd10 20 70 6f 69 6e 74 73 20 74 6f 20 69 54 6f 2e 20   points to iTo. 
1bd20 50 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20  Parameter eType 
1bd30 64 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79  describes the ty
1bd40 70 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f  pe of pointer to
1bd50 0a 2a 2a 20 62 65 20 6d 6f 64 69 66 69 65 64 2c  .** be modified,
1bd60 20 61 73 20 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a   as  follows:.**
1bd70 0a 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45  .** PTRMAP_BTREE
1bd80 3a 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61  :     pPage is a
1bd90 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
1bda0 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
1bdb0 61 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20  at a child .**  
1bdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdd0 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a   page of pPage..
1bde0 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
1bdf0 52 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73  RFLOW1: pPage is
1be00 20 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54   a btree-page. T
1be10 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1be20 73 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77  s at an overflow
1be30 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1be40 20 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74        page point
1be50 65 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20  ed to by one of 
1be60 74 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61  the cells on pPa
1be70 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50  ge..**.** PTRMAP
1be80 5f 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67  _OVERFLOW2: pPag
1be90 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77  e is an overflow
1bea0 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1beb0 65 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  er points at the
1bec0 20 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20   next.**        
1bed0 20 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66             overf
1bee0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
1bef0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
1bf00 69 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f  int modifyPagePo
1bf10 69 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70  inter(MemPage *p
1bf20 50 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d  Page, Pgno iFrom
1bf30 2c 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65  , Pgno iTo, u8 e
1bf40 54 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Type){.  assert(
1bf50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1bf60 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1bf70 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1bf80 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
1bf90 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
1bfa0 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
1bfb0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
1bfc0 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a  AP_OVERFLOW2 ){.
1bfd0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
1bfe0 65 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  er is always the
1bff0 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f   first 4 bytes o
1c000 66 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68  f the page in th
1c010 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
1c020 20 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50   if( get4byte(pP
1c030 61 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72  age->aData)!=iFr
1c040 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  om ){.      retu
1c050 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1c060 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1c070 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
1c080 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20  ->aData, iTo);. 
1c090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69   }else{.    u8 i
1c0a0 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67  sInitOrig = pPag
1c0b0 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69  e->isInit;.    i
1c0c0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43  nt i;.    int nC
1c0d0 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ell;.    int rc;
1c0e0 0a 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ..    rc = btree
1c0f0 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b  InitPage(pPage);
1c100 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
1c110 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6e 43 65  turn rc;.    nCe
1c120 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c  ll = pPage->nCel
1c130 6c 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  l;..    for(i=0;
1c140 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
1c150 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
1c160 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
1c170 2c 20 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , i);.      if( 
1c180 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56  eType==PTRMAP_OV
1c190 45 52 46 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20  ERFLOW1 ){.     
1c1a0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
1c1b0 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
1c1c0 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
1c1d0 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
1c1e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
1c1f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 0a 20 20 20  fo.iOverflow.   
1c200 20 20 20 20 20 20 26 26 20 70 43 65 6c 6c 2b 69        && pCell+i
1c210 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b 33 3c  nfo.iOverflow+3<
1c220 3d 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50  =pPage->aData+pP
1c230 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20  age->maskPage.  
1c240 20 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d         && iFrom=
1c250 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
1c260 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
1c270 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
1c280 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1c290 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
1c2a0 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
1c2b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c2d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1c2e0 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
1c2f0 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
1c300 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
1c310 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
1c320 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1c340 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
1c350 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
1c360 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1c370 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
1c380 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
1c390 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
1c3a0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
1c3b0 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
1c3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1c3d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1c3e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1c3f0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
1c400 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1c410 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
1c420 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1c430 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
1c440 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
1c450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c460 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
1c470 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
1c480 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
1c490 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
1c4a0 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
1c4b0 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
1c4c0 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
1c4d0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
1c4e0 2a 0a 2a 2a 20 54 68 65 20 69 73 43 6f 6d 6d 69  *.** The isCommi
1c4f0 74 20 66 6c 61 67 20 69 6e 64 69 63 61 74 65 73  t flag indicates
1c500 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
1c510 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65 6d 62  o need to rememb
1c520 65 72 20 74 68 61 74 0a 2a 2a 20 74 68 65 20 6a  er that.** the j
1c530 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20  ournal needs to 
1c540 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  be sync()ed befo
1c550 72 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65  re database page
1c560 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 0a   pDbPage->pgno .
1c570 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74 74 65  ** can be writte
1c580 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c 65 72  n to. The caller
1c590 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 72 6f   has already pro
1c5a0 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77 72 69  mised not to wri
1c5b0 74 65 20 74 6f 20 74 68 61 74 0a 2a 2a 20 70 61  te to that.** pa
1c5c0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
1c5d0 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 0a  t relocatePage(.
1c5e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
1c5f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
1c600 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
1c610 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20 20 20   *pDbPage,      
1c620 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 74    /* Open page t
1c630 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38 20 65  o move */.  u8 e
1c640 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  Type,           
1c650 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1c660 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74 72 79  map 'type' entry
1c670 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1c680 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67 65 2c    Pgno iPtrPage,
1c690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
1c6a0 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67 65 2d  inter map 'page-
1c6b0 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  no' entry for pD
1c6c0 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
1c6d0 69 46 72 65 65 50 61 67 65 2c 20 20 20 20 20 20  iFreePage,      
1c6e0 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 61 74      /* The locat
1c6f0 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44 62 50  ion to move pDbP
1c700 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  age to */.  int 
1c710 69 73 43 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  isCommit        
1c720 20 20 20 20 20 2f 2a 20 69 73 43 6f 6d 6d 69 74       /* isCommit
1c730 20 66 6c 61 67 20 70 61 73 73 65 64 20 74 6f 20   flag passed to 
1c740 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
1c750 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d  page */.){.  Mem
1c760 50 61 67 65 20 2a 70 50 74 72 50 61 67 65 3b 20  Page *pPtrPage; 
1c770 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
1c780 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  at contains a po
1c790 69 6e 74 65 72 20 74 6f 20 70 44 62 50 61 67 65  inter to pDbPage
1c7a0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44 62 50 61   */.  Pgno iDbPa
1c7b0 67 65 20 3d 20 70 44 62 50 61 67 65 2d 3e 70 67  ge = pDbPage->pg
1c7c0 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  no;.  Pager *pPa
1c7d0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
1c7e0 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
1c7f0 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 50  assert( eType==P
1c800 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
1c810 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c820 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c 20 0a 20  _OVERFLOW1 || . 
1c830 20 20 20 20 20 65 54 79 70 65 3d 3d 50 54 52 4d       eType==PTRM
1c840 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70  AP_BTREE || eTyp
1c850 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
1c860 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
1c870 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1c880 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1c890 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 50  ;.  assert( pDbP
1c8a0 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  age->pBt==pBt );
1c8b0 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70 61 67 65  ..  /* Move page
1c8c0 20 69 44 62 50 61 67 65 20 66 72 6f 6d 20 69 74   iDbPage from it
1c8d0 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  s current locati
1c8e0 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75 6d 62 65  on to page numbe
1c8f0 72 20 69 46 72 65 65 50 61 67 65 20 2a 2f 0a 20  r iFreePage */. 
1c900 20 54 52 41 43 45 28 28 22 41 55 54 4f 56 41 43   TRACE(("AUTOVAC
1c910 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25 64 20 74  UUM: Moving %d t
1c920 6f 20 66 72 65 65 20 70 61 67 65 20 25 64 20 28  o free page %d (
1c930 70 74 72 20 70 61 67 65 20 25 64 20 74 79 70 65  ptr page %d type
1c940 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20   %d)\n", .      
1c950 69 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  iDbPage, iFreePa
1c960 67 65 2c 20 69 50 74 72 50 61 67 65 2c 20 65 54  ge, iPtrPage, eT
1c970 79 70 65 29 29 3b 0a 20 20 72 63 20 3d 20 73 71  ype));.  rc = sq
1c980 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
1c990 67 65 28 70 50 61 67 65 72 2c 20 70 44 62 50 61  ge(pPager, pDbPa
1c9a0 67 65 2d 3e 70 44 62 50 61 67 65 2c 20 69 46 72  ge->pDbPage, iFr
1c9b0 65 65 50 61 67 65 2c 20 69 73 43 6f 6d 6d 69 74  eePage, isCommit
1c9c0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1c9d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1c9e0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
1c9f0 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
1ca00 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
1ca10 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
1ca20 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
1ca30 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
1ca40 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
1ca50 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
1ca60 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
1ca70 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
1ca80 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
1ca90 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
1caa0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
1cab0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
1cac0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
1cad0 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
1cae0 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
1caf0 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
1cb00 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
1cb10 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
1cb20 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
1cb30 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
1cb40 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
1cb50 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
1cb60 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
1cb70 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
1cb80 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
1cb90 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
1cba0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
1cbb0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
1cbc0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
1cbd0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
1cbe0 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
1cbf0 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
1cc00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1cc10 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
1cc20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
1cc30 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
1cc40 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
1cc50 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
1cc60 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
1cc70 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
1cc80 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
1cc90 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
1cca0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
1ccb0 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1ccc0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ccd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
1cce0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1ccf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
1cd00 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
1cd10 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
1cd20 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
1cd30 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
1cd40 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
1cd50 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
1cd60 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
1cd70 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
1cd80 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
1cd90 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
1cda0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
1cdb0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1cdc0 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47 65      rc = btreeGe
1cdd0 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72 50  tPage(pBt, iPtrP
1cde0 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c 20  age, &pPtrPage, 
1cdf0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
1ce00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ce10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ce20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
1ce30 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1ce40 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67 65  PtrPage->pDbPage
1ce50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ce60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ce70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1ce80 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72  trPage);.      r
1ce90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1cea0 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79 50      rc = modifyP
1ceb0 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72 50  agePointer(pPtrP
1cec0 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69 46  age, iDbPage, iF
1ced0 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29 3b  reePage, eType);
1cee0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
1cef0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
1cf00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1cf10 4b 20 29 7b 0a 20 20 20 20 20 20 70 74 72 6d 61  K ){.      ptrma
1cf20 70 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50  pPut(pBt, iFreeP
1cf30 61 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72  age, eType, iPtr
1cf40 50 61 67 65 2c 20 26 72 63 29 3b 0a 20 20 20 20  Page, &rc);.    
1cf50 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1cf60 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  c;.}../* Forward
1cf70 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65 71   declaration req
1cf80 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61 63  uired by incrVac
1cf90 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73 74  uumStep(). */.st
1cfa0 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
1cfb0 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68 61  eBtreePage(BtSha
1cfc0 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20 2a  red *, MemPage *
1cfd0 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c  *, Pgno *, Pgno,
1cfe0 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72   u8);../*.** Per
1cff0 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73 74  form a single st
1d000 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d 65  ep of an increme
1d010 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66 20  ntal-vacuum. If 
1d020 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
1d030 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e  rn.** SQLITE_OK.
1d040 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1d050 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64 20  work to do (and 
1d060 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 70 6f 69  therefore no poi
1d070 6e 74 20 69 6e 20 0a 2a 2a 20 63 61 6c 6c 69 6e  nt in .** callin
1d080 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
1d090 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
1d0a0 51 4c 49 54 45 5f 44 4f 4e 45 2e 20 4f 72 2c 20  QLITE_DONE. Or, 
1d0b0 69 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20  if an error .** 
1d0c0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 73  occurs, return s
1d0d0 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20  ome other error 
1d0e0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  code..**.** More
1d0f0 20 73 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 74   specifically, t
1d100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74  his function att
1d110 65 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61  empts to re-orga
1d120 6e 69 7a 65 20 74 68 65 20 64 61 74 61 62 61 73  nize the databas
1d130 65 20 73 6f 20 0a 2a 2a 20 74 68 61 74 20 74 68  e so .** that th
1d140 65 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74  e last page of t
1d150 68 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c  he file currentl
1d160 79 20 69 6e 20 75 73 65 20 69 73 20 6e 6f 20 6c  y in use is no l
1d170 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
1d180 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 6e 46  .** Parameter nF
1d190 69 6e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  in is the number
1d1a0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74   of pages that t
1d1b0 68 69 73 20 64 61 74 61 62 61 73 65 20 77 6f 75  his database wou
1d1c0 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 77 65  ld contain.** we
1d1d0 72 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  re this function
1d1e0 20 63 61 6c 6c 65 64 20 75 6e 74 69 6c 20 69 74   called until it
1d1f0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1d200 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  DONE..**.** If t
1d210 68 65 20 62 43 6f 6d 6d 69 74 20 70 61 72 61 6d  he bCommit param
1d220 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  eter is non-zero
1d230 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1d240 61 73 73 75 6d 65 73 20 74 68 61 74 20 74 68 65  assumes that the
1d250 20 0a 2a 2a 20 63 61 6c 6c 65 72 20 77 69 6c 6c   .** caller will
1d260 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
1d270 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
1d280 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1d290 53 51 4c 49 54 45 5f 44 4f 4e 45 20 0a 2a 2a 20  SQLITE_DONE .** 
1d2a0 6f 72 20 61 6e 20 65 72 72 6f 72 2e 20 62 43 6f  or an error. bCo
1d2b0 6d 6d 69 74 20 69 73 20 70 61 73 73 65 64 20 74  mmit is passed t
1d2c0 72 75 65 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  rue for an auto-
1d2d0 76 61 63 75 75 6d 2d 6f 6e 2d 63 6f 6d 6d 69 74  vacuum-on-commit
1d2e0 20 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2c 20   .** operation, 
1d2f0 6f 72 20 66 61 6c 73 65 20 66 6f 72 20 61 6e 20  or false for an 
1d300 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
1d310 75 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  um..*/.static in
1d320 74 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  t incrVacuumStep
1d330 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
1d340 50 67 6e 6f 20 6e 46 69 6e 2c 20 50 67 6e 6f 20  Pgno nFin, Pgno 
1d350 69 4c 61 73 74 50 67 2c 20 69 6e 74 20 62 43 6f  iLastPg, int bCo
1d360 6d 6d 69 74 29 7b 0a 20 20 50 67 6e 6f 20 6e 46  mmit){.  Pgno nF
1d370 72 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20  reeList;        
1d380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1d390 70 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74  pages still on t
1d3a0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a  he free-list */.
1d3b0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1d3c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1d3d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
1d3e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
1d3f0 20 69 4c 61 73 74 50 67 3e 6e 46 69 6e 20 29 3b   iLastPg>nFin );
1d400 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41 50 5f  ..  if( !PTRMAP_
1d410 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1d420 74 50 67 29 20 26 26 20 69 4c 61 73 74 50 67 21  tPg) && iLastPg!
1d430 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1d440 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 75  GE(pBt) ){.    u
1d450 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
1d460 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
1d470 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
1d480 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
1d490 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
1d4a0 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
1d4b0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  t==0 ){.      re
1d4c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
1d4d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
1d4e0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1d4f0 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
1d500 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
1d510 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d520 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1d530 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1d540 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
1d550 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1d560 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d570 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1d580 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1d590 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1d5a0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1d5b0 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20   if( bCommit==0 
1d5c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
1d5d0 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
1d5e0 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
1d5f0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
1d600 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
1d610 20 20 20 20 20 2a 2a 20 69 66 20 62 43 6f 6d 6d       ** if bComm
1d620 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  it is non-zero. 
1d630 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 68  In that case, th
1d640 65 20 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c  e free-list will
1d650 20 62 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   be.        ** t
1d660 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f  runcated to zero
1d670 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1d680 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f  tion returns, so
1d690 20 69 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20   it doesn't .   
1d6a0 20 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69       ** matter i
1d6b0 66 20 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61  f it still conta
1d6c0 69 6e 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65  ins some garbage
1d6d0 20 65 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20   entries..      
1d6e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1d6f0 6f 20 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20  o iFreePg;.     
1d700 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65     MemPage *pFre
1d710 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ePg;.        rc 
1d720 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
1d730 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65 50  age(pBt, &pFreeP
1d740 67 2c 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61  g, &iFreePg, iLa
1d750 73 74 50 67 2c 20 42 54 41 4c 4c 4f 43 5f 45 58  stPg, BTALLOC_EX
1d760 41 43 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ACT);.        if
1d770 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d780 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1d790 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d7a0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1d7b0 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
1d7c0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
1d7d0 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1d7e0 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
1d7f0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
1d800 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
1d810 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1d820 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
1d830 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
1d840 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
1d850 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 20 20 20  ge *pLastPg;.   
1d860 20 20 20 75 38 20 65 4d 6f 64 65 20 3d 20 42 54     u8 eMode = BT
1d870 41 4c 4c 4f 43 5f 41 4e 59 3b 20 20 20 2f 2a 20  ALLOC_ANY;   /* 
1d880 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72 20 66  Mode parameter f
1d890 6f 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  or allocateBtree
1d8a0 50 61 67 65 28 29 20 2a 2f 0a 20 20 20 20 20 20  Page() */.      
1d8b0 50 67 6e 6f 20 69 4e 65 61 72 20 3d 20 30 3b 20  Pgno iNear = 0; 
1d8c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 65 61            /* nea
1d8d0 72 62 79 20 70 61 72 61 6d 65 74 65 72 20 66 6f  rby parameter fo
1d8e0 72 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  r allocateBtreeP
1d8f0 61 67 65 28 29 20 2a 2f 0a 0a 20 20 20 20 20 20  age() */..      
1d900 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
1d910 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20  e(pBt, iLastPg, 
1d920 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a 20 20  &pLastPg, 0);.  
1d930 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1d940 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1d950 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d960 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
1d970 20 62 43 6f 6d 6d 69 74 20 69 73 20 7a 65 72 6f   bCommit is zero
1d980 2c 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  , this loop runs
1d990 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e   exactly once an
1d9a0 64 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20  d page pLastPg. 
1d9b0 20 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70       ** is swapp
1d9c0 65 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ed with the firs
1d9d0 74 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c  t free page pull
1d9e0 65 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20  ed off the free 
1d9f0 6c 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  list..      **. 
1da00 20 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f       ** On the o
1da10 74 68 65 72 20 68 61 6e 64 2c 20 69 66 20 62 43  ther hand, if bC
1da20 6f 6d 6d 69 74 20 69 73 20 67 72 65 61 74 65 72  ommit is greater
1da30 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
1da40 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a 20 6c   keep.      ** l
1da50 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61 20 66  ooping until a f
1da60 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74 65 64  ree-page located
1da70 20 77 69 74 68 69 6e 20 74 68 65 20 66 69 72 73   within the firs
1da80 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20 20 20  t nFin pages.   
1da90 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c     ** of the fil
1daa0 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20  e is found..    
1dab0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62    */.      if( b
1dac0 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20  Commit==0 ){.   
1dad0 20 20 20 20 20 65 4d 6f 64 65 20 3d 20 42 54 41       eMode = BTA
1dae0 4c 4c 4f 43 5f 4c 45 3b 0a 20 20 20 20 20 20 20  LLOC_LE;.       
1daf0 20 69 4e 65 61 72 20 3d 20 6e 46 69 6e 3b 0a 20   iNear = nFin;. 
1db00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 6f 20       }.      do 
1db10 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
1db20 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1db30 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1db40 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1db50 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1db60 50 67 2c 20 69 4e 65 61 72 2c 20 65 4d 6f 64 65  Pg, iNear, eMode
1db70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1db80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1db90 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
1dba0 65 50 61 67 65 28 70 4c 61 73 74 50 67 29 3b 0a  ePage(pLastPg);.
1dbb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1dbc0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
1dbd0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1dbe0 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20  ge(pFreePg);.   
1dbf0 20 20 20 7d 77 68 69 6c 65 28 20 62 43 6f 6d 6d     }while( bComm
1dc00 69 74 20 26 26 20 69 46 72 65 65 50 67 3e 6e 46  it && iFreePg>nF
1dc10 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  in );.      asse
1dc20 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c 61 73  rt( iFreePg<iLas
1dc30 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a 20 20  tPg );.      .  
1dc40 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
1dc50 65 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74  ePage(pBt, pLast
1dc60 50 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  Pg, eType, iPtrP
1dc70 61 67 65 2c 20 69 46 72 65 65 50 67 2c 20 62 43  age, iFreePg, bC
1dc80 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20 20 72 65  ommit);.      re
1dc90 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
1dca0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
1dcb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1dcc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1dcd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1dce0 20 20 7d 0a 0a 20 20 69 66 28 20 62 43 6f 6d 6d    }..  if( bComm
1dcf0 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 64 6f 20  it==0 ){.    do 
1dd00 7b 0a 20 20 20 20 20 20 69 4c 61 73 74 50 67 2d  {.      iLastPg-
1dd10 2d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69  -;.    }while( i
1dd20 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
1dd30 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 7c  BYTE_PAGE(pBt) |
1dd40 7c 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  | PTRMAP_ISPAGE(
1dd50 70 42 74 2c 20 69 4c 61 73 74 50 67 29 20 29 3b  pBt, iLastPg) );
1dd60 0a 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72 75  .    pBt->bDoTru
1dd70 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 70  ncate = 1;.    p
1dd80 42 74 2d 3e 6e 50 61 67 65 20 3d 20 69 4c 61 73  Bt->nPage = iLas
1dd90 74 50 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  tPg;.  }.  retur
1dda0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ddb0 2f 2a 0a 2a 2a 20 54 68 65 20 64 61 74 61 62 61  /*.** The databa
1ddc0 73 65 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  se opened by the
1ddd0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1dde0 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
1ddf0 6d 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 6e 4f  m database.** nO
1de00 72 69 67 20 70 61 67 65 73 20 69 6e 20 73 69 7a  rig pages in siz
1de10 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 46 72  e containing nFr
1de20 65 65 20 66 72 65 65 20 70 61 67 65 73 2e 20 52  ee free pages. R
1de30 65 74 75 72 6e 20 74 68 65 20 65 78 70 65 63 74  eturn the expect
1de40 65 64 20 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 74  ed .** size of t
1de50 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20 70  he database in p
1de60 61 67 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 61  ages following a
1de70 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6f 70  n auto-vacuum op
1de80 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
1de90 69 63 20 50 67 6e 6f 20 66 69 6e 61 6c 44 62 53  ic Pgno finalDbS
1dea0 69 7a 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ize(BtShared *pB
1deb0 74 2c 20 50 67 6e 6f 20 6e 4f 72 69 67 2c 20 50  t, Pgno nOrig, P
1dec0 67 6e 6f 20 6e 46 72 65 65 29 7b 0a 20 20 69 6e  gno nFree){.  in
1ded0 74 20 6e 45 6e 74 72 79 3b 20 20 20 20 20 20 20  t nEntry;       
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1def0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
1df00 65 73 20 6f 6e 20 6f 6e 65 20 70 74 72 6d 61 70  es on one ptrmap
1df10 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   page */.  Pgno 
1df20 6e 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 20  nPtrmap;        
1df30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1df40 6d 62 65 72 20 6f 66 20 50 74 72 4d 61 70 20 70  mber of PtrMap p
1df50 61 67 65 73 20 74 6f 20 62 65 20 66 72 65 65 64  ages to be freed
1df60 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 69 6e 3b   */.  Pgno nFin;
1df70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df80 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1df90 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 6e 45 6e 74  value */..  nEnt
1dfa0 72 79 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65  ry = pBt->usable
1dfb0 53 69 7a 65 2f 35 3b 0a 20 20 6e 50 74 72 6d 61  Size/5;.  nPtrma
1dfc0 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
1dfd0 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
1dfe0 42 74 2c 20 6e 4f 72 69 67 29 2b 6e 45 6e 74 72  Bt, nOrig)+nEntr
1dff0 79 29 2f 6e 45 6e 74 72 79 3b 0a 20 20 6e 46 69  y)/nEntry;.  nFi
1e000 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65  n = nOrig - nFre
1e010 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 69  e - nPtrmap;.  i
1e020 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
1e030 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1e040 26 26 20 6e 46 69 6e 3c 50 45 4e 44 49 4e 47 5f  && nFin<PENDING_
1e050 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1e060 7b 0a 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20  {.    nFin--;.  
1e070 7d 0a 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41  }.  while( PTRMA
1e080 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46  P_ISPAGE(pBt, nF
1e090 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e  in) || nFin==PEN
1e0a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1e0b0 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69 6e 2d  Bt) ){.    nFin-
1e0c0 2d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  -;.  }..  return
1e0d0 20 6e 46 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nFin;.}../*.** 
1e0e0 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
1e0f0 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
1e100 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
1e110 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
1e120 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
1e130 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
1e140 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
1e150 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
1e160 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
1e170 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
1e180 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
1e190 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
1e1a0 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
1e1b0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
1e1c0 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
1e1d0 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
1e1e0 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
1e1f0 63 75 72 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54  curred,.** SQLIT
1e200 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1e210 2e 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53  . Otherwise an S
1e220 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
1e230 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  . .*/.int sqlite
1e240 33 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d  3BtreeIncrVacuum
1e250 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
1e260 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
1e270 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
1e280 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
1e290 6e 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72  nter(p);.  asser
1e2a0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1e2b0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1e2c0 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
1e2d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
1e2e0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
1e2f0 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
1e300 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
1e310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67  .  }else{.    Pg
1e320 6e 6f 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65  no nOrig = btree
1e330 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e340 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 20 3d      Pgno nFree =
1e350 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
1e360 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
1e370 5d 29 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69  ]);.    Pgno nFi
1e380 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69 7a 65 28  n = finalDbSize(
1e390 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e 46 72 65  pBt, nOrig, nFre
1e3a0 65 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 4f 72  e);..    if( nOr
1e3b0 69 67 3c 6e 46 69 6e 20 29 7b 0a 20 20 20 20 20  ig<nFin ){.     
1e3c0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1e3d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
1e3e0 65 6c 73 65 20 69 66 28 20 6e 46 72 65 65 3e 30  else if( nFree>0
1e3f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1e400 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
1e410 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
1e420 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  K ){.        inv
1e440 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
1e450 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
1e460 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
1e470 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
1e480 46 69 6e 2c 20 6e 4f 72 69 67 2c 20 30 29 3b 0a  Fin, nOrig, 0);.
1e490 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e4a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e4b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1e4c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e4d0 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1e4e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1e4f0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
1e500 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 32 38  pPage1->aData[28
1e510 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29 3b 0a  ], pBt->nPage);.
1e520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
1e530 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
1e540 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
1e550 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
1e560 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
1e570 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1e580 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e590 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
1e5a0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1e5b0 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
1e5c0 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
1e5d0 6f 6d 6d 69 74 74 65 64 20 66 6f 72 20 61 6e 20  ommitted for an 
1e5e0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
1e5f0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
1e600 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1e610 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
1e620 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
1e630 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1e640 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
1e650 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
1e660 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
1e670 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
1e680 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
1e690 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
1e6a0 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
1e6b0 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
1e6c0 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
1e6d0 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
1e6e0 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
1e6f0 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
1e700 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
1e710 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
1e720 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1e730 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1e740 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 56  pBt->pPager;.  V
1e750 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52 65  VA_ONLY( int nRe
1e760 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  f = sqlite3Pager
1e770 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
1e780 3b 20 29 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ; )..  assert( s
1e790 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1e7a0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
1e7b0 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
1e7c0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
1e7d0 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
1e7e0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
1e7f0 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
1e800 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
1e810 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1e820 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1e830 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20 61  es in database a
1e840 66 74 65 72 20 61 75 74 6f 76 61 63 75 75 6d 69  fter autovacuumi
1e850 6e 67 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ng */.    Pgno n
1e860 46 72 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  Free;        /* 
1e870 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
1e880 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
1e890 69 6e 69 74 69 61 6c 6c 79 20 2a 2f 0a 20 20 20  initially */.   
1e8a0 20 50 67 6e 6f 20 69 46 72 65 65 3b 20 20 20 20   Pgno iFree;    
1e8b0 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20      /* The next 
1e8c0 70 61 67 65 20 74 6f 20 62 65 20 66 72 65 65 64  page to be freed
1e8d0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72   */.    Pgno nOr
1e8e0 69 67 3b 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ig;        /* Da
1e8f0 74 61 62 61 73 65 20 73 69 7a 65 20 62 65 66 6f  tabase size befo
1e900 72 65 20 66 72 65 65 69 6e 67 20 2a 2f 0a 0a 20  re freeing */.. 
1e910 20 20 20 6e 4f 72 69 67 20 3d 20 62 74 72 65 65     nOrig = btree
1e920 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 3b 0a  Pagecount(pBt);.
1e930 20 20 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49      if( PTRMAP_I
1e940 53 50 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67  SPAGE(pBt, nOrig
1e950 29 20 7c 7c 20 6e 4f 72 69 67 3d 3d 50 45 4e 44  ) || nOrig==PEND
1e960 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1e970 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  t) ){.      /* I
1e980 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
1e990 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 64 61  e to create a da
1e9a0 74 61 62 61 73 65 20 66 6f 72 20 77 68 69 63 68  tabase for which
1e9b0 20 74 68 65 20 66 69 6e 61 6c 20 70 61 67 65 0a   the final page.
1e9c0 20 20 20 20 20 20 2a 2a 20 69 73 20 65 69 74 68        ** is eith
1e9d0 65 72 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  er a pointer-map
1e9e0 20 70 61 67 65 20 6f 72 20 74 68 65 20 70 65 6e   page or the pen
1e9f0 64 69 6e 67 2d 62 79 74 65 20 70 61 67 65 2e 20  ding-byte page. 
1ea00 49 66 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  If one.      ** 
1ea10 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
1ea20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 63  this indicates c
1ea30 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1ea40 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1ea50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1ea60 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
1ea70 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
1ea80 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  e(&pBt->pPage1->
1ea90 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20  aData[36]);.    
1eaa0 6e 46 69 6e 20 3d 20 66 69 6e 61 6c 44 62 53 69  nFin = finalDbSi
1eab0 7a 65 28 70 42 74 2c 20 6e 4f 72 69 67 2c 20 6e  ze(pBt, nOrig, n
1eac0 46 72 65 65 29 3b 0a 20 20 20 20 69 66 28 20 6e  Free);.    if( n
1ead0 46 69 6e 3e 6e 4f 72 69 67 20 29 20 72 65 74 75  Fin>nOrig ) retu
1eae0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1eaf0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 69 66 28 20  T_BKPT;.    if( 
1eb00 6e 46 69 6e 3c 6e 4f 72 69 67 20 29 7b 0a 20 20  nFin<nOrig ){.  
1eb10 20 20 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c      rc = saveAll
1eb20 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
1eb30 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  0);.    }.    fo
1eb40 72 28 69 46 72 65 65 3d 6e 4f 72 69 67 3b 20 69  r(iFree=nOrig; i
1eb50 46 72 65 65 3e 6e 46 69 6e 20 26 26 20 72 63 3d  Free>nFin && rc=
1eb60 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 46 72 65  =SQLITE_OK; iFre
1eb70 65 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  e--){.      rc =
1eb80 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
1eb90 70 42 74 2c 20 6e 46 69 6e 2c 20 69 46 72 65 65  pBt, nFin, iFree
1eba0 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 1);.    }.    
1ebb0 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  if( (rc==SQLITE_
1ebc0 44 4f 4e 45 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  DONE || rc==SQLI
1ebd0 54 45 5f 4f 4b 29 20 26 26 20 6e 46 72 65 65 3e  TE_OK) && nFree>
1ebe0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1ebf0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1ec00 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
1ec10 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 70  DbPage);.      p
1ec20 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
1ec30 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1ec40 20 30 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62   0);.      put4b
1ec50 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
1ec60 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b  ->aData[36], 0);
1ec70 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1ec80 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
1ec90 61 74 61 5b 32 38 5d 2c 20 6e 46 69 6e 29 3b 0a  ata[28], nFin);.
1eca0 20 20 20 20 20 20 70 42 74 2d 3e 62 44 6f 54 72        pBt->bDoTr
1ecb0 75 6e 63 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  uncate = 1;.    
1ecc0 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 6e    pBt->nPage = n
1ecd0 46 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  Fin;.    }.    i
1ece0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ecf0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ed00 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
1ed10 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1ed20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  }..  assert( nRe
1ed30 66 3e 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f>=sqlite3PagerR
1ed40 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
1ed50 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1ed60 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 6e 64  }..#else /* ifnd
1ed70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1ed80 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 23 20 64  UTOVACUUM */.# d
1ed90 65 66 69 6e 65 20 73 65 74 43 68 69 6c 64 50 74  efine setChildPt
1eda0 72 6d 61 70 73 28 78 29 20 53 51 4c 49 54 45 5f  rmaps(x) SQLITE_
1edb0 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
1edc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
1edd0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
1ede0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
1edf0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
1ee00 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
1ee10 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
1ee20 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
1ee30 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
1ee40 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
1ee50 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
1ee60 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
1ee70 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
1ee80 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
1ee90 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
1eea0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
1eeb0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
1eec0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
1eed0 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
1eee0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
1eef0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
1ef00 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
1ef10 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
1ef20 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
1ef30 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
1ef40 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
1ef50 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
1ef60 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
1ef70 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
1ef80 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
1ef90 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
1efa0 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
1efb0 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
1efc0 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
1efd0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1efe0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
1eff0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
1f000 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
1f010 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
1f020 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
1f030 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
1f040 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
1f050 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
1f060 69 74 50 68 61 73 65 54 77 6f 28 29 20 66 6f 72  itPhaseTwo() for
1f070 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
1f080 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d 6d  e of the.** comm
1f090 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  it process..**.*
1f0a0 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * This call is a
1f0b0 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72 69   no-op if no wri
1f0c0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
1f0d0 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  s currently acti
1f0e0 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a 2a  ve on pBt..**.**
1f0f0 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e 63   Otherwise, sync
1f100 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f110 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65 65  le for the btree
1f120 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70 6f   pBt. zMaster po
1f130 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  ints to.** the n
1f140 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
1f150 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1f160 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1f170 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20  ten into the.** 
1f180 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e  individual journ
1f190 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20 4e  al file, or is N
1f1a0 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ULL, indicating 
1f1b0 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
1f1c0 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e 67  l file .** (sing
1f1d0 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
1f1e0 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20  saction)..**.** 
1f1f0 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
1f200 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72 20  led, the master 
1f210 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20 61  journal should a
1f220 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
1f230 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f 70  .** created, pop
1f240 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ulated with this
1f250 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
1f260 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20 64   and synced to d
1f270 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  isk..**.** Once 
1f280 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65 20  this is routine 
1f290 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68  has returned, th
1f2a0 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65 71  e only thing req
1f2b0 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74 0a  uired to commit.
1f2c0 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72 61  ** the write-tra
1f2d0 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68 69  nsaction for thi
1f2e0 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  s database file 
1f2f0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
1f300 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e 74   journal..*/.int
1f310 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1f320 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72 65  mitPhaseOne(Btre
1f330 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
1f340 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
1f350 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1f360 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
1f370 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
1f380 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64 20  ){.    BtShared 
1f390 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f3a0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
1f3b0 6e 74 65 72 28 70 29 3b 0a 23 69 66 6e 64 65 66  nter(p);.#ifndef
1f3c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1f3d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1f3e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f3f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75  ){.      rc = au
1f400 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70  toVacuumCommit(p
1f410 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Bt);.      if( r
1f420 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f430 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
1f440 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
1f450 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1f470 20 20 20 69 66 28 20 70 42 74 2d 3e 62 44 6f 54     if( pBt->bDoT
1f480 72 75 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20  runcate ){.     
1f490 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1f4a0 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74 2d 3e  ncateImage(pBt->
1f4b0 70 50 61 67 65 72 2c 20 70 42 74 2d 3e 6e 50 61  pPager, pBt->nPa
1f4c0 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ge);.    }.#endi
1f4d0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
1f4e0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f4f0 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
1f500 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  r, zMaster, 0);.
1f510 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1f520 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20  Leave(p);.  }.  
1f530 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f540 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1f550 6e 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d  n is called from
1f560 20 62 6f 74 68 20 42 74 72 65 65 43 6f 6d 6d 69   both BtreeCommi
1f570 74 50 68 61 73 65 54 77 6f 28 29 20 61 6e 64 20  tPhaseTwo() and 
1f580 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29 0a  BtreeRollback().
1f590 2a 2a 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ** at the conclu
1f5a0 73 69 6f 6e 20 6f 66 20 61 20 74 72 61 6e 73 61  sion of a transa
1f5b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1f5c0 20 76 6f 69 64 20 62 74 72 65 65 45 6e 64 54 72   void btreeEndTr
1f5d0 61 6e 73 61 63 74 69 6f 6e 28 42 74 72 65 65 20  ansaction(Btree 
1f5e0 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1f5f0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1f600 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
1f610 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
1f620 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
1f630 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 0a 23 69  sMutex(p) );..#i
1f640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f650 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 70  T_AUTOVACUUM.  p
1f660 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20  Bt->bDoTruncate 
1f670 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 0;.#endif.  if
1f680 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 54 52 41  ( p->inTrans>TRA
1f690 4e 53 5f 4e 4f 4e 45 20 26 26 20 64 62 2d 3e 6e  NS_NONE && db->n
1f6a0 56 64 62 65 52 65 61 64 3e 31 20 29 7b 0a 20 20  VdbeRead>1 ){.  
1f6b0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1f6c0 65 20 6f 74 68 65 72 20 61 63 74 69 76 65 20 73  e other active s
1f6d0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 62  tatements that b
1f6e0 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64 61  elong to this da
1f6f0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 68 61  tabase.    ** ha
1f700 6e 64 6c 65 2c 20 64 6f 77 6e 67 72 61 64 65 20  ndle, downgrade 
1f710 74 6f 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  to a read-only t
1f720 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
1f730 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
1f740 0a 20 20 20 20 2a 2a 20 6d 61 79 20 73 74 69 6c  .    ** may stil
1f750 6c 20 62 65 20 72 65 61 64 69 6e 67 20 66 72 6f  l be reading fro
1f760 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
1f770 20 2a 2f 0a 20 20 20 20 64 6f 77 6e 67 72 61 64   */.    downgrad
1f780 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  eAllSharedCacheT
1f790 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 20 20  ableLocks(p);.  
1f7a0 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1f7b0 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 65 6c  RANS_READ;.  }el
1f7c0 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  se{.    /* If th
1f7d0 65 20 68 61 6e 64 6c 65 20 68 61 64 20 61 6e 79  e handle had any
1f7e0 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
1f7f0 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
1f800 6d 65 6e 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  ment the .    **
1f810 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1f820 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  nt of the shared
1f830 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20 74   btree. If the t
1f840 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1f850 20 0a 20 20 20 20 2a 2a 20 72 65 61 63 68 65 73   .    ** reaches
1f860 20 30 2c 20 73 65 74 20 74 68 65 20 73 68 61 72   0, set the shar
1f870 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
1f880 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f  S_NONE. The unlo
1f890 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
1f8a0 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 65  ).    ** call be
1f8b0 6c 6f 77 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20  low will unlock 
1f8c0 74 68 65 20 70 61 67 65 72 2e 20 20 2a 2f 0a 20  the pager.  */. 
1f8d0 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
1f8e0 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
1f8f0 0a 20 20 20 20 20 20 63 6c 65 61 72 41 6c 6c 53  .      clearAllS
1f900 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
1f910 6f 63 6b 73 28 70 29 3b 0a 20 20 20 20 20 20 70  ocks(p);.      p
1f920 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e  Bt->nTransaction
1f930 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d  --;.      if( 0=
1f940 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
1f950 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  on ){.        pB
1f960 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1f970 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
1f980 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f990 20 20 2f 2a 20 53 65 74 20 74 68 65 20 63 75 72    /* Set the cur
1f9a0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1f9b0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
1f9c0 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  NONE and unlock 
1f9d0 74 68 65 20 0a 20 20 20 20 2a 2a 20 70 61 67 65  the .    ** page
1f9e0 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
1f9f0 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
1fa00 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
1fa10 6e 73 61 63 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  nsaction.  */.  
1fa20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
1fa30 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 75  RANS_NONE;.    u
1fa40 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
1fa50 65 64 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20  ed(pBt);.  }..  
1fa60 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
1fa70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
1fa80 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1fa90 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
1faa0 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
1fab0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
1fac0 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
1fad0 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
1fae0 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
1faf0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
1fb00 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
1fb10 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
1fb20 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
1fb30 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  and should.** be
1fb40 20 69 6e 76 6f 6b 65 64 20 70 72 69 6f 72 20 74   invoked prior t
1fb50 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
1fb60 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
1fb70 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1fb80 68 61 73 65 4f 6e 65 28 29 0a 2a 2a 20 72 6f 75  haseOne().** rou
1fb90 74 69 6e 65 20 64 69 64 20 61 6c 6c 20 74 68 65  tine did all the
1fba0 20 77 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67   work of writing
1fbb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74   information out
1fbc0 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75   to disk and flu
1fbd0 73 68 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e  shing the.** con
1fbe0 74 65 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68  tents so that th
1fbf0 65 79 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f  ey are written o
1fc00 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61  nto the disk pla
1fc10 74 74 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a  tter.  All this.
1fc20 2a 2a 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74  ** routine has t
1fc30 6f 20 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f  o do is delete o
1fc40 72 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a 65  r truncate or ze
1fc50 72 6f 20 74 68 65 20 68 65 61 64 65 72 20 69 6e  ro the header in
1fc60 20 74 68 65 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c   the.** the roll
1fc70 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 28 77 68  back journal (wh
1fc80 69 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74  ich causes the t
1fc90 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f  ransaction to co
1fca0 6d 6d 69 74 29 20 61 6e 64 0a 2a 2a 20 64 72 6f  mmit) and.** dro
1fcb0 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4e  p locks..**.** N
1fcc0 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  ormally, if an e
1fcd0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1fce0 65 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  e the pager laye
1fcf0 72 20 69 73 20 61 74 74 65 6d 70 74 69 6e 67 20  r is attempting 
1fd00 74 6f 20 0a 2a 2a 20 66 69 6e 61 6c 69 7a 65 20  to .** finalize 
1fd10 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6a  the underlying j
1fd20 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 69  ournal file, thi
1fd30 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1fd40 6e 73 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 0a  ns an error and.
1fd50 2a 2a 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  ** the upper lay
1fd60 65 72 20 77 69 6c 6c 20 61 74 74 65 6d 70 74 20  er will attempt 
1fd70 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 48 6f 77 65  a rollback. Howe
1fd80 76 65 72 2c 20 69 66 20 74 68 65 20 73 65 63 6f  ver, if the seco
1fd90 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
1fda0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 74 68 65 6e 20  s non-zero then 
1fdb0 74 68 69 73 20 62 2d 74 72 65 65 20 74 72 61 6e  this b-tree tran
1fdc0 73 61 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  saction is part 
1fdd0 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20  of a multi-file 
1fde0 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  .** transaction.
1fdf0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
1fe00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  he transaction h
1fe10 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fe20 63 6f 6d 6d 69 74 74 65 64 20 0a 2a 2a 20 28 62  committed .** (b
1fe30 79 20 64 65 6c 65 74 69 6e 67 20 61 20 6d 61 73  y deleting a mas
1fe40 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fe50 29 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 65 72  ) and the caller
1fe60 20 77 69 6c 6c 20 69 67 6e 6f 72 65 20 74 68 69   will ignore thi
1fe70 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20  s .** functions 
1fe80 72 65 74 75 72 6e 20 63 6f 64 65 2e 20 53 6f 2c  return code. So,
1fe90 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72 6f   even if an erro
1fea0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
1feb0 70 61 67 65 72 20 6c 61 79 65 72 2c 0a 2a 2a 20  pager layer,.** 
1fec0 72 65 73 65 74 20 74 68 65 20 62 2d 74 72 65 65  reset the b-tree
1fed0 20 6f 62 6a 65 63 74 73 20 69 6e 74 65 72 6e 61   objects interna
1fee0 6c 20 73 74 61 74 65 20 74 6f 20 69 6e 64 69 63  l state to indic
1fef0 61 74 65 20 74 68 61 74 20 74 68 65 20 77 72 69  ate that the wri
1ff00 74 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  te.** transactio
1ff10 6e 20 68 61 73 20 62 65 65 6e 20 63 6c 6f 73 65  n has been close
1ff20 64 2e 20 54 68 69 73 20 69 73 20 71 75 69 74 65  d. This is quite
1ff30 20 73 61 66 65 2c 20 61 73 20 74 68 65 20 70 61   safe, as the pa
1ff40 67 65 72 20 77 69 6c 6c 20 68 61 76 65 0a 2a 2a  ger will have.**
1ff50 20 74 72 61 6e 73 69 74 69 6f 6e 65 64 20 74 6f   transitioned to
1ff60 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
1ff70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
1ff80 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
1ff90 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
1ffa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
1ffb0 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
1ffc0 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
1ffd0 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
1ffe0 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
1fff0 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
20000 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
20010 65 54 77 6f 28 42 74 72 65 65 20 2a 70 2c 20 69  eTwo(Btree *p, i
20020 6e 74 20 62 43 6c 65 61 6e 75 70 29 7b 0a 0a 20  nt bCleanup){.. 
20030 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
20040 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 20 72 65  =TRANS_NONE ) re
20050 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20060 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
20070 74 65 72 28 70 29 3b 0a 20 20 62 74 72 65 65 49  ter(p);.  btreeI
20080 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
20090 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
200a0 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72 61   has a write-tra
200b0 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63  nsaction open, c
200c0 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65 64  ommit the shared
200d0 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72  -btrees .  ** tr
200e0 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65  ansaction and se
200f0 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  t the shared sta
20100 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44  te to TRANS_READ
20110 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
20120 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
20130 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20  RITE ){.    int 
20140 72 63 3b 0a 20 20 20 20 42 74 53 68 61 72 65 64  rc;.    BtShared
20150 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
20160 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
20170 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
20180 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
20190 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
201a0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
201b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
201c0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
201d0 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67 65  seTwo(pBt->pPage
201e0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
201f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 43 6c  SQLITE_OK && bCl
20200 65 61 6e 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20  eanup==0 ){.    
20210 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
20220 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
20230 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
20240 20 20 20 70 2d 3e 69 44 61 74 61 56 65 72 73 69     p->iDataVersi
20250 6f 6e 2d 2d 3b 20 20 2f 2a 20 43 6f 6d 70 65 6e  on--;  /* Compen
20260 73 61 74 65 20 66 6f 72 20 70 50 61 67 65 72 2d  sate for pPager-
20270 3e 69 44 61 74 61 56 65 72 73 69 6f 6e 2b 2b 3b  >iDataVersion++;
20280 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54   */.    pBt->inT
20290 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
202a0 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 62 74 72  NS_READ;.    btr
202b0 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e  eeClearHasConten
202c0 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 20 20 62  t(pBt);.  }..  b
202d0 74 72 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69  treeEndTransacti
202e0 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  on(p);.  sqlite3
202f0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20310 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62  K;.}../*.** Do b
20320 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61 20  oth phases of a 
20330 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73  commit..*/.int s
20340 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20350 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
20360 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
20370 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
20380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20390 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
203a0 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  (p, 0);.  if( rc
203b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
203c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
203d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
203e0 77 6f 28 70 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  wo(p, 0);.  }.  
203f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20400 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
20410 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
20420 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
20430 65 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f  e state to CURSO
20440 52 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20  R_FAULT and the 
20450 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  error.** code to
20460 20 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65   errCode for eve
20470 72 79 20 63 75 72 73 6f 72 20 6f 6e 20 61 6e 79  ry cursor on any
20480 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70   BtShared that p
20490 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e  Btree.** referen
204a0 63 65 73 2e 20 20 4f 72 20 69 66 20 74 68 65 20  ces.  Or if the 
204b0 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20 69  writeOnly flag i
204c0 73 20 73 65 74 20 74 6f 20 31 2c 20 74 68 65 6e  s set to 1, then
204d0 20 6f 6e 6c 79 0a 2a 2a 20 74 72 69 70 20 77 72   only.** trip wr
204e0 69 74 65 20 63 75 72 73 6f 72 73 20 61 6e 64 20  ite cursors and 
204f0 6c 65 61 76 65 20 72 65 61 64 20 63 75 72 73 6f  leave read curso
20500 72 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  rs unchanged..**
20510 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72  .** Every cursor
20520 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
20530 74 6f 20 62 65 20 74 72 69 70 70 65 64 2c 20 69  to be tripped, i
20540 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
20550 0a 2a 2a 20 74 68 61 74 20 62 65 6c 6f 6e 67 20  .** that belong 
20560 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
20570 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
20580 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 0a  at happen to be.
20590 2a 2a 20 73 68 61 72 69 6e 67 20 74 68 65 20 63  ** sharing the c
205a0 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
205b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
205c0 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
205d0 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
205e0 20 6f 63 63 75 72 73 2e 20 49 66 20 74 68 65 20   occurs. If the 
205f0 77 72 69 74 65 4f 6e 6c 79 0a 2a 2a 20 66 6c 61  writeOnly.** fla
20600 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
20610 6f 6e 6c 79 20 77 72 69 74 65 2d 63 75 72 73 6f  only write-curso
20620 72 73 20 6e 65 65 64 20 62 65 20 74 72 69 70 70  rs need be tripp
20630 65 64 20 2d 20 72 65 61 64 2d 6f 6e 6c 79 0a 2a  ed - read-only.*
20640 2a 20 63 75 72 73 6f 72 73 20 73 61 76 65 20 74  * cursors save t
20650 68 65 69 72 20 63 75 72 72 65 6e 74 20 70 6f 73  heir current pos
20660 69 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 20 74  itions so that t
20670 68 65 79 20 6d 61 79 20 63 6f 6e 74 69 6e 75 65  hey may continue
20680 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   .** following t
20690 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 4f 72 2c  he rollback. Or,
206a0 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73   if writeOnly is
206b0 20 66 61 6c 73 65 2c 20 61 6c 6c 20 63 75 72 73   false, all curs
206c0 6f 72 73 20 61 72 65 20 0a 2a 2a 20 74 72 69 70  ors are .** trip
206d0 70 65 64 2e 20 49 6e 20 67 65 6e 65 72 61 6c 2c  ped. In general,
206e0 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61   writeOnly is fa
206f0 6c 73 65 20 69 66 20 74 68 65 20 74 72 61 6e 73  lse if the trans
20700 61 63 74 69 6f 6e 20 62 65 69 6e 67 0a 2a 2a 20  action being.** 
20710 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6d 6f 64 69  rolled back modi
20720 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61 73  fied the databas
20730 65 20 73 63 68 65 6d 61 2e 20 49 6e 20 74 68 69  e schema. In thi
20740 73 20 63 61 73 65 20 62 2d 74 72 65 65 20 72 6f  s case b-tree ro
20750 6f 74 0a 2a 2a 20 70 61 67 65 73 20 6d 61 79 20  ot.** pages may 
20760 62 65 20 6d 6f 76 65 64 20 6f 72 20 64 65 6c 65  be moved or dele
20770 74 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ted from the dat
20780 61 62 61 73 65 20 61 6c 74 6f 67 65 74 68 65 72  abase altogether
20790 2c 20 6d 61 6b 69 6e 67 0a 2a 2a 20 69 74 20 75  , making.** it u
207a0 6e 73 61 66 65 20 66 6f 72 20 72 65 61 64 20 63  nsafe for read c
207b0 75 72 73 6f 72 73 20 74 6f 20 63 6f 6e 74 69 6e  ursors to contin
207c0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
207d0 20 77 72 69 74 65 4f 6e 6c 79 20 66 6c 61 67 20   writeOnly flag 
207e0 69 73 20 74 72 75 65 20 61 6e 64 20 61 6e 20 65  is true and an e
207f0 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
20800 72 65 64 20 77 68 69 6c 65 20 0a 2a 2a 20 73 61  red while .** sa
20810 76 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ving the current
20820 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 61 20 72   position of a r
20830 65 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 2c  ead-only cursor,
20840 20 61 6c 6c 20 63 75 72 73 6f 72 73 2c 20 0a 2a   all cursors, .*
20850 2a 20 69 6e 63 6c 75 64 69 6e 67 20 61 6c 6c 20  * including all 
20860 72 65 61 64 2d 63 75 72 73 6f 72 73 20 61 72 65  read-cursors are
20870 20 74 72 69 70 70 65 64 2e 0a 2a 2a 0a 2a 2a 20   tripped..**.** 
20880 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
20890 75 72 6e 65 64 20 69 66 20 73 75 63 63 65 73 73  urned if success
208a0 66 75 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72  ful, or if an er
208b0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
208c0 0a 2a 2a 20 73 61 76 69 6e 67 20 61 20 63 75 72  .** saving a cur
208d0 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2c 20 61 6e  sor position, an
208e0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
208f0 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
20900 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75  e3BtreeTripAllCu
20910 72 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74  rsors(Btree *pBt
20920 72 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65  ree, int errCode
20930 2c 20 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29  , int writeOnly)
20940 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
20950 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
20960 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
20970 28 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20  ( (writeOnly==0 
20980 7c 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 29  || writeOnly==1)
20990 20 26 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c   && BTCF_WriteFl
209a0 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ag==1 );.  if( p
209b0 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
209c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
209d0 42 74 72 65 65 29 3b 0a 20 20 20 20 66 6f 72 28  Btree);.    for(
209e0 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
209f0 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
20a00 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 6e  pNext){.      in
20a10 74 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 77  t i;.      if( w
20a20 72 69 74 65 4f 6e 6c 79 20 26 26 20 28 70 2d 3e  riteOnly && (p->
20a30 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f  curFlags & BTCF_
20a40 57 72 69 74 65 46 6c 61 67 29 3d 3d 30 20 29 7b  WriteFlag)==0 ){
20a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
20a60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
20a70 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61 74  ALID || p->eStat
20a80 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45  e==CURSOR_SKIPNE
20a90 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
20aa0 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f 72 50  rc = saveCursorP
20ab0 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
20ac0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
20ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20ae0 20 20 20 20 20 20 20 28 76 6f 69 64 29 73 71 6c         (void)sql
20af0 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c  ite3BtreeTripAll
20b00 43 75 72 73 6f 72 73 28 70 42 74 72 65 65 2c 20  Cursors(pBtree, 
20b10 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  rc, 0);.        
20b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
20b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20b40 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
20b60 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 29  eeClearCursor(p)
20b70 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 53 74  ;.        p->eSt
20b80 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46 41 55  ate = CURSOR_FAU
20b90 4c 54 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  LT;.        p->s
20ba0 6b 69 70 4e 65 78 74 20 3d 20 65 72 72 43 6f 64  kipNext = errCod
20bb0 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
20bc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 2d 3e   for(i=0; i<=p->
20bd0 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  iPage; i++){.   
20be0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
20bf0 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  (p->apPage[i]);.
20c00 20 20 20 20 20 20 20 20 70 2d 3e 61 70 50 61 67          p->apPag
20c10 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[i] = 0;.      
20c20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
20c30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
20c40 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  tree);.  }.  ret
20c50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20c60 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
20c70 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
20c80 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  gress..**.** If 
20c90 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20  tripCode is not 
20ca0 53 51 4c 49 54 45 5f 4f 4b 20 74 68 65 6e 20 63  SQLITE_OK then c
20cb0 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
20cc0 6e 76 61 6c 69 64 61 74 65 64 20 28 74 72 69 70  nvalidated (trip
20cd0 70 65 64 29 2e 0a 2a 2a 20 4f 6e 6c 79 20 77 72  ped)..** Only wr
20ce0 69 74 65 20 63 75 72 73 6f 72 73 20 61 72 65 20  ite cursors are 
20cf0 74 72 69 70 70 65 64 20 69 66 20 77 72 69 74 65  tripped if write
20d00 4f 6e 6c 79 20 69 73 20 74 72 75 65 20 62 75 74  Only is true but
20d10 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65   all cursors are
20d20 0a 2a 2a 20 74 72 69 70 70 65 64 20 69 66 20 77  .** tripped if w
20d30 72 69 74 65 4f 6e 6c 79 20 69 73 20 66 61 6c 73  riteOnly is fals
20d40 65 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20  e.  Any attempt 
20d50 74 6f 20 75 73 65 0a 2a 2a 20 61 20 74 72 69 70  to use.** a trip
20d60 70 65 64 20 63 75 72 73 6f 72 20 77 69 6c 6c 20  ped cursor will 
20d70 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
20d80 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  or..**.** This w
20d90 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20  ill release the 
20da0 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  write lock on th
20db0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
20dc0 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72    If there.** ar
20dd0 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73  e no active curs
20de0 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c  ors, it also rel
20df0 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c  eases the read l
20e00 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ock..*/.int sqli
20e10 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
20e20 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 74  (Btree *p, int t
20e30 72 69 70 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  ripCode, int wri
20e40 74 65 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72  teOnly){.  int r
20e50 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
20e60 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d  Bt = p->pBt;.  M
20e70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
20e80 0a 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65  .  assert( write
20e90 4f 6e 6c 79 3d 3d 31 20 7c 7c 20 77 72 69 74 65  Only==1 || write
20ea0 4f 6e 6c 79 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Only==0 );.  ass
20eb0 65 72 74 28 20 74 72 69 70 43 6f 64 65 3d 3d 53  ert( tripCode==S
20ec0 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
20ed0 42 41 43 4b 20 7c 7c 20 74 72 69 70 43 6f 64 65  BACK || tripCode
20ee0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
20ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
20f00 65 72 28 70 29 3b 0a 20 20 69 66 28 20 74 72 69  er(p);.  if( tri
20f10 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  pCode==SQLITE_OK
20f20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 74 72 69   ){.    rc = tri
20f30 70 43 6f 64 65 20 3d 20 73 61 76 65 41 6c 6c 43  pCode = saveAllC
20f40 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
20f50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
20f60 77 72 69 74 65 4f 6e 6c 79 20 3d 20 30 3b 0a 20  writeOnly = 0;. 
20f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
20f80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
20f90 20 20 69 66 28 20 74 72 69 70 43 6f 64 65 20 29    if( tripCode )
20fa0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20  {.    int rc2 = 
20fb0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
20fc0 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 74 72  AllCursors(p, tr
20fd0 69 70 43 6f 64 65 2c 20 77 72 69 74 65 4f 6e 6c  ipCode, writeOnl
20fe0 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  y);.    assert( 
20ff0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
21000 20 28 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 26   (writeOnly==0 &
21010 26 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  & rc2==SQLITE_OK
21020 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32  ) );.    if( rc2
21030 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  !=SQLITE_OK ) rc
21040 20 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 62 74   = rc2;.  }.  bt
21050 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
21060 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
21070 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
21080 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
21090 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 52 41  .    assert( TRA
210a0 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69  NS_WRITE==pBt->i
210b0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a  nTransaction );.
210c0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
210d0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
210e0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
210f0 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45   if( rc2!=SQLITE
21100 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
21110 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20  = rc2;.    }..  
21120 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63    /* The rollbac
21130 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73 74 72  k may have destr
21140 6f 79 65 64 20 74 68 65 20 70 50 61 67 65 31 2d  oyed the pPage1-
21150 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53  >aData value.  S
21160 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 62 74  o.    ** call bt
21170 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
21180 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
21190 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
211a0 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
211b0 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
211c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 74 72 65   */.    if( btre
211d0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
211e0 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
211f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21200 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 67 65 74   int nPage = get
21210 34 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50  4byte(28+(u8*)pP
21220 61 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20  age1->aData);.  
21230 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 50      testcase( nP
21240 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
21250 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 20 73  if( nPage==0 ) s
21260 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
21270 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
21280 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20 20  , &nPage);.     
21290 20 74 65 73 74 63 61 73 65 28 20 70 42 74 2d 3e   testcase( pBt->
212a0 6e 50 61 67 65 21 3d 6e 50 61 67 65 20 29 3b 0a  nPage!=nPage );.
212b0 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65        pBt->nPage
212c0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
212d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
212e0 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  e1);.    }.    a
212f0 73 73 65 72 74 28 20 63 6f 75 6e 74 56 61 6c 69  ssert( countVali
21300 64 43 75 72 73 6f 72 73 28 70 42 74 2c 20 31 29  dCursors(pBt, 1)
21310 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ==0 );.    pBt->
21320 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
21330 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20  TRANS_READ;.    
21340 62 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e  btreeClearHasCon
21350 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 7d 0a 0a  tent(pBt);.  }..
21360 20 20 62 74 72 65 65 45 6e 64 54 72 61 6e 73 61    btreeEndTransa
21370 63 74 69 6f 6e 28 70 29 3b 0a 20 20 73 71 6c 69  ction(p);.  sqli
21380 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
21390 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
213a0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
213b0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
213c0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75  nsaction. The su
213d0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
213e0 20 62 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   be rolled.** ba
213f0 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79  ck independently
21400 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61   of the main tra
21410 6e 73 61 63 74 69 6f 6e 2e 20 59 6f 75 20 6d 75  nsaction. You mu
21420 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
21430 61 63 74 69 6f 6e 20 0a 2a 2a 20 62 65 66 6f 72  action .** befor
21440 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62  e starting a sub
21450 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
21460 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
21470 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61 74  is ended automat
21480 69 63 61 6c 6c 79 20 0a 2a 2a 20 69 66 20 74 68  ically .** if th
21490 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
214a0 6f 6e 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  on commits or ro
214b0 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
214c0 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
214d0 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
214e0 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
214f0 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
21500 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
21510 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
21520 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
21530 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
21540 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
21550 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
21560 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
21570 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
21580 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
21590 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
215a0 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
215b0 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
215c0 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
215d0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
215e0 41 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 2d  A statement sub-
215f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 69  transaction is i
21600 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 6e  mplemented as an
21610 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
21620 6f 69 6e 74 2e 20 54 68 65 0a 2a 2a 20 76 61 6c  oint. The.** val
21630 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
21640 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
21650 72 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  r is the total n
21660 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
21670 6e 74 73 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e  nts,.** includin
21680 67 20 74 68 65 20 6e 65 77 20 61 6e 6f 6e 79 6d  g the new anonym
21690 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2c 20 6f  ous savepoint, o
216a0 70 65 6e 20 6f 6e 20 74 68 65 20 42 2d 54 72 65  pen on the B-Tre
216b0 65 2e 20 69 2e 65 2e 20 69 66 20 74 68 65 72 65  e. i.e. if there
216c0 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
216d0 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e 64  e savepoints and
216e0 20 6e 6f 20 6f 74 68 65 72 20 73 74 61 74 65 6d   no other statem
216f0 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ent-transactions
21700 20 6f 70 65 6e 2c 0a 2a 2a 20 69 53 74 61 74 65   open,.** iState
21710 6d 65 6e 74 20 69 73 20 31 2e 20 54 68 69 73 20  ment is 1. This 
21720 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70 6f  anonymous savepo
21730 69 6e 74 20 63 61 6e 20 62 65 20 72 65 6c 65 61  int can be relea
21740 73 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  sed or rolled ba
21750 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  ck.** using the 
21760 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21770 70 6f 69 6e 74 28 29 20 66 75 6e 63 74 69 6f 6e  point() function
21780 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21790 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
217a0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 53 74  tree *p, int iSt
217b0 61 74 65 6d 65 6e 74 29 7b 0a 20 20 69 6e 74 20  atement){.  int 
217c0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
217d0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
217e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
217f0 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r(p);.  assert( 
21800 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
21810 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
21820 65 72 74 28 20 28 70 42 74 2d 3e 62 74 73 46 6c  ert( (pBt->btsFl
21830 61 67 73 20 26 20 42 54 53 5f 52 45 41 44 5f 4f  ags & BTS_READ_O
21840 4e 4c 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  NLY)==0 );.  ass
21850 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74 3e  ert( iStatement>
21860 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
21870 53 74 61 74 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d  Statement>p->db-
21880 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20  >nSavepoint );. 
21890 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
218a0 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
218b0 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 2f 2a  NS_WRITE );.  /*
218c0 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
218d0 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
218e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
218f0 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
21900 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67  .  ** an index g
21910 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20  reater than all 
21920 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74  savepoints creat
21930 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73  ed explicitly us
21940 69 6e 67 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  ing.  ** SQL sta
21950 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
21960 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
21970 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
21980 61 63 6b 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63  ack any.  ** suc
21990 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77 68 69  h savepoints whi
219a0 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  le the statement
219b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 61 76   transaction sav
219c0 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
219d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
219e0 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61  lite3PagerOpenSa
219f0 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61  vepoint(pBt->pPa
21a00 67 65 72 2c 20 69 53 74 61 74 65 6d 65 6e 74 29  ger, iStatement)
21a10 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
21a20 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
21a30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21a40 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
21a50 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
21a60 74 69 6f 6e 2c 20 6f 70 2c 20 69 73 20 61 6c 77  tion, op, is alw
21a70 61 79 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  ays SAVEPOINT_RO
21a80 4c 4c 42 41 43 4b 0a 2a 2a 20 6f 72 20 53 41 56  LLBACK.** or SAV
21a90 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
21aa0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 65 69  This function ei
21ab0 74 68 65 72 20 72 65 6c 65 61 73 65 73 20 6f 72  ther releases or
21ac0 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 0a   rolls back the.
21ad0 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 69 64 65  ** savepoint ide
21ae0 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
21af0 65 74 65 72 20 69 53 61 76 65 70 6f 69 6e 74 2c  eter iSavepoint,
21b00 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68   depending on th
21b10 65 20 76 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 6f  e value .** of o
21b20 70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c  p..**.** Normall
21b30 79 2c 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  y, iSavepoint is
21b40 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
21b50 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2e 20   equal to zero. 
21b60 48 6f 77 65 76 65 72 2c 20 69 66 20 6f 70 20 69  However, if op i
21b70 73 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52  s.** SAVEPOINT_R
21b80 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 69 53  OLLBACK, then iS
21b90 61 76 65 70 6f 69 6e 74 20 6d 61 79 20 61 6c 73  avepoint may als
21ba0 6f 20 62 65 20 2d 31 2e 20 49 6e 20 74 68 69 73  o be -1. In this
21bb0 20 63 61 73 65 20 74 68 65 20 0a 2a 2a 20 63 6f   case the .** co
21bc0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 65 6e  ntents of the en
21bd0 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
21be0 20 61 72 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b   are rolled back
21bf0 2e 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  . This is differ
21c00 65 6e 74 0a 2a 2a 20 66 72 6f 6d 20 61 20 6e 6f  ent.** from a no
21c10 72 6d 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e  rmal transaction
21c20 20 72 6f 6c 6c 62 61 63 6b 2c 20 61 73 20 6e 6f   rollback, as no
21c30 20 6c 6f 63 6b 73 20 61 72 65 20 72 65 6c 65 61   locks are relea
21c40 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 74  sed and the.** t
21c50 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6d 61 69  ransaction remai
21c60 6e 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 69 6e 74 20  ns open..*/.int 
21c70 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
21c80 70 6f 69 6e 74 28 42 74 72 65 65 20 2a 70 2c 20  point(Btree *p, 
21c90 69 6e 74 20 6f 70 2c 20 69 6e 74 20 69 53 61 76  int op, int iSav
21ca0 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72  epoint){.  int r
21cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21cc0 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 6e 54   if( p && p->inT
21cd0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
21ce0 45 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65  E ){.    BtShare
21cf0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
21d00 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d  .    assert( op=
21d10 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41  =SAVEPOINT_RELEA
21d20 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f  SE || op==SAVEPO
21d30 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a  INT_ROLLBACK );.
21d40 20 20 20 20 61 73 73 65 72 74 28 20 69 53 61 76      assert( iSav
21d50 65 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 28 69 53  epoint>=0 || (iS
21d60 61 76 65 70 6f 69 6e 74 3d 3d 2d 31 20 26 26 20  avepoint==-1 && 
21d70 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
21d80 4c 4c 42 41 43 4b 29 20 29 3b 0a 20 20 20 20 73  LLBACK) );.    s
21d90 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
21da0 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  (p);.    rc = sq
21db0 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f  lite3PagerSavepo
21dc0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
21dd0 20 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29   op, iSavepoint)
21de0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
21df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21e00 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74 3c   if( iSavepoint<
21e10 30 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c  0 && (pBt->btsFl
21e20 61 67 73 20 26 20 42 54 53 5f 49 4e 49 54 49 41  ags & BTS_INITIA
21e30 4c 4c 59 5f 45 4d 50 54 59 29 21 3d 30 20 29 7b  LLY_EMPTY)!=0 ){
21e40 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  .        pBt->nP
21e50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  age = 0;.      }
21e60 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44  .      rc = newD
21e70 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20  atabase(pBt);.  
21e80 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d      pBt->nPage =
21e90 20 67 65 74 34 62 79 74 65 28 32 38 20 2b 20 70   get4byte(28 + p
21ea0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
21eb0 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  a);..      /* Th
21ec0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
21ed0 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  was written into
21ee0 20 74 68 65 20 6f 66 66 73 65 74 20 32 38 20 6f   the offset 28 o
21ef0 66 20 74 68 65 20 68 65 61 64 65 72 0a 20 20 20  f the header.   
21f00 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 74     ** when the t
21f10 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
21f20 65 64 2c 20 73 6f 20 77 65 20 6b 6e 6f 77 20 74  ed, so we know t
21f30 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 61 74  hat the value at
21f40 20 6f 66 66 73 65 74 0a 20 20 20 20 20 20 2a 2a   offset.      **
21f50 20 32 38 20 69 73 20 6e 6f 6e 7a 65 72 6f 2e 20   28 is nonzero. 
21f60 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
21f70 20 70 42 74 2d 3e 6e 50 61 67 65 3e 30 20 29 3b   pBt->nPage>0 );
21f80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
21f90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21fa0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
21fb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21fc0 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20 66  e a new cursor f
21fd0 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68 6f  or the BTree who
21fe0 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68  se root is on th
21ff0 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65  e page.** iTable
22000 2e 20 49 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79  . If a read-only
22010 20 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65   cursor is reque
22020 73 74 65 64 2c 20 69 74 20 69 73 20 61 73 73 75  sted, it is assu
22030 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65 20  med that.** the 
22040 63 61 6c 6c 65 72 20 61 6c 72 65 61 64 79 20 68  caller already h
22050 61 73 20 61 74 20 6c 65 61 73 74 20 61 20 72 65  as at least a re
22060 61 64 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74  ad-only transact
22070 69 6f 6e 20 6f 70 65 6e 0a 2a 2a 20 6f 6e 20 74  ion open.** on t
22080 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 72 65  he database alre
22090 61 64 79 2e 20 49 66 20 61 20 77 72 69 74 65 2d  ady. If a write-
220a0 63 75 72 73 6f 72 20 69 73 20 72 65 71 75 65 73  cursor is reques
220b0 74 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ted, then.** the
220c0 20 63 61 6c 6c 65 72 20 69 73 20 61 73 73 75 6d   caller is assum
220d0 65 64 20 74 6f 20 68 61 76 65 20 61 6e 20 6f 70  ed to have an op
220e0 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  en write transac
220f0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  tion..**.** If w
22100 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 74  rFlag==0, then t
22110 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f 6e  he cursor can on
22120 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20 72  ly be used for r
22130 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77 72  eading..** If wr
22140 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74 68  Flag==1, then th
22150 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 20  e cursor can be 
22160 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
22170 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74 69   or for.** writi
22180 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e 64  ng if other cond
22190 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74 69  itions for writi
221a0 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74 2e  ng are also met.
221b0 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20 74    These.** are t
221c0 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  he conditions th
221d0 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20 69  at must be met i
221e0 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69 74  n order for writ
221f0 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c  ing to.** be all
22200 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20  owed:.**.** 1:  
22210 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20  The cursor must 
22220 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65 64  have been opened
22230 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31 0a   with wrFlag==1.
22240 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72 20  **.** 2:  Other 
22250 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22260 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65 20  ions that share 
22270 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 63  the same pager c
22280 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74 20  ache.**     but 
22290 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69 6e  which are not in
222a0 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d 4d   the READ_UNCOMM
222b0 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79 20  ITTED state may 
222c0 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20  not have.**     
222d0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69 74  cursors open wit
222e0 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20 74  h wrFlag==0 on t
222f0 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20 20  he same table.  
22300 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20 20  Otherwise.**    
22310 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61 64   the changes mad
22320 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65 20  e by this write 
22330 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65 20  cursor would be 
22340 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20 20  visible to.**   
22350 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73 6f    the read curso
22360 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72 20  rs in the other 
22370 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22380 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54  ion..**.** 3:  T
22390 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
223a0 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e 6f   be writable (no
223b0 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 6d  t on read-only m
223c0 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20  edia).**.** 4:  
223d0 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 6e  There must be an
223e0 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
223f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68  ion..**.** No ch
22400 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74  ecking is done t
22410 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
22420 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61   page iTable rea
22430 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f  lly is the.** ro
22440 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74  ot page of a b-t
22450 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e  ree.  If it is n
22460 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  ot, then the cur
22470 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20  sor acquired.** 
22480 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f  will not work co
22490 72 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49  rrectly..**.** I
224a0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
224b0 74 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72  t the sqlite3Btr
224c0 65 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68  eeCursorZero() h
224d0 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a  as been called.*
224e0 2a 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69  * on pCur to ini
224f0 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f  tialize the memo
22500 72 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74  ry space prior t
22510 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20  o invoking this 
22520 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
22530 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73  ic int btreeCurs
22540 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20  or(.  Btree *p, 
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22570 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69  The btree */.  i
22580 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20  nt iTable,      
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
225b0 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f  ge of table to o
225c0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46  pen */.  int wrF
225d0 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  lag,            
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
22600 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
22610 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
22620 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
22630 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
22640 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f  arg to compariso
22650 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  n function */.  
22660 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
22690 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a  for new cursor *
226a0 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  /.){.  BtShared 
226b0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20  *pBt = p->pBt;  
226c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226d0 20 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68   Shared b-tree h
226e0 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72  andle */.  BtCur
226f0 73 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20  sor *pX;        
22700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22710 20 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65    /* Looping ove
22720 72 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73  r other all curs
22730 6f 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ors */..  assert
22740 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
22750 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
22760 20 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d   assert( wrFlag=
22770 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72  =0 .       || wr
22780 46 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53  Flag==BTREE_WRCS
22790 52 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  R .       || wrF
227a0 6c 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53  lag==(BTREE_WRCS
227b0 52 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54  R|BTREE_FORDELET
227c0 45 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54  E) .  );..  /* T
227d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
227e0 65 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76  ert statements v
227f0 65 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68  erify that if th
22800 69 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65  is is a sharable
22810 20 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61   .  ** b-tree da
22820 74 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e  tabase, the conn
22830 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e  ection is holdin
22840 67 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74  g the required t
22850 61 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a  able locks, .  *
22860 2a 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74  * and that no ot
22870 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  her connection h
22880 61 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73  as any open curs
22890 6f 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74  or that conflict
228a0 73 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69  s with .  ** thi
228b0 73 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73  s lock.  */.  as
228c0 73 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43  sert( hasSharedC
228d0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
228e0 20 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66   iTable, pKeyInf
228f0 6f 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a  o!=0, (wrFlag?2:
22900 31 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  1)) );.  assert(
22910 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68   wrFlag==0 || !h
22920 61 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28  asReadConflicts(
22930 70 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20  p, iTable) );.. 
22940 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
22950 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f  the caller has o
22960 70 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72  pened the requir
22970 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ed transaction. 
22980 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
22990 69 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f  inTrans>TRANS_NO
229a0 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NE );.  assert( 
229b0 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e  wrFlag==0 || p->
229c0 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
229d0 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
229e0 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26  ( pBt->pPage1 &&
229f0 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44   pBt->pPage1->aD
22a00 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ata );.  assert(
22a10 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70   wrFlag==0 || (p
22a20 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
22a30 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30  TS_READ_ONLY)==0
22a40 20 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61   );..  if( wrFla
22a50 67 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74  g ){.    allocat
22a60 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
22a70 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
22a80 6d 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74  mpSpace==0 ) ret
22a90 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
22aa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62  ;.  }.  if( iTab
22ab0 6c 65 3d 3d 31 20 26 26 20 62 74 72 65 65 50 61  le==1 && btreePa
22ac0 67 65 63 6f 75 6e 74 28 70 42 74 29 3d 3d 30 20  gecount(pBt)==0 
22ad0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 77  ){.    assert( w
22ae0 72 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20  rFlag==0 );.    
22af0 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a  iTable = 0;.  }.
22b00 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20 6e  .  /* Now that n
22b10 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20 63  o other errors c
22b20 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73 68  an occur, finish
22b30 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20   filling in the 
22b40 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76 61  BtCursor.  ** va
22b50 72 69 61 62 6c 65 73 20 61 6e 64 20 6c 69 6e 6b  riables and link
22b60 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
22b70 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
22b80 73 74 2e 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  st.  */.  pCur->
22b90 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f  pgnoRoot = (Pgno
22ba0 29 69 54 61 62 6c 65 3b 0a 20 20 70 43 75 72 2d  )iTable;.  pCur-
22bb0 3e 69 50 61 67 65 20 3d 20 2d 31 3b 0a 20 20 70  >iPage = -1;.  p
22bc0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
22bd0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
22be0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
22bf0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
22c00 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  .  pCur->curFlag
22c10 73 20 3d 20 77 72 46 6c 61 67 20 3f 20 42 54 43  s = wrFlag ? BTC
22c20 46 5f 57 72 69 74 65 46 6c 61 67 20 3a 20 30 3b  F_WriteFlag : 0;
22c30 0a 20 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65  .  pCur->curPage
22c40 72 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20  rFlags = wrFlag 
22c50 3f 20 30 20 3a 20 50 41 47 45 52 5f 47 45 54 5f  ? 0 : PAGER_GET_
22c60 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 2f 2a 20 49  READONLY;.  /* I
22c70 66 20 74 68 65 72 65 20 61 72 65 20 74 77 6f 20  f there are two 
22c80 6f 72 20 6d 6f 72 65 20 63 75 72 73 6f 72 73 20  or more cursors 
22c90 6f 6e 20 74 68 65 20 73 61 6d 65 20 62 74 72 65  on the same btre
22ca0 65 2c 20 74 68 65 6e 20 61 6c 6c 20 73 75 63 68  e, then all such
22cb0 0a 20 20 2a 2a 20 63 75 72 73 6f 72 73 20 2a 6d  .  ** cursors *m
22cc0 75 73 74 2a 20 68 61 76 65 20 74 68 65 20 42 54  ust* have the BT
22cd0 43 46 5f 4d 75 6c 74 69 70 6c 65 20 66 6c 61 67  CF_Multiple flag
22ce0 20 73 65 74 2e 20 2a 2f 0a 20 20 66 6f 72 28 70   set. */.  for(p
22cf0 58 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  X=pBt->pCursor; 
22d00 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
22d10 29 7b 0a 20 20 20 20 69 66 28 20 70 58 2d 3e 70  ){.    if( pX->p
22d20 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67 6e 6f 29 69  gnoRoot==(Pgno)i
22d30 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70  Table ){.      p
22d40 58 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42  X->curFlags |= B
22d50 54 43 46 5f 4d 75 6c 74 69 70 6c 65 3b 0a 20 20  TCF_Multiple;.  
22d60 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
22d70 67 73 20 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69  gs |= BTCF_Multi
22d80 70 6c 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ple;.    }.  }. 
22d90 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
22da0 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 70  Bt->pCursor;.  p
22db0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
22dc0 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61  ur;.  pCur->eSta
22dd0 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
22de0 4c 49 44 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  LID;.  return SQ
22df0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
22e00 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22e10 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e40 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
22e50 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20  .  int iTable,  
22e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e80 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
22e90 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
22ea0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22ed0 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72   1 to write. 0 r
22ee0 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74  ead-only */.  st
22ef0 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  ruct KeyInfo *pK
22f00 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
22f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
22f20 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61  st arg to xCompa
22f30 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73  re() */.  BtCurs
22f40 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20  or *pCur        
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e        /* Write n
22f70 65 77 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a  ew cursor here *
22f80 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
22f90 20 69 66 28 20 69 54 61 62 6c 65 3c 31 20 29 7b   if( iTable<1 ){
22fa0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
22fb0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
22fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
22fd0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
22fe0 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65  ;.    rc = btree
22ff0 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65  Cursor(p, iTable
23000 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e  , wrFlag, pKeyIn
23010 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 20 20 73  fo, pCur);.    s
23020 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
23030 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
23040 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
23050 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
23060 66 20 61 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  f a BtCursor obj
23070 65 63 74 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a  ect in bytes..**
23080 0a 2a 2a 20 54 68 69 73 20 69 6e 74 65 72 66 61  .** This interfa
23090 63 65 73 20 69 73 20 6e 65 65 64 65 64 20 73 6f  ces is needed so
230a0 20 74 68 61 74 20 75 73 65 72 73 20 6f 66 20 63   that users of c
230b0 75 72 73 6f 72 73 20 63 61 6e 20 70 72 65 61 6c  ursors can preal
230c0 6c 6f 63 61 74 65 0a 2a 2a 20 73 75 66 66 69 63  locate.** suffic
230d0 69 65 6e 74 20 73 74 6f 72 61 67 65 20 74 6f 20  ient storage to 
230e0 68 6f 6c 64 20 61 20 63 75 72 73 6f 72 2e 20 20  hold a cursor.  
230f0 54 68 65 20 42 74 43 75 72 73 6f 72 20 6f 62 6a  The BtCursor obj
23100 65 63 74 20 69 73 20 6f 70 61 71 75 65 0a 2a 2a  ect is opaque.**
23110 20 74 6f 20 75 73 65 72 73 20 73 6f 20 74 68 65   to users so the
23120 79 20 63 61 6e 6e 6f 74 20 64 6f 20 74 68 65 20  y cannot do the 
23130 73 69 7a 65 6f 66 28 29 20 74 68 65 6d 73 65 6c  sizeof() themsel
23140 76 65 73 20 2d 20 74 68 65 79 20 6d 75 73 74 20  ves - they must 
23150 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  call.** this rou
23160 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
23170 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
23180 69 7a 65 28 76 6f 69 64 29 7b 0a 20 20 72 65 74  ize(void){.  ret
23190 75 72 6e 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  urn ROUND8(sizeo
231a0 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 7d 0a  f(BtCursor));.}.
231b0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
231c0 65 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 69  e memory that wi
231d0 6c 6c 20 62 65 20 63 6f 6e 76 65 72 74 65 64 20  ll be converted 
231e0 69 6e 74 6f 20 61 20 42 74 43 75 72 73 6f 72 20  into a BtCursor 
231f0 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
23200 65 20 73 69 6d 70 6c 65 20 61 70 70 72 6f 61 63  e simple approac
23210 68 20 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20  h here would be 
23220 74 6f 20 6d 65 6d 73 65 74 28 29 20 74 68 65 20  to memset() the 
23230 65 6e 74 69 72 65 20 6f 62 6a 65 63 74 0a 2a 2a  entire object.**
23240 20 74 6f 20 7a 65 72 6f 2e 20 20 42 75 74 20 69   to zero.  But i
23250 74 20 74 75 72 6e 73 20 6f 75 74 20 74 68 61 74  t turns out that
23260 20 74 68 65 20 61 70 50 61 67 65 5b 5d 20 61 6e   the apPage[] an
23270 64 20 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73  d aiIdx[] arrays
23280 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20  .** do not need 
23290 74 6f 20 62 65 20 7a 65 72 6f 65 64 20 61 6e 64  to be zeroed and
232a0 20 74 68 65 79 20 61 72 65 20 6c 61 72 67 65 2c   they are large,
232b0 20 73 6f 20 77 65 20 63 61 6e 20 73 61 76 65 20   so we can save 
232c0 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20 72 75 6e 2d  a lot.** of run-
232d0 74 69 6d 65 20 62 79 20 73 6b 69 70 70 69 6e 67  time by skipping
232e0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
232f0 69 6f 6e 20 6f 66 20 74 68 6f 73 65 20 65 6c 65  ion of those ele
23300 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ments..*/.void s
23310 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23320 72 5a 65 72 6f 28 42 74 43 75 72 73 6f 72 20 2a  rZero(BtCursor *
23330 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
23340 30 2c 20 6f 66 66 73 65 74 6f 66 28 42 74 43 75  0, offsetof(BtCu
23350 72 73 6f 72 2c 20 69 50 61 67 65 29 29 3b 0a 7d  rsor, iPage));.}
23360 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
23370 63 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61  cursor.  The rea
23380 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  d lock on the da
23390 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72  tabase file is r
233a0 65 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20  eleased.** when 
233b0 74 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20  the last cursor 
233c0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e  is closed..*/.in
233d0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
233e0 6f 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73  oseCursor(BtCurs
233f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72  or *pCur){.  Btr
23400 65 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75  ee *pBtree = pCu
23410 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28  r->pBtree;.  if(
23420 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69   pBtree ){.    i
23430 6e 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72  nt i;.    BtShar
23440 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
23450 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pBt;.    sqlite3
23460 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
23470 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  e);.    sqlite3B
23480 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28  treeClearCursor(
23490 70 43 75 72 29 3b 0a 20 20 20 20 61 73 73 65 72  pCur);.    asser
234a0 74 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 21  t( pBt->pCursor!
234b0 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  =0 );.    if( pB
234c0 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 70 43 75 72  t->pCursor==pCur
234d0 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
234e0 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70  Cursor = pCur->p
234f0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
23500 0a 20 20 20 20 20 20 42 74 43 75 72 73 6f 72 20  .      BtCursor 
23510 2a 70 50 72 65 76 20 3d 20 70 42 74 2d 3e 70 43  *pPrev = pBt->pC
23520 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 64 6f 7b  ursor;.      do{
23530 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 72  .        if( pPr
23540 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 43 75 72 20  ev->pNext==pCur 
23550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 72  ){.          pPr
23560 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75 72  ev->pNext = pCur
23570 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20  ->pNext;.       
23580 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23590 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 72 65    }.        pPre
235a0 76 20 3d 20 70 50 72 65 76 2d 3e 70 4e 65 78 74  v = pPrev->pNext
235b0 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20  ;.      }while( 
235c0 41 4c 57 41 59 53 28 70 50 72 65 76 29 20 29 3b  ALWAYS(pPrev) );
235d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
235e0 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
235f0 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
23600 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
23610 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
23620 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
23630 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
23640 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
23650 65 65 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  ee(pCur->aOverfl
23660 6f 77 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ow);.    /* sqli
23670 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
23680 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
23690 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
236a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
236b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
236c0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
236d0 20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e   BtCursor* given
236e0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
236f0 20 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20   has a valid.** 
23700 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74  BtCursor.info st
23710 72 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20  ructure.  If it 
23720 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76  is not already v
23730 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 62 74  alid, call.** bt
23740 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
23750 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
23760 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
23770 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
23780 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
23790 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
237a0 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
237b0 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
237c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
237d0 61 6c 6c 73 20 74 6f 20 62 74 72 65 65 50 61 72  alls to btreePar
237e0 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f 0a 23 69 66  seCell()..*/.#if
237f0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 73 74  ndef NDEBUG.  st
23800 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72 74  atic void assert
23810 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f  CellInfo(BtCurso
23820 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 43 65  r *pCur){.    Ce
23830 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
23840 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43 75   int iPage = pCu
23850 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 6d 65  r->iPage;.    me
23860 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
23870 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
23880 20 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c    btreeParseCell
23890 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
238a0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
238b0 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
238c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 43 4f  ;.    assert( CO
238d0 52 52 55 50 54 5f 44 42 20 7c 7c 20 6d 65 6d 63  RRUPT_DB || memc
238e0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
238f0 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
23900 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
23910 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
23920 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
23930 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 53  .#endif.static S
23940 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
23950 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
23960 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
23970 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
23980 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
23990 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
239a0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 70  ur->iPage;.    p
239b0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c 3d  Cur->curFlags |=
239c0 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 3b   BTCF_ValidNKey;
239d0 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43  .    btreeParseC
239e0 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ell(pCur->apPage
239f0 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d 3e 61 69  [iPage],pCur->ai
23a00 49 64 78 5b 69 50 61 67 65 5d 2c 26 70 43 75 72  Idx[iPage],&pCur
23a10 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d 65 6c 73 65  ->info);.  }else
23a20 7b 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c  {.    assertCell
23a30 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Info(pCur);.  }.
23a40 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
23a50 47 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 72  G  /* The next r
23a60 6f 75 74 69 6e 65 20 75 73 65 64 20 6f 6e 6c 79  outine used only
23a70 20 77 69 74 68 69 6e 20 61 73 73 65 72 74 28 29   within assert()
23a80 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 2f   statements */./
23a90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
23aa0 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 42 74   if the given Bt
23ab0 43 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  Cursor is valid.
23ac0 20 20 41 20 76 61 6c 69 64 20 63 75 72 73 6f 72    A valid cursor
23ad0 20 69 73 20 6f 6e 65 0a 2a 2a 20 74 68 61 74 20   is one.** that 
23ae0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  is currently poi
23af0 6e 74 69 6e 67 20 74 6f 20 61 20 72 6f 77 20 69  nting to a row i
23b00 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70 74 79 29 20  n a (non-empty) 
23b10 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 69  table..** This i
23b20 73 20 61 20 76 65 72 69 66 69 63 61 74 69 6f 6e  s a verification
23b30 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
23b40 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73   only within ass
23b50 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
23b60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23b70 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
23b80 69 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  id(BtCursor *pCu
23b90 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
23ba0 72 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74  r && pCur->eStat
23bb0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b  e==CURSOR_VALID;
23bc0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4e 44 45  .}.#endif /* NDE
23bd0 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65  BUG */../*.** Se
23be0 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20  t *pSize to the 
23bf0 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66  size of the buff
23c00 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c  er needed to hol
23c10 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a  d the value of.*
23c20 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68  * the key for th
23c30 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e  e current entry.
23c40 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
23c50 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a  is not pointing.
23c60 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e  ** to a valid en
23c70 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73  try, *pSize is s
23c80 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20  et to 0. .**.** 
23c90 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68  For a table with
23ca0 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67   the INTKEY flag
23cb0 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69   set, this routi
23cc0 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b  ne returns the k
23cd0 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f  ey.** itself, no
23ce0 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
23cf0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79  bytes in the key
23d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
23d10 65 72 20 6d 75 73 74 20 70 6f 73 69 74 69 6f 6e  er must position
23d20 20 74 68 65 20 63 75 72 73 6f 72 20 70 72 69 6f   the cursor prio
23d30 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67 20 74 68  r to invoking th
23d40 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 20 0a  is routine..** .
23d50 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
23d60 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 20 49 74  cannot fail.  It
23d70 20 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20   always returns 
23d80 53 51 4c 49 54 45 5f 4f 4b 2e 20 20 0a 2a 2f 0a  SQLITE_OK.  .*/.
23d90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
23da0 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
23db0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
23dc0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ze){.  assert( c
23dd0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
23de0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
23df0 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
23e00 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
23e10 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70  .  getCellInfo(p
23e20 43 75 72 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d  Cur);.  *pSize =
23e30 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
23e40 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
23e50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
23e60 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68 65  et *pSize to the
23e70 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
23e80 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65 20   of data in the 
23e90 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63 75 72  entry the.** cur
23ea0 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  sor currently po
23eb0 69 6e 74 73 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ints to..**.** T
23ec0 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67  he caller must g
23ed0 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
23ee0 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  e cursor is poin
23ef0 74 69 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55  ting to a non-NU
23f00 4c 4c 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72  LL.** valid entr
23f10 79 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  y.  In other wor
23f20 64 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ds, the calling 
23f30 70 72 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67  procedure must g
23f40 75 61 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74  uarantee.** that
23f50 20 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20   the cursor has 
23f60 43 75 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43  Cursor.eState==C
23f70 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a  URSOR_VALID..**.
23f80 2a 2a 20 46 61 69 6c 75 72 65 20 69 73 20 6e 6f  ** Failure is no
23f90 74 20 70 6f 73 73 69 62 6c 65 2e 20 20 54 68 69  t possible.  Thi
23fa0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79  s function alway
23fb0 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  s returns SQLITE
23fc0 5f 4f 4b 2e 0a 2a 2a 20 49 74 20 6d 69 67 68 74  _OK..** It might
23fd0 20 6a 75 73 74 20 61 73 20 77 65 6c 6c 20 62 65   just as well be
23fe0 20 61 20 70 72 6f 63 65 64 75 72 65 20 28 72 65   a procedure (re
23ff0 74 75 72 6e 69 6e 67 20 76 6f 69 64 29 20 62 75  turning void) bu
24000 74 20 77 65 20 63 6f 6e 74 69 6e 75 65 0a 2a 2a  t we continue.**
24010 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 69 6e   to return an in
24020 74 65 67 65 72 20 72 65 73 75 6c 74 20 63 6f 64  teger result cod
24030 65 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  e for historical
24040 20 72 65 61 73 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74   reasons..*/.int
24050 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74   sqlite3BtreeDat
24060 61 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  aSize(BtCursor *
24070 70 43 75 72 2c 20 75 33 32 20 2a 70 53 69 7a 65  pCur, u32 *pSize
24080 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
24090 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
240a0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
240b0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
240c0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
240d0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
240e0 50 61 67 65 3e 3d 30 20 29 3b 0a 20 20 61 73 73  Page>=0 );.  ass
240f0 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65  ert( pCur->iPage
24100 3c 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45  <BTCURSOR_MAX_DE
24110 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
24120 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
24130 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b  ur->iPage]->intK
24140 65 79 4c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 67  eyLeaf==1 );.  g
24150 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
24160 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75  ;.  *pSize = pCu
24170 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
24180 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
24190 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  E_OK;.}../*.** G
241a0 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
241b0 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
241c0 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
241d0 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
241e0 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
241f0 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
24200 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
24210 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
24220 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
24230 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
24240 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
24250 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
24260 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
24270 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
24280 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
24290 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
242a0 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
242b0 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
242c0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
242d0 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
242e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
242f0 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
24300 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e:.**.** The pag
24310 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
24320 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  next overflow pa
24330 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64  ge in the linked
24340 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69   list is .** wri
24350 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65  tten to *pPgnoNe
24360 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c  xt. If page ovfl
24370 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
24380 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20  e in its linked 
24390 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f  .** list, *pPgno
243a0 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a  Next is set to z
243b0 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70  ero. .**.** If p
243c0 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c  pPage is not NUL
243d0 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e  L, and a referen
243e0 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  ce to the MemPag
243f0 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70  e object corresp
24400 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67  onding.** to pag
24410 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77  e number pOvfl w
24420 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65  as obtained, the
24430 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  n *ppPage is set
24440 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61   to point to tha
24450 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20  t.** reference. 
24460 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
24470 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
24480 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72  caller to call r
24490 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20  eleasePage().** 
244a0 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72  on *ppPage to fr
244b0 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ee the reference
244c0 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63  . In no referenc
244d0 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28  e was obtained (
244e0 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70  because.** the p
244f0 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75  ointer-map was u
24500 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  sed to obtain th
24510 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67  e value for *pPg
24520 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a  noNext), then.**
24530 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
24540 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  to zero..*/.stat
24550 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
24560 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
24570 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
24580 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
24590 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
245a0 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20   Pgno ovfl,     
245b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
245c0 20 43 75 72 72 65 6e 74 20 6f 76 65 72 66 6c 6f   Current overflo
245d0 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  w page number */
245e0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
245f0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
24600 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
24610 68 61 6e 64 6c 65 20 28 6d 61 79 20 62 65 20 4e  handle (may be N
24620 55 4c 4c 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  ULL) */.  Pgno *
24630 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20  pPgnoNext       
24640 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
24650 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
24660 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
24670 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a   Pgno next = 0;.
24680 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
24690 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d   = 0;.  int rc =
246a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
246b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
246c0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
246d0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
246e0 74 28 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23  t(pPgnoNext);..#
246f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
24700 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24710 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
24720 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
24730 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
24740 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
24750 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
24760 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
24770 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
24780 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
24790 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
247a0 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
247b0 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
247c0 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
247d0 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
247e0 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
247f0 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
24800 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
24810 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
24820 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
24830 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
24840 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
24850 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
24860 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
24870 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
24880 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
24890 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
248a0 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
248b0 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
248c0 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
248d0 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
248e0 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
248f0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
24900 28 20 69 47 75 65 73 73 3c 3d 62 74 72 65 65 50  ( iGuess<=btreeP
24910 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b  agecount(pBt) ){
24920 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
24930 61 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73  apGet(pBt, iGues
24940 73 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f  s, &eType, &pgno
24950 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
24960 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54  =SQLITE_OK && eT
24970 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
24980 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
24990 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
249a0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
249b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
249c0 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a  E_DONE;.      }.
249d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
249e0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 65 78 74  ..  assert( next
249f0 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  ==0 || rc==SQLIT
24a00 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20  E_DONE );.  if( 
24a10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24a20 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47  .    rc = btreeG
24a30 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  etPage(pBt, ovfl
24a40 2c 20 26 70 50 61 67 65 2c 20 28 70 70 50 61 67  , &pPage, (ppPag
24a50 65 3d 3d 30 29 20 3f 20 50 41 47 45 52 5f 47 45  e==0) ? PAGER_GE
24a60 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 3b  T_READONLY : 0);
24a70 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d  .    assert( rc=
24a80 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
24a90 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  age==0 );.    if
24aa0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
24ab0 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
24ac0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
24ad0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
24ae0 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
24af0 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
24b00 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
24b10 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
24b20 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
24b30 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
24b40 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
24b50 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
24b60 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
24b70 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
24b80 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
24b90 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
24ba0 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
24bb0 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
24bc0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
24bd0 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
24be0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
24bf0 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
24c00 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
24c10 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
24c20 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
24c30 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
24c40 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
24c50 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
24c60 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
24c70 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
24c80 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
24c90 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
24ca0 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
24cb0 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
24cc0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
24cd0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
24ce0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
24cf0 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
24d00 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
24d10 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
24d20 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
24d30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
24d40 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
24d50 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
24d60 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
24d70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
24d80 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
24d90 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
24da0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
24db0 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
24dc0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
24dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24de0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
24df0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
24e00 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
24e10 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
24e20 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
24e30 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
24e40 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
24e50 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
24e60 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
24e70 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
24e80 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
24e90 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
24ea0 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
24eb0 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
24ec0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
24ed0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
24ee0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
24ef0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
24f00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24f10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
24f20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
24f30 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
24f40 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
24f50 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
24f60 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
24f70 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
24f80 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
24f90 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
24fa0 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
24fb0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24fc0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
24fd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
24fe0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
24ff0 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
25000 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
25010 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
25020 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
25030 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
25040 6f 2e 20 54 68 65 20 65 4f 70 0a 2a 2a 20 61 72  o. The eOp.** ar
25050 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70  gument is interp
25060 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
25070 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a 20 54 68 65  :.**.**   0: The
25080 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20   operation is a 
25090 72 65 61 64 2e 20 50 6f 70 75 6c 61 74 65 20 74  read. Populate t
250a0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68  he overflow cach
250b0 65 2e 0a 2a 2a 20 20 20 31 3a 20 54 68 65 20 6f  e..**   1: The o
250c0 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 77 72  peration is a wr
250d0 69 74 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68  ite. Populate th
250e0 65 20 6f 76 65 72 66 6c 6f 77 20 63 61 63 68 65  e overflow cache
250f0 2e 0a 2a 2a 20 20 20 32 3a 20 54 68 65 20 6f 70  ..**   2: The op
25100 65 72 61 74 69 6f 6e 20 69 73 20 61 20 72 65 61  eration is a rea
25110 64 2e 20 44 6f 20 6e 6f 74 20 70 6f 70 75 6c 61  d. Do not popula
25120 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
25130 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  cache..**.** A t
25140 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62 79  otal of "amt" by
25150 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72 20  tes are read or 
25160 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e  written beginnin
25170 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  g at "offset"..*
25180 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20 74  * Data is read t
25190 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62 75  o or from the bu
251a0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
251b0 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 62 65 69   The content bei
251c0 6e 67 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  ng read or writt
251d0 65 6e 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  en might appear 
251e0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
251f0 0a 2a 2a 20 6f 72 20 62 65 20 73 63 61 74 74 65  .** or be scatte
25200 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
25210 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ple overflow pag
25220 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  es..**.** If the
25230 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
25240 65 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f  entry uses one o
25250 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20  r more overflow 
25260 70 61 67 65 73 20 61 6e 64 20 74 68 65 0a 2a 2a  pages and the.**
25270 20 65 4f 70 20 61 72 67 75 6d 65 6e 74 20 69 73   eOp argument is
25280 20 6e 6f 74 20 32 2c 20 74 68 69 73 20 66 75 6e   not 2, this fun
25290 63 74 69 6f 6e 20 6d 61 79 20 61 6c 6c 6f 63 61  ction may alloca
252a0 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64  te space for and
252b0 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20 70 6f 70 75   lazily .** popu
252c0 6c 61 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c  lates the overfl
252d0 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
252e0 68 65 20 61 72 72 61 79 20 28 42 74 43 75 72 73  he array (BtCurs
252f0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 0a  or.aOverflow). .
25300 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
25310 6c 6c 73 20 75 73 65 20 74 68 69 73 20 63 61 63  lls use this cac
25320 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69  he to make seeki
25330 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
25340 65 64 20 6f 66 66 73 65 74 20 0a 2a 2a 20 6d 6f  ed offset .** mo
25350 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
25360 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
25370 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
25380 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
25390 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
253a0 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
253b0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
253c0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
253d0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
253e0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
253f0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
25400 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
25410 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
25420 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
25430 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
25440 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
25450 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
25460 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
25470 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
25480 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
25490 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
254a0 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
254b0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
254c0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
254d0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
254e0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
254f0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
25500 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
25510 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
25520 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
25530 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
25540 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
25550 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
25560 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
25570 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
25580 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
25590 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
255a0 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
255b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
255c0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
255d0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
255e0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
255f0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
25600 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
25610 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 65 4f 70  er */ .  int eOp
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25630 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
25640 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
25650 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
25660 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
25670 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
25680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
25690 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
256a0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
256b0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
256c0 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20  Page]; /* Btree 
256d0 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20  page of current 
256e0 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61  entry */.  BtSha
256f0 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
25700 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  >pBt;           
25710 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20         /* Btree 
25720 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f  this cursor belo
25730 6e 67 73 20 74 6f 20 2a 2f 0a 23 69 66 64 65 66  ngs to */.#ifdef
25740 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f   SQLITE_DIRECT_O
25750 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 75  VERFLOW_READ.  u
25760 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 20 63  nsigned char * c
25770 6f 6e 73 74 20 70 42 75 66 53 74 61 72 74 20 3d  onst pBufStart =
25780 20 70 42 75 66 3b 0a 20 20 69 6e 74 20 62 45 6e   pBuf;.  int bEn
25790 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
257a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257b0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
257c0 61 64 69 6e 67 20 74 6f 20 65 6e 64 20 6f 66 20  ading to end of 
257d0 64 61 74 61 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  data */.#endif..
257e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
257f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
25800 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
25810 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
25820 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
25830 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
25840 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
25850 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
25860 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
25870 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4f 70 21  ;.  assert( eOp!
25880 3d 32 20 7c 7c 20 6f 66 66 73 65 74 3d 3d 30 20  =2 || offset==0 
25890 29 3b 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20  );    /* Always 
258a0 73 74 61 72 74 20 66 72 6f 6d 20 62 65 67 69 6e  start from begin
258b0 6e 69 6e 67 20 66 6f 72 20 65 4f 70 3d 3d 32 20  ning for eOp==2 
258c0 2a 2f 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  */..  getCellInf
258d0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
258e0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
258f0 2e 70 50 61 79 6c 6f 61 64 3b 0a 23 69 66 64 65  .pPayload;.#ifde
25900 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f  f SQLITE_DIRECT_
25910 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20  OVERFLOW_READ.  
25920 62 45 6e 64 20 3d 20 6f 66 66 73 65 74 2b 61 6d  bEnd = offset+am
25930 74 3d 3d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50  t==pCur->info.nP
25940 61 79 6c 6f 61 64 3b 0a 23 65 6e 64 69 66 0a 20  ayload;.#endif. 
25950 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 2b   assert( offset+
25960 61 6d 74 20 3c 3d 20 70 43 75 72 2d 3e 69 6e 66  amt <= pCur->inf
25970 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 0a 20  o.nPayload );.. 
25980 20 69 66 28 20 26 61 50 61 79 6c 6f 61 64 5b 70   if( &aPayload[p
25990 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
259a0 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
259b0 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
259c0 65 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79  e] ){.    /* Try
259d0 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20 77  ing to read or w
259e0 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65 6e  rite past the en
259f0 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69 73  d of the data is
25a00 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
25a10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
25a20 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
25a30 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
25a40 64 61 74 61 20 6d 75 73 74 20 62 65 20 72 65 61  data must be rea
25a50 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f  d/written to/fro
25a60 6d 20 74 68 65 20 62 74 72 65 65 20 70 61 67 65  m the btree page
25a70 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66   itself. */.  if
25a80 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69  ( offset<pCur->i
25a90 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20  nfo.nLocal ){.  
25aa0 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
25ab0 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e     if( a+offset>
25ac0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25ad0 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70  l ){.      a = p
25ae0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
25af0 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d   - offset;.    }
25b00 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61  .    rc = copyPa
25b10 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
25b20 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
25b30 2c 20 28 65 4f 70 20 26 20 30 78 30 31 29 2c 20  , (eOp & 0x01), 
25b40 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
25b50 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b  .    offset = 0;
25b60 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a  .    pBuf += a;.
25b70 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
25b80 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73 65  }else{.    offse
25b90 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t -= pCur->info.
25ba0 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 0a 20 20  nLocal;.  }...  
25bb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25bc0 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
25bd0 20 20 63 6f 6e 73 74 20 75 33 32 20 6f 76 66 6c    const u32 ovfl
25be0 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
25bf0 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20  leSize - 4;  /* 
25c00 42 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65  Bytes content pe
25c10 72 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20  r ovfl page */. 
25c20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65     Pgno nextPage
25c30 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20  ;..    nextPage 
25c40 3d 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79  = get4byte(&aPay
25c50 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e  load[pCur->info.
25c60 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 20 20 20 20 2f  nLocal]);..    /
25c70 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73 6f  * If the BtCurso
25c80 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 68 61  r.aOverflow[] ha
25c90 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
25ca0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
25cb0 74 20 6e 6f 77 2e 0a 20 20 20 20 2a 2a 20 45 78  t now..    ** Ex
25cc0 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c  cept, do not all
25cd0 6f 63 61 74 65 20 61 4f 76 65 72 66 6c 6f 77 5b  ocate aOverflow[
25ce0 5d 20 66 6f 72 20 65 4f 70 3d 3d 32 2e 0a 20 20  ] for eOp==2..  
25cf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
25d00 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61  aOverflow[] arra
25d10 79 20 69 73 20 73 69 7a 65 64 20 61 74 20 6f 6e  y is sized at on
25d20 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68  e entry for each
25d30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
25d40 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 6f 76 65     ** in the ove
25d50 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
25d60 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
25d70 74 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c  the first overfl
25d80 6f 77 20 70 61 67 65 20 69 73 0a 20 20 20 20 2a  ow page is.    *
25d90 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  * stored in aOve
25da0 72 66 6c 6f 77 5b 30 5d 2c 20 65 74 63 2e 20 41  rflow[0], etc. A
25db0 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74   value of 0 in t
25dc0 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61  he aOverflow[] a
25dd0 72 72 61 79 0a 20 20 20 20 2a 2a 20 6d 65 61 6e  rray.    ** mean
25de0 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
25df0 22 20 28 74 68 65 20 63 61 63 68 65 20 69 73 20  " (the cache is 
25e00 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64  lazily populated
25e10 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
25e20 28 20 65 4f 70 21 3d 32 20 26 26 20 28 70 43 75  ( eOp!=2 && (pCu
25e30 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
25e40 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
25e50 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
25e60 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66  vfl = (pCur->inf
25e70 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d  o.nPayload-pCur-
25e80 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66  >info.nLocal+ovf
25e90 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a  lSize-1)/ovflSiz
25ea0 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76  e;.      if( nOv
25eb0 66 6c 3e 70 43 75 72 2d 3e 6e 4f 76 66 6c 41 6c  fl>pCur->nOvflAl
25ec0 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 50  loc ){.        P
25ed0 67 6e 6f 20 2a 61 4e 65 77 20 3d 20 28 50 67 6e  gno *aNew = (Pgn
25ee0 6f 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f  o*)sqlite3Reallo
25ef0 63 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  c(.            p
25f00 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 2c 20  Cur->aOverflow, 
25f10 6e 4f 76 66 6c 2a 32 2a 73 69 7a 65 6f 66 28 50  nOvfl*2*sizeof(P
25f20 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
25f30 20 20 20 20 20 20 20 20 69 66 28 20 61 4e 65 77          if( aNew
25f40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
25f50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
25f60 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EM;.        }els
25f70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  e{.          pCu
25f80 72 2d 3e 6e 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20  r->nOvflAlloc = 
25f90 6e 4f 76 66 6c 2a 32 3b 0a 20 20 20 20 20 20 20  nOvfl*2;.       
25fa0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
25fb0 6f 77 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  ow = aNew;.     
25fc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25fd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25ff0 6d 65 6d 73 65 74 28 70 43 75 72 2d 3e 61 4f 76  memset(pCur->aOv
26000 65 72 66 6c 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c  erflow, 0, nOvfl
26010 2a 73 69 7a 65 6f 66 28 50 67 6e 6f 29 29 3b 0a  *sizeof(Pgno));.
26020 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75          pCur->cu
26030 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 56  rFlags |= BTCF_V
26040 61 6c 69 64 4f 76 66 6c 3b 0a 20 20 20 20 20 20  alidOvfl;.      
26050 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
26060 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
26070 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
26080 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
26090 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
260a0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
260b0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
260c0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
260d0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
260e0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
260f0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
26100 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67  ( (pCur->curFlag
26110 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76  s & BTCF_ValidOv
26120 66 6c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 70  fl)!=0.     && p
26130 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f  Cur->aOverflow[o
26140 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a  ffset/ovflSize].
26150 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 49 64      ){.      iId
26160 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c  x = (offset/ovfl
26170 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78  Size);.      nex
26180 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f  tPage = pCur->aO
26190 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20  verflow[iIdx];. 
261a0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f       offset = (o
261b0 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b  ffset%ovflSize);
261c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
261d0 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
261e0 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
261f0 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
26200 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71  .      /* If req
26210 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20  uired, populate 
26220 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
26230 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f  e-list cache. */
26240 0a 20 20 20 20 20 20 69 66 28 20 28 70 43 75 72  .      if( (pCur
26250 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
26260 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21 3d 30 20  F_ValidOvfl)!=0 
26270 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
26280 74 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  t( pCur->aOverfl
26290 6f 77 5b 69 49 64 78 5d 3d 3d 30 0a 20 20 20 20  ow[iIdx]==0.    
262a0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
262b0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
262c0 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65 0a 20  Idx]==nextPage. 
262d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
262e0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
262f0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f          pCur->aO
26300 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20  verflow[iIdx] = 
26310 6e 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20  nextPage;.      
26320 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66  }..      if( off
26330 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b  set>=ovflSize ){
26340 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
26350 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72  only reason to r
26360 65 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73  ead this page is
26370 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70   to obtain the p
26380 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
26390 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65  umber for the ne
263a0 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
263b0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
263c0 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20  he page.        
263d0 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72  ** data is not r
263e0 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73  equired. So firs
263f0 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20  t try to lookup 
26400 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20  the overflow.   
26410 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73       ** page-lis
26420 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c  t cache, if any,
26430 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20   then fall back 
26440 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c  to the getOverfl
26450 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20  owPage().       
26460 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20   ** function..  
26470 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26480 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
26490 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72  e aOverflow[] ar
264a0 72 61 79 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f  ray must be allo
264b0 63 61 74 65 64 20 62 65 63 61 75 73 65 20 65 4f  cated because eO
264c0 70 21 3d 32 0a 20 20 20 20 20 20 20 20 2a 2a 20  p!=2.        ** 
264d0 68 65 72 65 2e 20 20 49 66 20 65 4f 70 3d 3d 32  here.  If eOp==2
264e0 2c 20 74 68 65 6e 20 6f 66 66 73 65 74 3d 3d 30  , then offset==0
264f0 20 61 6e 64 20 74 68 69 73 20 62 72 61 6e 63 68   and this branch
26500 20 69 73 20 6e 65 76 65 72 20 74 61 6b 65 6e 2e   is never taken.
26510 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26520 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 21      assert( eOp!
26530 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =2 );.        as
26540 73 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 46  sert( pCur->curF
26550 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69  lags & BTCF_Vali
26560 64 4f 76 66 6c 20 29 3b 0a 20 20 20 20 20 20 20  dOvfl );.       
26570 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
26580 42 74 72 65 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e  Btree->db==pBt->
26590 64 62 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  db );.        if
265a0 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
265b0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
265c0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
265d0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
265e0 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
265f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26600 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72      rc = getOver
26610 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e 65  flowPage(pBt, ne
26620 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78 74  xtPage, 0, &next
26630 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
26640 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
26650 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
26660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26670 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
26680 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
26690 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
266a0 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
266b0 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
266c0 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
266d0 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
266e0 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
266f0 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
26700 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
26710 5f 44 49 52 45 43 54 5f 4f 56 45 52 46 4c 4f 57  _DIRECT_OVERFLOW
26720 5f 52 45 41 44 0a 20 20 20 20 20 20 20 20 73 71  _READ.        sq
26730 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a  lite3_file *fd;.
26740 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
26750 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
26760 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73      if( a + offs
26770 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b  et > ovflSize ){
26780 0a 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f  .          a = o
26790 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
267a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 23 69 66  ;.        }..#if
267b0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45 43  def SQLITE_DIREC
267c0 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44 0a  T_OVERFLOW_READ.
267d0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c          /* If al
267e0 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  l the following 
267f0 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 20 20  are true:.      
26800 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26810 20 20 31 29 20 74 68 69 73 20 69 73 20 61 20 72    1) this is a r
26820 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 2c 20 61  ead operation, a
26830 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  nd .        **  
26840 20 32 29 20 64 61 74 61 20 69 73 20 72 65 71 75   2) data is requ
26850 69 72 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ired from the st
26860 61 72 74 20 6f 66 20 74 68 69 73 20 6f 76 65 72  art of this over
26870 66 6c 6f 77 20 70 61 67 65 2c 20 61 6e 64 0a 20  flow page, and. 
26880 20 20 20 20 20 20 20 2a 2a 20 20 20 33 29 20 74         **   3) t
26890 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 66  he database is f
268a0 69 6c 65 2d 62 61 63 6b 65 64 2c 20 61 6e 64 0a  ile-backed, and.
268b0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 34 29 20          **   4) 
268c0 74 68 65 72 65 20 69 73 20 6e 6f 20 6f 70 65 6e  there is no open
268d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
268e0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 20 20 20 20  on, and.        
268f0 2a 2a 20 20 20 35 29 20 74 68 65 20 64 61 74 61  **   5) the data
26900 62 61 73 65 20 69 73 20 6e 6f 74 20 61 20 57 41  base is not a WA
26910 4c 20 64 61 74 61 62 61 73 65 2c 0a 20 20 20 20  L database,.    
26920 20 20 20 20 2a 2a 20 20 20 36 29 20 61 6c 6c 20      **   6) all 
26930 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 70 61  data from the pa
26940 67 65 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  ge is being read
26950 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 37  ..        **   7
26960 29 20 61 74 20 6c 65 61 73 74 20 34 20 62 79 74  ) at least 4 byt
26970 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  es have already 
26980 62 65 65 6e 20 72 65 61 64 20 69 6e 74 6f 20 74  been read into t
26990 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
269a0 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20   .        **.   
269b0 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 64 61 74       ** then dat
269c0 61 20 63 61 6e 20 62 65 20 72 65 61 64 20 64 69  a can be read di
269d0 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
269e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
269f0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
26a00 2a 20 6f 75 74 70 75 74 20 62 75 66 66 65 72 2c  * output buffer,
26a10 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 70   bypassing the p
26a20 61 67 65 2d 63 61 63 68 65 20 61 6c 74 6f 67 65  age-cache altoge
26a30 74 68 65 72 2e 20 54 68 69 73 20 73 70 65 65 64  ther. This speed
26a40 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 70 20  s.        ** up 
26a50 6c 6f 61 64 69 6e 67 20 6c 61 72 67 65 20 72 65  loading large re
26a60 63 6f 72 64 73 20 74 68 61 74 20 73 70 61 6e 20  cords that span 
26a70 6d 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61  many overflow pa
26a80 67 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ges..        */.
26a90 20 20 20 20 20 20 20 20 69 66 28 20 28 65 4f 70          if( (eOp
26aa0 26 30 78 30 31 29 3d 3d 30 20 20 20 20 20 20 20  &0x01)==0       
26ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ad0 2a 20 28 31 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (1) */.       
26ae0 20 20 26 26 20 6f 66 66 73 65 74 3d 3d 30 20 20    && offset==0  
26af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b10 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29 20 2a          /* (2) *
26b20 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 62  /.         && (b
26b30 45 6e 64 20 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69  End || a==ovflSi
26b40 7a 65 29 20 20 20 20 20 20 20 20 20 20 20 20 20  ze)             
26b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b60 20 2f 2a 20 28 36 29 20 2a 2f 0a 20 20 20 20 20   /* (6) */.     
26b70 20 20 20 20 26 26 20 70 42 74 2d 3e 69 6e 54 72      && pBt->inTr
26b80 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
26b90 5f 52 45 41 44 20 20 20 20 20 20 20 20 20 20 20  _READ           
26ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 34 29            /* (4)
26bb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20   */.         && 
26bc0 28 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (fd = sqlite3Pag
26bd0 65 72 46 69 6c 65 28 70 42 74 2d 3e 70 50 61 67  erFile(pBt->pPag
26be0 65 72 29 29 2d 3e 70 4d 65 74 68 6f 64 73 20 20  er))->pMethods  
26bf0 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
26c00 20 20 20 20 20 20 26 26 20 70 42 74 2d 3e 70 50        && pBt->pP
26c10 61 67 65 31 2d 3e 61 44 61 74 61 5b 31 39 5d 3d  age1->aData[19]=
26c20 3d 30 78 30 31 20 20 20 20 20 20 20 20 20 20 20  =0x01           
26c30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28              /* (
26c40 35 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26  5) */.         &
26c50 26 20 26 70 42 75 66 5b 2d 34 5d 3e 3d 70 42 75  & &pBuf[-4]>=pBu
26c60 66 53 74 61 72 74 20 20 20 20 20 20 20 20 20 20  fStart          
26c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c80 20 20 20 20 20 2f 2a 20 28 37 29 20 2a 2f 0a 20       /* (7) */. 
26c90 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
26ca0 20 20 20 20 75 38 20 61 53 61 76 65 5b 34 5d 3b      u8 aSave[4];
26cb0 0a 20 20 20 20 20 20 20 20 20 20 75 38 20 2a 61  .          u8 *a
26cc0 57 72 69 74 65 20 3d 20 26 70 42 75 66 5b 2d 34  Write = &pBuf[-4
26cd0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
26ce0 65 72 74 28 20 61 57 72 69 74 65 3e 3d 70 42 75  ert( aWrite>=pBu
26cf0 66 53 74 61 72 74 20 29 3b 20 20 20 20 20 20 20  fStart );       
26d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d10 20 20 2f 2a 20 68 65 6e 63 65 20 28 37 29 20 2a    /* hence (7) *
26d20 2f 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  /.          memc
26d30 70 79 28 61 53 61 76 65 2c 20 61 57 72 69 74 65  py(aSave, aWrite
26d40 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 4);.          
26d50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
26d60 61 64 28 66 64 2c 20 61 57 72 69 74 65 2c 20 61  ad(fd, aWrite, a
26d70 2b 34 2c 20 28 69 36 34 29 70 42 74 2d 3e 70 61  +4, (i64)pBt->pa
26d80 67 65 53 69 7a 65 2a 28 6e 65 78 74 50 61 67 65  geSize*(nextPage
26d90 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  -1));.          
26da0 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
26db0 79 74 65 28 61 57 72 69 74 65 29 3b 0a 20 20 20  yte(aWrite);.   
26dc0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 57         memcpy(aW
26dd0 72 69 74 65 2c 20 61 53 61 76 65 2c 20 34 29 3b  rite, aSave, 4);
26de0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
26df0 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 7b  endif..        {
26e00 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61 67  .          DbPag
26e10 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
26e20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26e30 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
26e40 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65  pPager, nextPage
26e50 2c 20 26 70 44 62 50 61 67 65 2c 0a 20 20 20 20  , &pDbPage,.    
26e60 20 20 20 20 20 20 20 20 20 20 28 28 65 4f 70 26            ((eOp&
26e70 30 78 30 31 29 3d 3d 30 20 3f 20 50 41 47 45 52  0x01)==0 ? PAGER
26e80 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  _GET_READONLY : 
26e90 30 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  0).          );.
26ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26eb0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26ec0 20 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c             aPayl
26ed0 6f 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67  oad = sqlite3Pag
26ee0 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67  erGetData(pDbPag
26ef0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
26f00 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62  nextPage = get4b
26f10 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20  yte(aPayload);. 
26f20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
26f30 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
26f40 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c  yload[offset+4],
26f50 20 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 26 30   pBuf, a, (eOp&0
26f60 78 30 31 29 2c 20 70 44 62 50 61 67 65 29 3b 0a  x01), pDbPage);.
26f70 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26f80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
26f90 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
26fa0 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a      offset = 0;.
26fb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
26fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 6d      }.        am
26fd0 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  t -= a;.        
26fe0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
26ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
27000 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27010 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20  K && amt>0 ){.  
27020 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27030 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
27040 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
27050 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
27060 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73  t of the key ass
27070 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72  ociated with cur
27080 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63 74  sor pCur.  Exact
27090 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65  ly.** "amt" byte
270a0 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66  s will be transf
270b0 65 72 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  erred into pBuf[
270c0 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
270d0 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
270e0 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 54 68  ffset"..**.** Th
270f0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
27100 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
27110 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20  s pointing to a 
27120 76 61 6c 69 64 20 72 6f 77 0a 2a 2a 20 69 6e 20  valid row.** in 
27130 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  the table..**.**
27140 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
27150 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
27160 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
27170 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a   anything goes.*
27180 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72  * wrong.  An err
27190 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  or is returned i
271a0 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69  f "offset+amt" i
271b0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a  s larger than.**
271c0 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70   the available p
271d0 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73  ayload..*/.int s
271e0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28 42  qlite3BtreeKey(B
271f0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
27200 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
27210 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
27220 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
27230 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
27240 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
27250 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
27260 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61  SOR_VALID );.  a
27270 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
27280 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61  ge>=0 && pCur->a
27290 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
272a0 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  e] );.  assert( 
272b0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
272c0 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61  ->iPage]<pCur->a
272d0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
272e0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 72  e]->nCell );.  r
272f0 65 74 75 72 6e 20 61 63 63 65 73 73 50 61 79 6c  eturn accessPayl
27300 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
27310 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
27320 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 29 3b   char*)pBuf, 0);
27330 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
27340 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
27350 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
27360 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
27370 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
27380 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
27390 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
273a0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
273b0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
273c0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
273d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
273e0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
273f0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
27400 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
27410 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
27420 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
27430 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
27440 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
27450 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
27460 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
27470 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
27480 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
27490 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
274a0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
274b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
274c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
274d0 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
274e0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
274f0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
27500 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
27510 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
27520 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
27530 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
27540 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
27550 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
27560 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
27570 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27580 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
27590 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
275a0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
275b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
275c0 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
275d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
275e0 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
275f0 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
27600 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
27610 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
27620 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
27630 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
27640 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
27650 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
27660 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
27670 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27680 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
27690 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
276a0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
276b0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
276c0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
276d0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
276e0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
276f0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
27700 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
27710 66 20 69 6e 64 65 78 20 62 74 72 65 65 73 20 28  f index btrees (
27720 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30  pPage->intKey==0
27730 29 20 61 6e 64 20 69 73 20 74 68 65 20 64 61 74  ) and is the dat
27740 61 20 66 6f 72 0a 2a 2a 20 74 61 62 6c 65 20 62  a for.** table b
27750 74 72 65 65 73 20 28 70 50 61 67 65 2d 3e 69 6e  trees (pPage->in
27760 74 4b 65 79 3d 3d 31 29 2e 20 54 68 65 20 6e 75  tKey==1). The nu
27770 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
27780 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 6b 65   available.** ke
27790 79 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65  y/data is writte
277a0 6e 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  n into *pAmt.  I
277b0 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
277c0 20 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 72 65   the value.** re
277d0 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20  turned will not 
277e0 62 65 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  be a valid point
277f0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
27800 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
27810 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
27820 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
27830 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
27840 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
27850 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
27860 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
27870 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
27880 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
27890 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
278a0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
278b0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
278c0 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
278d0 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
278e0 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
278f0 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
27900 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
27910 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
27920 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
27930 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
27940 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
27950 65 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  e.** the key/dat
27960 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
27970 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
27980 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
27990 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
279a0 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
279b0 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
279c0 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
279d0 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
279e0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
279f0 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
27a00 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
27a10 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
27a20 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
27a30 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
27a40 74 69 63 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  tic const void *
27a50 66 65 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20  fetchPayload(.  
27a60 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
27a70 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70       /* Cursor p
27a80 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79  ointing to entry
27a90 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
27aa0 0a 20 20 75 33 32 20 2a 70 41 6d 74 20 20 20 20  .  u32 *pAmt    
27ab0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
27ac0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   the number of a
27ad0 76 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68  vailable bytes h
27ae0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  ere */.){.  u32 
27af0 61 6d 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70  amt;.  assert( p
27b00 43 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  Cur!=0 && pCur->
27b10 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
27b20 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
27b30 50 61 67 65 5d 29 3b 0a 20 20 61 73 73 65 72 74  Page]);.  assert
27b40 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
27b50 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
27b60 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
27b70 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
27b80 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
27b90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
27ba0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
27bb0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
27bc0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27bd0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27be0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27bf0 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27c00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27c10 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3e 30  ur->info.nSize>0
27c20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27c30 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27c40 64 3e 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d>pCur->apPage[p
27c50 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27c60 74 61 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  ta || CORRUPT_DB
27c70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
27c80 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61  ur->info.pPayloa
27c90 64 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  d<pCur->apPage[p
27ca0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44 61  Cur->iPage]->aDa
27cb0 74 61 45 6e 64 20 7c 7c 43 4f 52 52 55 50 54 5f  taEnd ||CORRUPT_
27cc0 44 42 29 3b 0a 20 20 61 6d 74 20 3d 20 28 69 6e  DB);.  amt = (in
27cd0 74 29 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t)(pCur->apPage[
27ce0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 61 44  pCur->iPage]->aD
27cf0 61 74 61 45 6e 64 20 2d 20 70 43 75 72 2d 3e 69  ataEnd - pCur->i
27d00 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 29 3b 0a 20  nfo.pPayload);. 
27d10 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
27d20 6e 4c 6f 63 61 6c 3c 61 6d 74 20 29 20 61 6d 74  nLocal<amt ) amt
27d30 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
27d40 6f 63 61 6c 3b 0a 20 20 2a 70 41 6d 74 20 3d 20  ocal;.  *pAmt = 
27d50 61 6d 74 3b 0a 20 20 72 65 74 75 72 6e 20 28 76  amt;.  return (v
27d60 6f 69 64 2a 29 70 43 75 72 2d 3e 69 6e 66 6f 2e  oid*)pCur->info.
27d70 70 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a  pPayload;.}.../*
27d80 0a 2a 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72  .** For the entr
27d90 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  y that cursor pC
27da0 75 72 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20  ur is point to, 
27db0 72 65 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e  return as.** man
27dc0 79 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b  y bytes of the k
27dd0 65 79 20 6f 72 20 64 61 74 61 20 61 73 20 61 72  ey or data as ar
27de0 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  e available on t
27df0 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72  he local.** b-tr
27e00 65 65 20 70 61 67 65 2e 20 20 57 72 69 74 65 20  ee page.  Write 
27e10 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  the number of av
27e20 61 69 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e  ailable bytes in
27e30 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20  to *pAmt..**.** 
27e40 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
27e50 72 6e 65 64 20 69 73 20 65 70 68 65 6d 65 72 61  rned is ephemera
27e60 6c 2e 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61  l.  The key/data
27e70 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20   may move.** or 
27e80 62 65 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20  be destroyed on 
27e90 74 68 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f  the next call to
27ea0 20 61 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69   any Btree routi
27eb0 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67  ne,.** including
27ec0 20 63 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65   calls from othe
27ed0 72 20 74 68 72 65 61 64 73 20 61 67 61 69 6e 73  r threads agains
27ee0 74 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  t the same cache
27ef0 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75  ..** Hence, a mu
27f00 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
27f10 72 65 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65  red should be he
27f20 6c 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c  ld prior to call
27f30 69 6e 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ing.** this rout
27f40 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ine..**.** These
27f50 20 72 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65   routines is use
27f60 64 20 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61  d to get quick a
27f70 63 63 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64  ccess to key and
27f80 20 64 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20   data.** in the 
27f90 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
27fa0 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  e no overflow pa
27fb0 67 65 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f  ges are used..*/
27fc0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
27fd0 69 74 65 33 42 74 72 65 65 4b 65 79 46 65 74 63  ite3BtreeKeyFetc
27fe0 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  h(BtCursor *pCur
27ff0 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b 0a 20 20  , u32 *pAmt){.  
28000 72 65 74 75 72 6e 20 66 65 74 63 68 50 61 79 6c  return fetchPayl
28010 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 29 3b  oad(pCur, pAmt);
28020 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
28030 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
28040 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
28050 43 75 72 2c 20 75 33 32 20 2a 70 41 6d 74 29 7b  Cur, u32 *pAmt){
28060 0a 20 20 72 65 74 75 72 6e 20 66 65 74 63 68 50  .  return fetchP
28070 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d  ayload(pCur, pAm
28080 74 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  t);.}.../*.** Mo
28090 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f  ve the cursor do
280a0 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c  wn to a new chil
280b0 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77  d page.  The new
280c0 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73  Pgno argument is
280d0 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d   the.** page num
280e0 62 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64  ber of the child
280f0 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f   page to move to
28100 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
28110 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  ction returns SQ
28120 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
28130 74 68 65 20 70 61 67 65 2d 68 65 61 64 65 72 20  the page-header 
28140 66 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 0a 2a  flags field of.*
28150 2a 20 74 68 65 20 6e 65 77 20 63 68 69 6c 64 20  * the new child 
28160 70 61 67 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  page does not ma
28170 74 63 68 20 74 68 65 20 66 6c 61 67 73 20 66 69  tch the flags fi
28180 65 6c 64 20 6f 66 20 74 68 65 20 70 61 72 65 6e  eld of the paren
28190 74 20 28 69 2e 65 2e 0a 2a 2a 20 69 66 20 61 6e  t (i.e..** if an
281a0 20 69 6e 74 6b 65 79 20 70 61 67 65 20 61 70 70   intkey page app
281b0 65 61 72 73 20 74 6f 20 62 65 20 74 68 65 20 70  ears to be the p
281c0 61 72 65 6e 74 20 6f 66 20 61 20 6e 6f 6e 2d 69  arent of a non-i
281d0 6e 74 6b 65 79 20 70 61 67 65 2c 20 6f 72 0a 2a  ntkey page, or.*
281e0 2a 20 76 69 63 65 2d 76 65 72 73 61 29 2e 0a 2a  * vice-versa)..*
281f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
28200 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f  eToChild(BtCurso
28210 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77  r *pCur, u32 new
28220 50 67 6e 6f 29 7b 0a 20 20 42 74 53 68 61 72 65  Pgno){.  BtShare
28230 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
28240 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
28250 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
28260 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28270 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28280 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28290 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
282a0 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52 5f  >iPage<BTCURSOR_
282b0 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20 61  MAX_DEPTH );.  a
282c0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61  ssert( pCur->iPa
282d0 67 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ge>=0 );.  if( p
282e0 43 75 72 2d 3e 69 50 61 67 65 3e 3d 28 42 54 43  Cur->iPage>=(BTC
282f0 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 2d  URSOR_MAX_DEPTH-
28300 31 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  1) ){.    return
28310 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
28320 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 70 43 75 72  BKPT;.  }.  pCur
28330 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
28340 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
28350 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
28360 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
28370 64 4f 76 66 6c 29 3b 0a 20 20 70 43 75 72 2d 3e  dOvfl);.  pCur->
28380 69 50 61 67 65 2b 2b 3b 0a 20 20 70 43 75 72 2d  iPage++;.  pCur-
28390 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
283a0 67 65 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge] = 0;.  retur
283b0 6e 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  n getAndInitPage
283c0 28 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26  (pBt, newPgno, &
283d0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
283e0 72 2d 3e 69 50 61 67 65 5d 2c 0a 20 20 20 20 20  r->iPage],.     
283f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28400 20 20 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 63     pCur, pCur->c
28410 75 72 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 7d  urPagerFlags);.}
28420 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42  ..#if SQLITE_DEB
28430 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
28440 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
28450 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
28460 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
28470 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
28480 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
28490 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
284a0 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
284b0 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
284c0 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
284d0 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
284e0 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
284f0 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
28500 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
28510 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
28520 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
28530 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
28540 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
28550 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
28560 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
28570 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
28580 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
28590 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
285a0 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
285b0 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
285c0 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 65 73 74   conditions test
285d0 65 64 20 62 65 6c 6f 77 20 6d 69 67 68 74 20 6e  ed below might n
285e0 6f 74 20 62 65 20 74 72 75 65 0a 20 20 20 20 20  ot be true.     
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 20 63         ** in a c
28610 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
28620 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 49 64  */.  assert( iId
28630 78 3c 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  x<=pParent->nCel
28640 6c 20 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d  l );.  if( iIdx=
28650 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
28660 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  ){.    assert( g
28670 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74  et4byte(&pParent
28680 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
28690 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d  >hdrOffset+8])==
286a0 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73  iChild );.  }els
286b0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 67  e{.    assert( g
286c0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
286d0 28 70 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29  (pParent, iIdx))
286e0 3d 3d 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a  ==iChild );.  }.
286f0 7d 0a 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  }.#else.#  defin
28700 65 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  e assertParentIn
28710 64 65 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64  dex(x,y,z) .#end
28720 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  if../*.** Move t
28730 68 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20  he cursor up to 
28740 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
28750 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78  .**.** pCur->idx
28760 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
28770 65 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63  ell index that c
28780 6f 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e  ontains the poin
28790 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61  ter.** to the pa
287a0 67 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67  ge we are coming
287b0 20 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72   from.  If we ar
287c0 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68  e coming from th
287d0 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20  e.** right-most 
287e0 63 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20  child page then 
287f0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
28800 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61   to one more tha
28810 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74  n.** the largest
28820 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a   cell index..*/.
28830 73 74 61 74 69 63 20 76 6f 69 64 20 6d 6f 76 65  static void move
28840 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
28850 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
28860 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
28870 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
28880 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
28890 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
288a0 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
288b0 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
288c0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
288d0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
288e0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
288f0 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
28900 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
28910 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
28920 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
28930 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
28940 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
28950 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
28960 67 6e 6f 0a 20 20 29 3b 0a 20 20 74 65 73 74 63  gno.  );.  testc
28970 61 73 65 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ase( pCur->aiIdx
28980 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 20  [pCur->iPage-1] 
28990 3e 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  > pCur->apPage[p
289a0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2d 3e 6e  Cur->iPage-1]->n
289b0 43 65 6c 6c 20 29 3b 0a 20 20 70 43 75 72 2d 3e  Cell );.  pCur->
289c0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
289d0 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73    pCur->curFlags
289e0 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c 69 64   &= ~(BTCF_Valid
289f0 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
28a00 76 66 6c 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  vfl);.  releaseP
28a10 61 67 65 4e 6f 74 4e 75 6c 6c 28 70 43 75 72 2d  ageNotNull(pCur-
28a20 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28a30 61 67 65 2d 2d 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  age--]);.}../*.*
28a40 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
28a50 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  r to point to th
28a60 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 69  e root page of i
28a70 74 73 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ts b-tree struct
28a80 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ure..**.** If th
28a90 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 76 69  e table has a vi
28aa0 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2c  rtual root page,
28ab0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
28ac0 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 70 6f 69   is moved to poi
28ad0 6e 74 0a 2a 2a 20 74 6f 20 74 68 65 20 76 69 72  nt.** to the vir
28ae0 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
28af0 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 61 63  nstead of the ac
28b00 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20  tual root page. 
28b10 41 20 74 61 62 6c 65 20 68 61 73 20 61 0a 2a 2a  A table has a.**
28b20 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28b30 67 65 20 77 68 65 6e 20 74 68 65 20 61 63 74 75  ge when the actu
28b40 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 63 6f 6e  al root page con
28b50 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 20 61  tains no cells a
28b60 6e 64 20 61 20 0a 2a 2a 20 73 69 6e 67 6c 65 20  nd a .** single 
28b70 63 68 69 6c 64 20 70 61 67 65 2e 20 54 68 69 73  child page. This
28b80 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
28b90 20 77 69 74 68 20 74 68 65 20 74 61 62 6c 65 20   with the table 
28ba0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20 31  rooted at page 1
28bb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  ..**.** If the b
28bc0 2d 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  -tree structure 
28bd0 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 63 75  is empty, the cu
28be0 72 73 6f 72 20 73 74 61 74 65 20 69 73 20 73 65  rsor state is se
28bf0 74 20 74 6f 20 0a 2a 2a 20 43 55 52 53 4f 52 5f  t to .** CURSOR_
28c00 49 4e 56 41 4c 49 44 2e 20 4f 74 68 65 72 77 69  INVALID. Otherwi
28c10 73 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 69  se, the cursor i
28c20 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  s set to point t
28c30 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 63  o the first.** c
28c40 65 6c 6c 20 6c 6f 63 61 74 65 64 20 6f 6e 20 74  ell located on t
28c50 68 65 20 72 6f 6f 74 20 28 6f 72 20 76 69 72 74  he root (or virt
28c60 75 61 6c 20 72 6f 6f 74 29 20 70 61 67 65 20 61  ual root) page a
28c70 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 73 74  nd the cursor st
28c80 61 74 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ate.** is set to
28c90 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a   CURSOR_VALID..*
28ca0 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e  *.** If this fun
28cb0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 73 75  ction returns su
28cc0 63 63 65 73 73 66 75 6c 6c 79 2c 20 69 74 20 6d  ccessfully, it m
28cd0 61 79 20 62 65 20 61 73 73 75 6d 65 64 20 74 68  ay be assumed th
28ce0 61 74 20 74 68 65 0a 2a 2a 20 70 61 67 65 2d 68  at the.** page-h
28cf0 65 61 64 65 72 20 66 6c 61 67 73 20 69 6e 64 69  eader flags indi
28d00 63 61 74 65 20 74 68 61 74 20 74 68 65 20 5b 76  cate that the [v
28d10 69 72 74 75 61 6c 5d 20 72 6f 6f 74 2d 70 61 67  irtual] root-pag
28d20 65 20 69 73 20 74 68 65 20 65 78 70 65 63 74 65  e is the expecte
28d30 64 20 0a 2a 2a 20 6b 69 6e 64 20 6f 66 20 62 2d  d .** kind of b-
28d40 74 72 65 65 20 70 61 67 65 20 28 69 2e 65 2e 20  tree page (i.e. 
28d50 69 66 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  if when opening 
28d60 74 68 65 20 63 75 72 73 6f 72 20 74 68 65 20 63  the cursor the c
28d70 61 6c 6c 65 72 20 64 69 64 20 6e 6f 74 0a 2a 2a  aller did not.**
28d80 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49 6e   specify a KeyIn
28d90 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 65  fo structure the
28da0 20 66 6c 61 67 73 20 62 79 74 65 20 69 73 20 73   flags byte is s
28db0 65 74 20 74 6f 20 30 78 30 35 20 6f 72 20 30 78  et to 0x05 or 0x
28dc0 30 44 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  0D,.** indicatin
28dd0 67 20 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65  g a table b-tree
28de0 2c 20 6f 72 20 69 66 20 74 68 65 20 63 61 6c 6c  , or if the call
28df0 65 72 20 64 69 64 20 73 70 65 63 69 66 79 20 61  er did specify a
28e00 20 4b 65 79 49 6e 66 6f 20 0a 2a 2a 20 73 74 72   KeyInfo .** str
28e10 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67 73  ucture the flags
28e20 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f 20   byte is set to 
28e30 30 78 30 32 20 6f 72 20 30 78 30 41 2c 20 69 6e  0x02 or 0x0A, in
28e40 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 64 65  dicating an inde
28e50 78 0a 2a 2a 20 62 2d 74 72 65 65 29 2e 0a 2a 2f  x.** b-tree)..*/
28e60 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
28e70 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
28e80 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
28e90 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
28ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
28eb0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
28ec0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
28ed0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  ) );.  assert( C
28ee0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20  URSOR_INVALID < 
28ef0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
28f00 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EK );.  assert( 
28f10 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c  CURSOR_VALID   <
28f20 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
28f30 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  EEK );.  assert(
28f40 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20   CURSOR_FAULT   
28f50 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  > CURSOR_REQUIRE
28f60 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43  SEEK );.  if( pC
28f70 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  ur->eState>=CURS
28f80 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
28f90 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
28fa0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46  eState==CURSOR_F
28fb0 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20 61 73  AULT ){.      as
28fc0 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70  sert( pCur->skip
28fd0 4e 65 78 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  Next!=SQLITE_OK 
28fe0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28ff0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a  pCur->skipNext;.
29000 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29010 33 42 74 72 65 65 43 6c 65 61 72 43 75 72 73 6f  3BtreeClearCurso
29020 72 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20  r(pCur);.  }..  
29030 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
29040 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  =0 ){.    while(
29050 20 70 43 75 72 2d 3e 69 50 61 67 65 20 29 7b 0a   pCur->iPage ){.
29060 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29070 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29080 3e 69 50 61 67 65 5d 21 3d 30 20 29 3b 0a 20 20  >iPage]!=0 );.  
29090 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e      releasePageN
290a0 6f 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50  otNull(pCur->apP
290b0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
290c0 2d 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -]);.    }.  }el
290d0 73 65 20 69 66 28 20 70 43 75 72 2d 3e 70 67 6e  se if( pCur->pgn
290e0 6f 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oRoot==0 ){.    
290f0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29100 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
29110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29120 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
29130 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29140 69 50 61 67 65 3d 3d 28 2d 31 29 20 29 3b 0a 20  iPage==(-1) );. 
29150 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e     rc = getAndIn
29160 69 74 50 61 67 65 28 70 43 75 72 2d 3e 70 42 74  itPage(pCur->pBt
29170 72 65 65 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  ree->pBt, pCur->
29180 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d  pgnoRoot, &pCur-
29190 3e 61 70 50 61 67 65 5b 30 5d 2c 0a 20 20 20 20  >apPage[0],.    
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291b0 20 20 20 20 30 2c 20 70 43 75 72 2d 3e 63 75 72      0, pCur->cur
291c0 50 61 67 65 72 46 6c 61 67 73 29 3b 0a 20 20 20  PagerFlags);.   
291d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
291e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  OK ){.      pCur
291f0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29200 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
29210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29220 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  }.    pCur->iPag
29230 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
29240 3e 63 75 72 49 6e 74 4b 65 79 20 3d 20 70 43 75  >curIntKey = pCu
29250 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
29260 74 4b 65 79 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f  tKey;.  }.  pRoo
29270 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
29280 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  [0];.  assert( p
29290 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72  Root->pgno==pCur
292a0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a 0a 20  ->pgnoRoot );.. 
292b0 20 2f 2a 20 49 66 20 70 43 75 72 2d 3e 70 4b 65   /* If pCur->pKe
292c0 79 49 6e 66 6f 20 69 73 20 6e 6f 74 20 4e 55 4c  yInfo is not NUL
292d0 4c 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  L, then the call
292e0 65 72 20 74 68 61 74 20 6f 70 65 6e 65 64 20 74  er that opened t
292f0 68 69 73 20 63 75 72 73 6f 72 0a 20 20 2a 2a 20  his cursor.  ** 
29300 65 78 70 65 63 74 65 64 20 74 6f 20 6f 70 65 6e  expected to open
29310 20 69 74 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20   it on an index 
29320 62 2d 74 72 65 65 2e 20 4f 74 68 65 72 77 69 73  b-tree. Otherwis
29330 65 2c 20 69 66 20 70 4b 65 79 49 6e 66 6f 20 69  e, if pKeyInfo i
29340 73 0a 20 20 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65  s.  ** NULL, the
29350 20 63 61 6c 6c 65 72 20 65 78 70 65 63 74 73 20   caller expects 
29360 61 20 74 61 62 6c 65 20 62 2d 74 72 65 65 2e 20  a table b-tree. 
29370 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  If this is not t
29380 68 65 20 63 61 73 65 2c 0a 20 20 2a 2a 20 72 65  he case,.  ** re
29390 74 75 72 6e 20 61 6e 20 53 51 4c 49 54 45 5f 43  turn an SQLITE_C
293a0 4f 52 52 55 50 54 20 65 72 72 6f 72 2e 20 0a 20  ORRUPT error. . 
293b0 20 2a 2a 0a 20 20 2a 2a 20 45 61 72 6c 69 65 72   **.  ** Earlier
293c0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
293d0 69 74 65 20 61 73 73 75 6d 65 64 20 74 68 61 74  ite assumed that
293e0 20 74 68 69 73 20 74 65 73 74 20 63 6f 75 6c 64   this test could
293f0 20 6e 6f 74 20 66 61 69 6c 0a 20 20 2a 2a 20 69   not fail.  ** i
29400 66 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  f the root page 
29410 77 61 73 20 61 6c 72 65 61 64 79 20 6c 6f 61 64  was already load
29420 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
29430 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
29440 20 28 69 2e 65 2e 0a 20 20 2a 2a 20 69 66 20 70   (i.e..  ** if p
29450 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 29 2e 20  Cur->iPage>=0). 
29460 42 75 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  But this is not 
29470 73 6f 20 69 66 20 74 68 65 20 64 61 74 61 62 61  so if the databa
29480 73 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 20  se is corrupted 
29490 0a 20 20 2a 2a 20 69 6e 20 73 75 63 68 20 61 20  .  ** in such a 
294a0 77 61 79 20 74 68 61 74 20 70 61 67 65 20 70 52  way that page pR
294b0 6f 6f 74 20 69 73 20 6c 69 6e 6b 65 64 20 69 6e  oot is linked in
294c0 74 6f 20 61 20 73 65 63 6f 6e 64 20 62 2d 74 72  to a second b-tr
294d0 65 65 20 74 61 62 6c 65 20 0a 20 20 2a 2a 20 28  ee table .  ** (
294e0 6f 72 20 74 68 65 20 66 72 65 65 6c 69 73 74 29  or the freelist)
294f0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
29500 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 31  pRoot->intKey==1
29510 20 7c 7c 20 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65   || pRoot->intKe
29520 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 52  y==0 );.  if( pR
29530 6f 6f 74 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 7c  oot->isInit==0 |
29540 7c 20 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  | (pCur->pKeyInf
29550 6f 3d 3d 30 29 21 3d 70 52 6f 6f 74 2d 3e 69 6e  o==0)!=pRoot->in
29560 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75  tKey ){.    retu
29570 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
29580 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 70  T_BKPT;.  }..  p
29590 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d 20  Cur->aiIdx[0] = 
295a0 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  0;.  pCur->info.
295b0 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
295c0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
295d0 28 42 54 43 46 5f 41 74 4c 61 73 74 7c 42 54 43  (BTCF_AtLast|BTC
295e0 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46  F_ValidNKey|BTCF
295f0 5f 56 61 6c 69 64 4f 76 66 6c 29 3b 0a 0a 20 20  _ValidOvfl);..  
29600 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c  if( pRoot->nCell
29610 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
29620 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29630 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73 65 20 69  VALID;.  }else i
29640 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20  f( !pRoot->leaf 
29650 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70  ){.    Pgno subp
29660 61 67 65 3b 0a 20 20 20 20 69 66 28 20 70 52 6f  age;.    if( pRo
29670 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29 20 72 65  ot->pgno!=1 ) re
29680 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
29690 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 73 75  UPT_BKPT;.    su
296a0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
296b0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
296c0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
296d0 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  8]);.    pCur->e
296e0 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
296f0 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
29700 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
29710 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
29720 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
29730 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
29740 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20 72 65 74  VALID;.  }.  ret
29750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
29760 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
29770 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
29780 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
29790 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
297a0 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
297b0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
297c0 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
297d0 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
297e0 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
297f0 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
29800 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
29810 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
29820 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
29830 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
29840 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
29850 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
29860 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
29870 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
29880 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
29890 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
298a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
298b0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
298c0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
298d0 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
298e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
298f0 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29900 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29910 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29920 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
29930 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29940 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
29950 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
29960 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
29970 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
29980 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
29990 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
299a0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
299b0 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
299c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
299d0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
299e0 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
299f0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
29a00 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
29a10 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
29a20 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
29a30 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
29a40 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
29a50 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
29a60 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
29a70 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
29a80 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
29a90 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29aa0 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
29ab0 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
29ac0 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
29ad0 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
29ae0 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
29af0 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
29b00 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
29b10 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
29b20 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
29b30 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
29b40 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
29b50 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
29b60 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
29b70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29b80 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
29b90 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
29ba0 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
29bb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
29bc0 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
29bd0 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  pPage = 0;..  as
29be0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
29bf0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
29c00 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
29c10 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
29c20 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28  ALID );.  while(
29c30 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
29c40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
29c50 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
29c60 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
29c70 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
29c80 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
29c90 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d  t+8]);.    pCur-
29ca0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29cb0 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
29cc0 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
29cd0 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
29ce0 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63  gno);.    if( rc
29cf0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29d00 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  }.  pCur->aiIdx[
29d10 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70  pCur->iPage] = p
29d20 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
29d30 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
29d40 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a  nfo.nSize==0 );.
29d50 20 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d    assert( (pCur-
29d60 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
29d70 5f 56 61 6c 69 64 4e 4b 65 79 29 3d 3d 30 20 29  _ValidNKey)==0 )
29d80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29d90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
29da0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
29db0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
29dc0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
29dd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
29de0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
29df0 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
29e00 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
29e10 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
29e20 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
29e30 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
29e40 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
29e50 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
29e60 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
29e70 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
29e80 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
29e90 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
29ea0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
29eb0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
29ec0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
29ed0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
29ee0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
29ef0 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
29f00 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
29f10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29f20 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
29f30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
29f40 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
29f50 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67  assert( pCur->pg
29f60 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75  noRoot==0 || pCu
29f70 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
29f80 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30  iPage]->nCell==0
29f90 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
29fa0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
29fb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
29fc0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
29fd0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30  >iPage]->nCell>0
29fe0 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
29ff0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2a000 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70  moveToLeftmost(p
2a010 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
2a020 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2a030 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
2a040 6f 72 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  or to the last e
2a050 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
2a060 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
2a070 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
2a080 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
2a090 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
2a0a0 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
2a0b0 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
2a0c0 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
2a0d0 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
2a0e0 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
2a0f0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61  t sqlite3BtreeLa
2a100 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  st(BtCursor *pCu
2a110 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
2a120 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20 61 73 73   int rc;. .  ass
2a130 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
2a140 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
2a150 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2a160 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
2a170 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
2a180 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  tex) );..  /* If
2a190 20 74 68 65 20 63 75 72 73 6f 72 20 61 6c 72 65   the cursor alre
2a1a0 61 64 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ady points to th
2a1b0 65 20 6c 61 73 74 20 65 6e 74 72 79 2c 20 74 68  e last entry, th
2a1c0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  is is a no-op. *
2a1d0 2f 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 56  /.  if( CURSOR_V
2a1e0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
2a1f0 74 65 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  te && (pCur->cur
2a200 46 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c  Flags & BTCF_AtL
2a210 61 73 74 29 21 3d 30 20 29 7b 0a 23 69 66 64 65  ast)!=0 ){.#ifde
2a220 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
2a230 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b     /* This block
2a240 20 73 65 72 76 65 73 20 74 6f 20 61 73 73 65 72   serves to asser
2a250 74 28 29 20 74 68 61 74 20 74 68 65 20 63 75 72  t() that the cur
2a260 73 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 20  sor really does 
2a270 70 6f 69 6e 74 20 0a 20 20 20 20 2a 2a 20 74 6f  point .    ** to
2a280 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
2a290 69 6e 20 74 68 65 20 62 2d 74 72 65 65 2e 20 2a  in the b-tree. *
2a2a0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  /.    int ii;.  
2a2b0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
2a2c0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 69 2b 2b  Cur->iPage; ii++
2a2d0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a2e0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 69 5d   pCur->aiIdx[ii]
2a2f0 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69  ==pCur->apPage[i
2a300 69 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  i]->nCell );.   
2a310 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
2a320 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2a330 3e 69 50 61 67 65 5d 3d 3d 70 43 75 72 2d 3e 61  >iPage]==pCur->a
2a340 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2a350 65 5d 2d 3e 6e 43 65 6c 6c 2d 31 20 29 3b 0a 20  e]->nCell-1 );. 
2a360 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2a370 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a380 61 67 65 5d 2d 3e 6c 65 61 66 20 29 3b 0a 23 65  age]->leaf );.#e
2a390 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
2a3a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
2a3b0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
2a3c0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
2a3d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2a3e0 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49      if( CURSOR_I
2a3f0 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  NVALID==pCur->eS
2a400 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73  tate ){.      as
2a410 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2a420 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2a430 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2a440 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  age]->nCell==0 )
2a450 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
2a460 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2a470 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a480 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2a490 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20  _VALID );.      
2a4a0 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20  *pRes = 0;.     
2a4b0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2a4c0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
2a4d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2a4e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a4f0 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 7c  pCur->curFlags |
2a500 3d 20 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20  = BTCF_AtLast;. 
2a510 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a520 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
2a530 67 73 20 26 3d 20 7e 42 54 43 46 5f 41 74 4c 61  gs &= ~BTCF_AtLa
2a540 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0a  st;.      }.   .
2a550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2a560 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76  rn rc;.}../* Mov
2a570 65 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20  e the cursor so 
2a580 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
2a590 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61 72 20  o an entry near 
2a5a0 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70 65 63  the key .** spec
2a5b0 69 66 69 65 64 20 62 79 20 70 49 64 78 4b 65 79  ified by pIdxKey
2a5c0 20 6f 72 20 69 6e 74 4b 65 79 2e 20 20 20 52 65   or intKey.   Re
2a5d0 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63  turn a success c
2a5e0 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49  ode..**.** For I
2a5f0 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 74 68  NTKEY tables, th
2a600 65 20 69 6e 74 4b 65 79 20 70 61 72 61 6d 65 74  e intKey paramet
2a610 65 72 20 69 73 20 75 73 65 64 2e 20 20 70 49 64  er is used.  pId
2a620 78 4b 65 79 20 0a 2a 2a 20 6d 75 73 74 20 62 65  xKey .** must be
2a630 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
2a640 78 20 74 61 62 6c 65 73 2c 20 70 49 64 78 4b 65  x tables, pIdxKe
2a650 79 20 69 73 20 75 73 65 64 20 61 6e 64 20 69 6e  y is used and in
2a660 74 4b 65 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  tKey.** is ignor
2a670 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
2a680 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e  exact match is n
2a690 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
2a6a0 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77  he cursor is alw
2a6b0 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e  ays.** left poin
2a6c0 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70  ting at a leaf p
2a6d0 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  age which would 
2a6e0 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69  hold the entry i
2a6f0 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65  f it.** were pre
2a700 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f  sent.  The curso
2a710 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  r might point to
2a720 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63   an entry that c
2a730 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f  omes.** before o
2a740 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e  r after the key.
2a750 0a 2a 2a 0a 2a 2a 20 41 6e 20 69 6e 74 65 67 65  .**.** An intege
2a760 72 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  r is written int
2a770 6f 20 2a 70 52 65 73 20 77 68 69 63 68 20 69 73  o *pRes which is
2a780 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a   the result of.*
2a790 2a 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20  * comparing the 
2a7a0 6b 65 79 20 77 69 74 68 20 74 68 65 20 65 6e 74  key with the ent
2a7b0 72 79 20 74 6f 20 77 68 69 63 68 20 74 68 65 20  ry to which the 
2a7c0 63 75 72 73 6f 72 20 69 73 20 0a 2a 2a 20 70 6f  cursor is .** po
2a7d0 69 6e 74 69 6e 67 2e 20 20 54 68 65 20 6d 65 61  inting.  The mea
2a7e0 6e 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 74 65  ning of the inte
2a7f0 67 65 72 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  ger written into
2a800 0a 2a 2a 20 2a 70 52 65 73 20 69 73 20 61 73 20  .** *pRes is as 
2a810 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2a820 20 20 20 2a 70 52 65 73 3c 30 20 20 20 20 20 20     *pRes<0      
2a830 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
2a840 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
2a850 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
2a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a870 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
2a880 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 20   intKey/pIdxKey 
2a890 6f 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20  or if the table 
2a8a0 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20  is empty.**     
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
2a8c0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74   the cursor is t
2a8d0 68 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f  herefore left po
2a8e0 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a  int to nothing..
2a8f0 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d  **.**     *pRes=
2a900 3d 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  =0     The curso
2a910 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
2a920 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
2a930 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
2a940 20 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20          exactly 
2a950 6d 61 74 63 68 65 73 20 69 6e 74 4b 65 79 2f 70  matches intKey/p
2a960 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20  IdxKey..**.**   
2a970 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54    *pRes>0      T
2a980 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66  he cursor is lef
2a990 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
2a9a0 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20   entry that.**  
2a9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9c0 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
2a9d0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
2a9e0 2a 0a 2a 2a 20 46 6f 72 20 69 6e 64 65 78 20 74  *.** For index t
2a9f0 61 62 6c 65 73 2c 20 74 68 65 20 70 49 64 78 4b  ables, the pIdxK
2aa00 65 79 2d 3e 65 71 53 65 65 6e 20 66 69 65 6c 64  ey->eqSeen field
2aa10 20 69 73 20 73 65 74 20 74 6f 20 31 20 69 66 20   is set to 1 if 
2aa20 74 68 65 72 65 0a 2a 2a 20 65 78 69 73 74 73 20  there.** exists 
2aa30 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
2aa40 74 61 62 6c 65 20 74 68 61 74 20 65 78 61 63 74  table that exact
2aa50 6c 79 20 6d 61 74 63 68 65 73 20 70 49 64 78 4b  ly matches pIdxK
2aa60 65 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ey.  .*/.int sql
2aa70 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
2aa80 6e 70 61 63 6b 65 64 28 0a 20 20 42 74 43 75 72  npacked(.  BtCur
2aa90 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
2aaa0 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
2aab0 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f  r to be moved */
2aac0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
2aad0 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f 2a 20 55  d *pIdxKey, /* U
2aae0 6e 70 61 63 6b 65 64 20 69 6e 64 65 78 20 6b 65  npacked index ke
2aaf0 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e 74 4b 65  y */.  i64 intKe
2ab00 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
2ab10 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 6b 65 79  /* The table key
2ab20 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
2ab30 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ght,           /
2ab40 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
2ab50 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
2ab60 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
2ab70 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
2ab80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2ab90 65 20 73 65 61 72 63 68 20 72 65 73 75 6c 74 73  e search results
2aba0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
2abb0 74 20 72 63 3b 0a 20 20 52 65 63 6f 72 64 43 6f  t rc;.  RecordCo
2abc0 6d 70 61 72 65 20 78 52 65 63 6f 72 64 43 6f 6d  mpare xRecordCom
2abd0 70 61 72 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  pare;..  assert(
2abe0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2abf0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2ac00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
2ac10 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
2ac20 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
2ac30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2ac40 65 73 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  es );.  assert( 
2ac50 28 70 49 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70  (pIdxKey==0)==(p
2ac60 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30  Cur->pKeyInfo==0
2ac70 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
2ac80 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
2ac90 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61  ady positioned a
2aca0 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61  t the point we a
2acb0 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74  re trying.  ** t
2acc0 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20  o move to, then 
2acd0 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69 74 68  just return with
2ace0 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f  out doing any wo
2acf0 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72  rk */.  if( pCur
2ad00 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
2ad10 5f 56 41 4c 49 44 20 26 26 20 28 70 43 75 72 2d  _VALID && (pCur-
2ad20 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2ad30 5f 56 61 6c 69 64 4e 4b 65 79 29 21 3d 30 0a 20  _ValidNKey)!=0. 
2ad40 20 20 26 26 20 70 43 75 72 2d 3e 63 75 72 49 6e    && pCur->curIn
2ad50 74 4b 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69  tKey .  ){.    i
2ad60 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  f( pCur->info.nK
2ad70 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ey==intKey ){.  
2ad80 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
2ad90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2ada0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
2adb0 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75 72 46   if( (pCur->curF
2adc0 6c 61 67 73 20 26 20 42 54 43 46 5f 41 74 4c 61  lags & BTCF_AtLa
2add0 73 74 29 21 3d 30 20 26 26 20 70 43 75 72 2d 3e  st)!=0 && pCur->
2ade0 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65 79  info.nKey<intKey
2adf0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
2ae00 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75  = -1;.      retu
2ae10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2ae20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
2ae30 49 64 78 4b 65 79 20 29 7b 0a 20 20 20 20 78 52  IdxKey ){.    xR
2ae40 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20 73  ecordCompare = s
2ae50 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
2ae60 6d 70 61 72 65 28 70 49 64 78 4b 65 79 29 3b 0a  mpare(pIdxKey);.
2ae70 20 20 20 20 70 49 64 78 4b 65 79 2d 3e 65 72 72      pIdxKey->err
2ae80 43 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 61 73  Code = 0;.    as
2ae90 73 65 72 74 28 20 70 49 64 78 4b 65 79 2d 3e 64  sert( pIdxKey->d
2aea0 65 66 61 75 6c 74 5f 72 63 3d 3d 31 20 0a 20 20  efault_rc==1 .  
2aeb0 20 20 20 20 20 20 20 7c 7c 20 70 49 64 78 4b 65         || pIdxKe
2aec0 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d 30  y->default_rc==0
2aed0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49   .         || pI
2aee0 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72  dxKey->default_r
2aef0 63 3d 3d 2d 31 0a 20 20 20 20 29 3b 0a 20 20 7d  c==-1.    );.  }
2af00 65 6c 73 65 7b 0a 20 20 20 20 78 52 65 63 6f 72  else{.    xRecor
2af10 64 43 6f 6d 70 61 72 65 20 3d 20 30 3b 20 2f 2a  dCompare = 0; /*
2af20 20 41 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e   All keys are in
2af30 74 65 67 65 72 73 20 2a 2f 0a 20 20 7d 0a 0a 20  tegers */.  }.. 
2af40 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
2af50 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2af60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2af70 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2af80 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2af90 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2afa0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
2afb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
2afc0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c  r->pgnoRoot==0 |
2afd0 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  | pCur->apPage[p
2afe0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73 49  Cur->iPage]->isI
2aff0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
2b000 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2b010 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
2b020 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2b030 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c  ur->iPage]->nCel
2b040 6c 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 43 75  l>0 );.  if( pCu
2b050 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2b060 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20  R_INVALID ){.   
2b070 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20   *pRes = -1;.   
2b080 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
2b090 67 6e 6f 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43  gnoRoot==0 || pC
2b0a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2b0b0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
2b0c0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
2b0d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
2b0e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
2b0f0 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2b100 3d 3d 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65  ==pCur->curIntKe
2b110 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  y );.  assert( p
2b120 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20 7c  Cur->curIntKey |
2b130 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
2b140 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
2b150 6c 77 72 2c 20 75 70 72 2c 20 69 64 78 2c 20 63  lwr, upr, idx, c
2b160 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50  ;.    Pgno chldP
2b170 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  g;.    MemPage *
2b180 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
2b190 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2b1a0 5d 3b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ];.    u8 *pCell
2b1b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b1c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
2b1d0 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2b1e0 20 63 65 6c 6c 20 69 6e 20 70 50 61 67 65 20 2a   cell in pPage *
2b1f0 2f 0a 0a 20 20 20 20 2f 2a 20 70 50 61 67 65 2d  /..    /* pPage-
2b200 3e 6e 43 65 6c 6c 20 6d 75 73 74 20 62 65 20 67  >nCell must be g
2b210 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
2b220 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
2b230 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a   root-page.    *
2b240 2a 20 74 68 65 20 63 75 72 73 6f 72 20 77 6f 75  * the cursor wou
2b250 6c 64 20 68 61 76 65 20 62 65 65 6e 20 49 4e 56  ld have been INV
2b260 41 4c 49 44 20 61 62 6f 76 65 20 61 6e 64 20 74  ALID above and t
2b270 68 69 73 20 66 6f 72 28 3b 3b 29 20 6c 6f 6f 70  his for(;;) loop
2b280 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 72 75 6e 2e  .    ** not run.
2b290 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
2b2a0 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 2c 20 74  the root-page, t
2b2b0 68 65 6e 20 74 68 65 20 6d 6f 76 65 54 6f 43 68  hen the moveToCh
2b2c0 69 6c 64 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  ild() routine.  
2b2d0 20 20 2a 2a 20 77 6f 75 6c 64 20 68 61 76 65 20    ** would have 
2b2e0 61 6c 72 65 61 64 79 20 64 65 74 65 63 74 65 64  already detected
2b2f0 20 64 62 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20   db corruption. 
2b300 53 69 6d 69 6c 61 72 6c 79 2c 20 70 50 61 67 65  Similarly, pPage
2b310 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
2b320 74 68 65 20 72 69 67 68 74 20 6b 69 6e 64 20 28  the right kind (
2b330 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 29 20  index or table) 
2b340 6f 66 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  of b-tree page. 
2b350 4f 74 68 65 72 77 69 73 65 0a 20 20 20 20 2a 2a  Otherwise.    **
2b360 20 61 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 29   a moveToChild()
2b370 20 6f 72 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 29   or moveToRoot()
2b380 20 63 61 6c 6c 20 77 6f 75 6c 64 20 68 61 76 65   call would have
2b390 20 64 65 74 65 63 74 65 64 20 63 6f 72 72 75 70   detected corrup
2b3a0 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 61 73  tion.  */.    as
2b3b0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2b3c0 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  ll>0 );.    asse
2b3d0 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  rt( pPage->intKe
2b3e0 79 3d 3d 28 70 49 64 78 4b 65 79 3d 3d 30 29 20  y==(pIdxKey==0) 
2b3f0 29 3b 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a  );.    lwr = 0;.
2b400 20 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d      upr = pPage-
2b410 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 61 73  >nCell-1;.    as
2b420 73 65 72 74 28 20 62 69 61 73 52 69 67 68 74 3d  sert( biasRight=
2b430 3d 30 20 7c 7c 20 62 69 61 73 52 69 67 68 74 3d  =0 || biasRight=
2b440 3d 31 20 29 3b 0a 20 20 20 20 69 64 78 20 3d 20  =1 );.    idx = 
2b450 75 70 72 3e 3e 28 31 2d 62 69 61 73 52 69 67 68  upr>>(1-biasRigh
2b460 74 29 3b 20 2f 2a 20 69 64 78 20 3d 20 62 69 61  t); /* idx = bia
2b470 73 52 69 67 68 74 20 3f 20 75 70 72 20 3a 20 28  sRight ? upr : (
2b480 6c 77 72 2b 75 70 72 29 2f 32 3b 20 2a 2f 0a 20  lwr+upr)/2; */. 
2b490 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2b4a0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75  Cur->iPage] = (u
2b4b0 31 36 29 69 64 78 3b 0a 20 20 20 20 69 66 28 20  16)idx;.    if( 
2b4c0 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3d 3d  xRecordCompare==
2b4d0 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 3b  0 ){.      for(;
2b4e0 3b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ;){.        i64 
2b4f0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
2b500 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65    pCell = findCe
2b510 6c 6c 50 61 73 74 50 74 72 28 70 50 61 67 65 2c  llPastPtr(pPage,
2b520 20 69 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69   idx);.        i
2b530 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
2b540 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
2b550 20 20 77 68 69 6c 65 28 20 30 78 38 30 20 3c 3d    while( 0x80 <=
2b560 20 2a 28 70 43 65 6c 6c 2b 2b 29 20 29 7b 0a 20   *(pCell++) ){. 
2b570 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
2b580 43 65 6c 6c 3e 3d 70 50 61 67 65 2d 3e 61 44 61  Cell>=pPage->aDa
2b590 74 61 45 6e 64 20 29 20 72 65 74 75 72 6e 20 53  taEnd ) return S
2b5a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2b5b0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
2b5c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b5d0 20 20 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c    getVarint(pCel
2b5e0 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b  l, (u64*)&nCellK
2b5f0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ey);.        if(
2b600 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74 4b 65 79   nCellKey<intKey
2b610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2b620 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2b630 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72       if( lwr>upr
2b640 20 29 7b 20 63 20 3d 20 2d 31 3b 20 62 72 65 61   ){ c = -1; brea
2b650 6b 3b 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c  k; }.        }el
2b660 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3e  se if( nCellKey>
2b670 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
2b680 20 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b      upr = idx-1;
2b690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c  .          if( l
2b6a0 77 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2b 31  wr>upr ){ c = +1
2b6b0 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20  ; break; }.     
2b6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b6d0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
2b6e0 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 3b 0a  lKey==intKey );.
2b6f0 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2b700 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2b710 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2b720 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
2b730 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79  .nKey = nCellKey
2b740 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72  ;.          pCur
2b750 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2b760 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b  age] = (u16)idx;
2b770 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
2b780 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2b790 20 20 20 20 20 20 20 20 20 20 20 6c 77 72 20 3d             lwr =
2b7a0 20 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20   idx;.          
2b7b0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 6e 65    goto moveto_ne
2b7c0 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20 20 20 20  xt_layer;.      
2b7d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b7e0 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30         *pRes = 0
2b7f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
2b800 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2b810 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2b820 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
2b830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b840 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2b850 72 74 28 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29  rt( lwr+upr>=0 )
2b860 3b 0a 20 20 20 20 20 20 20 20 69 64 78 20 3d 20  ;.        idx = 
2b870 28 6c 77 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f  (lwr+upr)>>1;  /
2b880 2a 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72  * idx = (lwr+upr
2b890 29 2f 32 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  )/2; */.      }.
2b8a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b8b0 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20   for(;;){.      
2b8c0 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a    int nCell;  /*
2b8d0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 43 65   Size of the pCe
2b8e0 6c 6c 20 63 65 6c 6c 20 69 6e 20 62 79 74 65 73  ll cell in bytes
2b8f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 43 65 6c   */.        pCel
2b900 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 50 61 73 74  l = findCellPast
2b910 50 74 72 28 70 50 61 67 65 2c 20 69 64 78 29 3b  Ptr(pPage, idx);
2b920 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
2b930 20 6d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   maximum support
2b940 65 64 20 70 61 67 65 2d 73 69 7a 65 20 69 73 20  ed page-size is 
2b950 36 35 35 33 36 20 62 79 74 65 73 2e 20 54 68 69  65536 bytes. Thi
2b960 73 20 6d 65 61 6e 73 20 74 68 61 74 0a 20 20 20  s means that.   
2b970 20 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69       ** the maxi
2b980 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
2b990 63 6f 72 64 20 62 79 74 65 73 20 73 74 6f 72 65  cord bytes store
2b9a0 64 20 6f 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d  d on an index B-
2b9b0 54 72 65 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  Tree.        ** 
2b9c0 70 61 67 65 20 69 73 20 6c 65 73 73 20 74 68 61  page is less tha
2b9d0 6e 20 31 36 33 38 34 20 62 79 74 65 73 20 61 6e  n 16384 bytes an
2b9e0 64 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64 20  d may be stored 
2b9f0 61 73 20 61 20 32 2d 62 79 74 65 0a 20 20 20 20  as a 2-byte.    
2ba00 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
2ba10 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
2ba20 69 73 20 75 73 65 64 20 74 6f 20 61 74 74 65 6d  is used to attem
2ba30 70 74 20 74 6f 20 61 76 6f 69 64 20 70 61 72 73  pt to avoid pars
2ba40 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
2ba50 74 68 65 20 65 6e 74 69 72 65 20 63 65 6c 6c 20  the entire cell 
2ba60 62 79 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  by checking for 
2ba70 74 68 65 20 63 61 73 65 73 20 77 68 65 72 65 20  the cases where 
2ba80 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 0a 20  the record is . 
2ba90 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64         ** stored
2baa0 20 65 6e 74 69 72 65 6c 79 20 77 69 74 68 69 6e   entirely within
2bab0 20 74 68 65 20 62 2d 74 72 65 65 20 70 61 67 65   the b-tree page
2bac0 20 62 79 20 69 6e 73 70 65 63 74 69 6e 67 20 74   by inspecting t
2bad0 68 65 20 66 69 72 73 74 20 0a 20 20 20 20 20 20  he first .      
2bae0 20 20 2a 2a 20 32 20 62 79 74 65 73 20 6f 66 20    ** 2 bytes of 
2baf0 74 68 65 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20  the cell..      
2bb00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6e 43 65    */.        nCe
2bb10 6c 6c 20 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20  ll = pCell[0];. 
2bb20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
2bb30 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 31 62 79 74  <=pPage->max1byt
2bb40 65 50 61 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20  ePayload ){.    
2bb50 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72        /* This br
2bb60 61 6e 63 68 20 72 75 6e 73 20 69 66 20 74 68 65  anch runs if the
2bb70 20 72 65 63 6f 72 64 2d 73 69 7a 65 20 66 69 65   record-size fie
2bb80 6c 64 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 69  ld of the cell i
2bb90 73 20 61 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  s a.          **
2bba0 20 73 69 6e 67 6c 65 20 62 79 74 65 20 76 61 72   single byte var
2bbb0 69 6e 74 20 61 6e 64 20 74 68 65 20 72 65 63 6f  int and the reco
2bbc0 72 64 20 66 69 74 73 20 65 6e 74 69 72 65 6c 79  rd fits entirely
2bbd0 20 6f 6e 20 74 68 65 20 6d 61 69 6e 0a 20 20 20   on the main.   
2bbe0 20 20 20 20 20 20 20 2a 2a 20 62 2d 74 72 65 65         ** b-tree
2bbf0 20 70 61 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20   page.  */.     
2bc00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
2bc10 43 65 6c 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50  Cell+nCell+1==pP
2bc20 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b  age->aDataEnd );
2bc30 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 78  .          c = x
2bc40 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43  RecordCompare(nC
2bc50 65 6c 6c 2c 20 28 76 6f 69 64 2a 29 26 70 43 65  ell, (void*)&pCe
2bc60 6c 6c 5b 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b  ll[1], pIdxKey);
2bc70 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
2bc80 66 28 20 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20  f( !(pCell[1] & 
2bc90 30 78 38 30 29 20 0a 20 20 20 20 20 20 20 20 20  0x80) .         
2bca0 20 26 26 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e   && (nCell = ((n
2bcb0 43 65 6c 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b  Cell&0x7f)<<7) +
2bcc0 20 70 43 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67   pCell[1])<=pPag
2bcd0 65 2d 3e 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20  e->maxLocal.    
2bce0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
2bcf0 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 2d 73   /* The record-s
2bd00 69 7a 65 20 66 69 65 6c 64 20 69 73 20 61 20 32  ize field is a 2
2bd10 20 62 79 74 65 20 76 61 72 69 6e 74 20 61 6e 64   byte varint and
2bd20 20 74 68 65 20 72 65 63 6f 72 64 20 0a 20 20 20   the record .   
2bd30 20 20 20 20 20 20 20 2a 2a 20 66 69 74 73 20 65         ** fits e
2bd40 6e 74 69 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d  ntirely on the m
2bd50 61 69 6e 20 62 2d 74 72 65 65 20 70 61 67 65 2e  ain b-tree page.
2bd60 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74    */.          t
2bd70 65 73 74 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e  estcase( pCell+n
2bd80 43 65 6c 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61  Cell+2==pPage->a
2bd90 44 61 74 61 45 6e 64 20 29 3b 0a 20 20 20 20 20  DataEnd );.     
2bda0 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2bdb0 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28  Compare(nCell, (
2bdc0 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c  void*)&pCell[2],
2bdd0 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
2bde0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bdf0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72      /* The recor
2be00 64 20 66 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74  d flows over ont
2be10 6f 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  o one or more ov
2be20 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e  erflow pages. In
2be30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
2be40 69 73 20 63 61 73 65 20 74 68 65 20 77 68 6f 6c  is case the whol
2be50 65 20 63 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20  e cell needs to 
2be60 62 65 20 70 61 72 73 65 64 2c 20 61 20 62 75 66  be parsed, a buf
2be70 66 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20  fer allocated.  
2be80 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 61          ** and a
2be90 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 75  ccessPayload() u
2bea0 73 65 64 20 74 6f 20 72 65 74 72 69 65 76 65 20  sed to retrieve 
2beb0 74 68 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  the record into 
2bec0 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
2bed0 20 62 75 66 66 65 72 20 62 65 66 6f 72 65 20 56   buffer before V
2bee0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
2bef0 28 29 20 63 61 6e 20 62 65 20 63 61 6c 6c 65 64  () can be called
2bf00 2e 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  . .          **.
2bf10 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20            ** If 
2bf20 74 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f  the record is co
2bf30 72 72 75 70 74 2c 20 74 68 65 20 78 52 65 63 6f  rrupt, the xReco
2bf40 72 64 43 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e  rdCompare routin
2bf50 65 20 6d 61 79 20 72 65 61 64 0a 20 20 20 20 20  e may read.     
2bf60 20 20 20 20 20 2a 2a 20 75 70 20 74 6f 20 74 77       ** up to tw
2bf70 6f 20 76 61 72 69 6e 74 73 20 70 61 73 74 20 74  o varints past t
2bf80 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75  he end of the bu
2bf90 66 66 65 72 2e 20 41 6e 20 65 78 74 72 61 20 31  ffer. An extra 1
2bfa0 38 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  8 .          ** 
2bfb0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67  bytes of padding
2bfc0 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 74   is allocated at
2bfd0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
2bfe0 62 75 66 66 65 72 20 69 6e 0a 20 20 20 20 20 20  buffer in.      
2bff0 20 20 20 20 2a 2a 20 63 61 73 65 20 74 68 69 73      ** case this
2c000 20 68 61 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20   happens.  */.  
2c010 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43          void *pC
2c020 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20  ellKey;.        
2c030 20 20 75 38 20 2a 20 63 6f 6e 73 74 20 70 43 65    u8 * const pCe
2c040 6c 6c 42 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d  llBody = pCell -
2c050 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72   pPage->childPtr
2c060 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
2c070 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c  pPage->xParseCel
2c080 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f  l(pPage, pCellBo
2c090 64 79 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29  dy, &pCur->info)
2c0a0 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 65 6c  ;.          nCel
2c0b0 6c 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  l = (int)pCur->i
2c0c0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20  nfo.nKey;.      
2c0d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e 43      testcase( nC
2c0e0 65 6c 6c 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72  ell<0 );   /* Tr
2c0f0 75 65 20 69 66 20 6b 65 79 20 73 69 7a 65 20 69  ue if key size i
2c100 73 20 32 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a  s 2^32 or more *
2c110 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2c120 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29  case( nCell==0 )
2c130 3b 20 20 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65  ;  /* Invalid ke
2c140 79 20 73 69 7a 65 3a 20 20 30 78 38 30 20 30 78  y size:  0x80 0x
2c150 38 30 20 30 78 30 30 20 2a 2f 0a 20 20 20 20 20  80 0x00 */.     
2c160 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6e       testcase( n
2c170 43 65 6c 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49  Cell==1 );  /* I
2c180 6e 76 61 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a  nvalid key size:
2c190 20 20 30 78 38 30 20 30 78 38 30 20 30 78 30 31    0x80 0x80 0x01
2c1a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65   */.          te
2c1b0 73 74 63 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32  stcase( nCell==2
2c1c0 20 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20   );  /* Minimum 
2c1d0 6c 65 67 61 6c 20 69 6e 64 65 78 20 6b 65 79 20  legal index key 
2c1e0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  size */.        
2c1f0 20 20 69 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b    if( nCell<2 ){
2c200 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
2c210 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
2c220 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2c230 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
2c240 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
2c250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 43 65   }.          pCe
2c260 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d  llKey = sqlite3M
2c270 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20  alloc( nCell+18 
2c280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
2c290 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a   pCellKey==0 ){.
2c2a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
2c2b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
2c2c0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c2d0 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c2e0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c2f0 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78       pCur->aiIdx
2c300 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20  [pCur->iPage] = 
2c310 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20 20 20  (u16)idx;.      
2c320 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
2c330 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20  ayload(pCur, 0, 
2c340 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e 65 64  nCell, (unsigned
2c350 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65 79 2c   char*)pCellKey,
2c360 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   2);.          i
2c370 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2c380 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2c390 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
2c3a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
2c3b0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
2c3c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c3d0 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f     c = xRecordCo
2c3e0 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70 43 65  mpare(nCell, pCe
2c3f0 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b  llKey, pIdxKey);
2c400 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
2c410 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65 79  e3_free(pCellKey
2c420 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2c430 20 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20       assert( .  
2c440 20 20 20 20 20 20 20 20 20 20 28 70 49 64 78 4b            (pIdxK
2c450 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  ey->errCode!=SQL
2c460 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 63  ITE_CORRUPT || c
2c470 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 26 26  ==0).         &&
2c480 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f   (pIdxKey->errCo
2c490 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  de!=SQLITE_NOMEM
2c4a0 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72 65 65   || pCur->pBtree
2c4b0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
2c4c0 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ed).        );. 
2c4d0 20 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29         if( c<0 )
2c4e0 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
2c4f0 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 20  = idx+1;.       
2c500 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30 20 29   }else if( c>0 )
2c510 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20  {.          upr 
2c520 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 20  = idx-1;.       
2c530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c540 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30 20 29    assert( c==0 )
2c550 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 52 65  ;.          *pRe
2c560 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
2c570 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2c580 0a 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  .          pCur-
2c590 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c5a0 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78 3b 0a  ge] = (u16)idx;.
2c5b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
2c5c0 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 20 29  dxKey->errCode )
2c5d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2c5e0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2c5f0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c600 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
2c610 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
2c620 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
2c630 20 20 20 61 73 73 65 72 74 28 20 6c 77 72 2b 75     assert( lwr+u
2c640 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pr>=0 );.       
2c650 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29   idx = (lwr+upr)
2c660 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d 20 28  >>1;  /* idx = (
2c670 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a 20 20  lwr+upr)/2 */.  
2c680 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c690 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70 72  assert( lwr==upr
2c6a0 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e 69 6e  +1 || (pPage->in
2c6b0 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e  tKey && !pPage->
2c6c0 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61 73 73  leaf) );.    ass
2c6d0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2c6e0 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  it );.    if( pP
2c6f0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2c700 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2c710 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2c720 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65  ge]<pCur->apPage
2c730 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2c740 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 70 43  Cell );.      pC
2c750 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
2c760 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64  iPage] = (u16)id
2c770 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  x;.      *pRes =
2c780 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   c;.      rc = S
2c790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2c7a0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c7b0 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65 74 6f  sh;.    }.moveto
2c7c0 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20 20 20  _next_layer:.   
2c7d0 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d   if( lwr>=pPage-
2c7e0 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  >nCell ){.      
2c7f0 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74  chldPg = get4byt
2c800 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2c810 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2c820 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
2c830 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
2c840 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2c850 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a  l(pPage, lwr));.
2c860 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e      }.    pCur->
2c870 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2c880 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20  e] = (u16)lwr;. 
2c890 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
2c8a0 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67  ild(pCur, chldPg
2c8b0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2c8c0 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76 65 74  break;.  }.movet
2c8d0 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43 75 72  o_finish:.  pCur
2c8e0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2c8f0 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2c900 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2c910 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2c920 64 4f 76 66 6c 29 3b 0a 20 20 72 65 74 75 72 6e  dOvfl);.  return
2c930 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
2c940 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2c950 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
2c960 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
2c970 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c  ntry of the tabl
2c980 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69  e..**.** TRUE wi
2c990 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 61  ll be returned a
2c9a0 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73  fter a call to s
2c9b0 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
2c9c0 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20  ) moves.** past 
2c9d0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69  the last entry i
2c9e0 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73  n the table or s
2c9f0 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 28  qlite3BtreePrev(
2ca00 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20  ) moves past.** 
2ca10 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e  the first entry.
2ca20 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72    TRUE is also r
2ca30 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 74  eturned if the t
2ca40 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  able is empty..*
2ca50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2ca60 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a  eeEof(BtCursor *
2ca70 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f  pCur){.  /* TODO
2ca80 3a 20 57 68 61 74 20 69 66 20 74 68 65 20 63 75  : What if the cu
2ca90 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f  rsor is in CURSO
2caa0 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 62 75  R_REQUIRESEEK bu
2cab0 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72  t all table entr
2cac0 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65  ies.  ** have be
2cad0 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73  en deleted? This
2cae0 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74   API will need t
2caf0 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75  o change to retu
2cb00 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
2cb10 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73  .  ** as well as
2cb20 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73   the boolean res
2cb30 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a  ult value..  */.
2cb40 20 20 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52    return (CURSOR
2cb50 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53  _VALID!=pCur->eS
2cb60 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tate);.}../*.** 
2cb70 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
2cb80 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
2cb90 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
2cba0 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
2cbb0 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
2cbc0 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
2cbd0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
2cbe0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
2cbf0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
2cc00 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2cc10 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
2cc20 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
2cc30 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
2cc40 70 52 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68  pRes=1..**.** Th
2cc50 65 20 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69  e main entry poi
2cc60 6e 74 20 69 73 20 73 71 6c 69 74 65 33 42 74 72  nt is sqlite3Btr
2cc70 65 65 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20  eeNext().  That 
2cc80 72 6f 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d  routine is optim
2cc90 69 7a 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  ized.** for the 
2cca0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d  common case of m
2ccb0 65 72 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69  erely incrementi
2ccc0 6e 67 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e  ng the cell coun
2ccd0 74 65 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49  ter BtCursor.aiI
2cce0 64 78 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78  dx.** to the nex
2ccf0 74 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75  t cell on the cu
2cd00 72 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65  rrent page.  The
2cd10 20 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e   (slower) btreeN
2cd20 65 78 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20  ext() helper.** 
2cd30 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
2cd40 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63  d when it is nec
2cd50 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74  essary to move t
2cd60 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 61  o a different pa
2cd70 67 65 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74  ge or.** to rest
2cd80 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a  ore the cursor..
2cd90 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e  **.** The callin
2cda0 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  g function will 
2cdb0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f  set *pRes to 0 o
2cdc0 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61  r 1.  The initia
2cdd0 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a  l *pRes value.**
2cde0 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68   will be 1 if th
2cdf0 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73  e cursor being s
2ce00 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e  tepped correspon
2ce10 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64  ds to an SQL ind
2ce20 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69  ex and.** if thi
2ce30 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20  s routine could 
2ce40 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65  have been skippe
2ce50 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e  d if that SQL in
2ce60 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20  dex had been.** 
2ce70 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20  a unique index. 
2ce80 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
2ce90 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20  aller will have 
2cea0 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72  set *pRes to zer
2ceb0 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68  o..** Zero is th
2cec0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54  e common case. T
2ced0 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65  he btree impleme
2cee0 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20  ntation is free 
2cef0 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e  to use the.** in
2cf00 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75  itial *pRes valu
2cf10 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69  e as a hint to i
2cf20 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e  mprove performan
2cf30 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72 72  ce, but the curr
2cf40 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74  ent.** SQLite bt
2cf50 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ree implementati
2cf60 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f  on does not. (No
2cf70 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64  te that the comd
2cf80 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c  b2 btree.** impl
2cf90 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20  ementation does 
2cfa0 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68  use this hint, h
2cfb0 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74  owever.).*/.stat
2cfc0 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
2cfd0 4e 45 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74  NE int btreeNext
2cfe0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
2cff0 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
2d000 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78  nt rc;.  int idx
2d010 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2d020 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ge;..  assert( c
2d030 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2d040 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d050 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2d060 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2d070 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d080 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2d090 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66  *pRes==0 );.  if
2d0a0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2d0b0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2d0c0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2d0d0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d0e0 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2d0f0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
2d100 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2d110 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2d120 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d130 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2d140 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2d150 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2d160 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2d170 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2d180 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2d190 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2d1a0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2d1b0 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2d1c0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d1d0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d1e0 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2d1f0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2d200 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2d210 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d220 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2d230 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2d240 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
2d250 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d260 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2d270 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2d290 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2d2a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2d2b0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d2c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d2d0 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2d2e0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d2f0 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2d300 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d310 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2d320 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
2d330 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
2d340 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
2d350 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
2d360 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
2d370 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
2d380 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
2d390 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
2d3a0 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
2d3b0 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
2d3c0 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
2d3d0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
2d3e0 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
2d3f0 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
2d400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2d410 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
2d420 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
2d430 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
2d440 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
2d450 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
2d460 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
2d470 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
2d480 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
2d490 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
2d4a0 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
2d4b0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d4c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2d4d0 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2d4e0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2d4f0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d500 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
2d510 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
2d530 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2d540 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
2d550 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2d560 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2d570 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2d580 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2d590 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2d5a0 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2d5b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d5c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d5d0 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2d5e0 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
2d5f0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d600 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2d610 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
2d620 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d630 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
2d640 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2d650 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2d660 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2d670 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2d680 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2d690 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d6a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d6b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d6c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2d6d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d6f0 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d700 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69  t(pCur);.  }.}.i
2d710 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
2d720 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2d730 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d740 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d750 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2d760 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2d770 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d780 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73  pRes!=0 );.  ass
2d790 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c  ert( *pRes==0 ||
2d7a0 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61   *pRes==1 );.  a
2d7b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69  ssert( pCur->ski
2d7c0 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72  pNext==0 || pCur
2d7d0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2d7e0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43 75 72  _VALID );.  pCur
2d7f0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
2d800 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61  ;.  pCur->curFla
2d810 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56 61 6c  gs &= ~(BTCF_Val
2d820 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69  idNKey|BTCF_Vali
2d830 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65 73 20  dOvfl);.  *pRes 
2d840 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  = 0;.  if( pCur-
2d850 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2d860 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e 20 62  VALID ) return b
2d870 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70  treeNext(pCur, p
2d880 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Res);.  pPage = 
2d890 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2d8a0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28  r->iPage];.  if(
2d8b0 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b   (++pCur->aiIdx[
2d8c0 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e 3d 70  pCur->iPage])>=p
2d8d0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  Page->nCell ){. 
2d8e0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
2d8f0 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20  Cur->iPage]--;. 
2d900 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 4e     return btreeN
2d910 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
2d920 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
2d930 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65  ->leaf ){.    re
2d940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2d950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
2d960 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  urn moveToLeftmo
2d970 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a  st(pCur);.  }.}.
2d980 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
2d990 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
2d9a0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
2d9b0 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
2d9c0 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
2d9d0 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
2d9e0 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
2d9f0 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
2da00 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
2da10 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
2da20 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
2da30 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
2da40 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
2da50 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
2da60 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2a 0a  set *pRes=1..**.
2da70 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e 74 72  ** The main entr
2da80 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c 69 74  y point is sqlit
2da90 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 28  e3BtreePrevious(
2daa0 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69 6e 65  ).  That routine
2dab0 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a 2a 2a   is optimized.**
2dac0 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
2dad0 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79 20 64  case of merely d
2dae0 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20  ecrementing the 
2daf0 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42 74 43  cell counter BtC
2db00 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a 20 74  ursor.aiIdx.** t
2db10 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  o the previous c
2db20 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72 65  ell on the curre
2db30 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28 73  nt page.  The (s
2db40 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72 65 76  lower) btreePrev
2db50 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70 65 72  ious().** helper
2db60 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2db70 65 64 20 77 68 65 6e 20 69 74 20 69 73 20 6e 65  ed when it is ne
2db80 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76 65 20  cessary to move 
2db90 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  to a different p
2dba0 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72 65 73  age.** or to res
2dbb0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 2e  tore the cursor.
2dbc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  .**.** The calli
2dbd0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ng function will
2dbe0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   set *pRes to 0 
2dbf0 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69 74 69  or 1.  The initi
2dc00 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a  al *pRes value.*
2dc10 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66 20 74  * will be 1 if t
2dc20 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e 67 20  he cursor being 
2dc30 73 74 65 70 70 65 64 20 63 6f 72 72 65 73 70 6f  stepped correspo
2dc40 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e  nds to an SQL in
2dc50 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68  dex and.** if th
2dc60 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64  is routine could
2dc70 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69 70 70   have been skipp
2dc80 65 64 20 69 66 20 74 68 61 74 20 53 51 4c 20 69  ed if that SQL i
2dc90 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a  ndex had been.**
2dca0 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65 78 2e   a unique index.
2dcb0 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20    Otherwise the 
2dcc0 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61 76 65  caller will have
2dcd0 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 7a 65   set *pRes to ze
2dce0 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74  ro..** Zero is t
2dcf0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20  he common case. 
2dd00 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c 65 6d  The btree implem
2dd10 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72 65 65  entation is free
2dd20 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 69   to use the.** i
2dd30 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c  nitial *pRes val
2dd40 75 65 20 61 73 20 61 20 68 69 6e 74 20 74 6f 20  ue as a hint to 
2dd50 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72 6d 61  improve performa
2dd60 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63 75 72  nce, but the cur
2dd70 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62  rent.** SQLite b
2dd80 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tree implementat
2dd90 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e  ion does not. (N
2dda0 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 6f 6d  ote that the com
2ddb0 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70  db2 btree.** imp
2ddc0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73  lementation does
2ddd0 20 75 73 65 20 74 68 69 73 20 68 69 6e 74 2c 20   use this hint, 
2dde0 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61  however.).*/.sta
2ddf0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
2de00 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50 72 65  INE int btreePre
2de10 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
2de20 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
2de30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
2de40 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
2de50 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2de60 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2de70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 65  );.  assert( pRe
2de80 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  s!=0 );.  assert
2de90 28 20 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20  ( *pRes==0 );.  
2dea0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73 6b  assert( pCur->sk
2deb0 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75  ipNext==0 || pCu
2dec0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2ded0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
2dee0 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46  ert( (pCur->curF
2def0 6c 61 67 73 20 26 20 28 42 54 43 46 5f 41 74 4c  lags & (BTCF_AtL
2df00 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  ast|BTCF_ValidOv
2df10 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65  fl|BTCF_ValidNKe
2df20 79 29 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  y))==0 );.  asse
2df30 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2df40 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 69 66 28  Size==0 );.  if(
2df50 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2df60 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
2df70 20 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43     rc = restoreC
2df80 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2df90 75 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ur);.    if( rc!
2dfa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2dfb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2dfc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 43 55 52     }.    if( CUR
2dfd0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
2dfe0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2dff0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2e000 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2e010 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
2e020 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2e030 78 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  xt ){.      asse
2e040 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
2e050 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c  ==CURSOR_VALID |
2e060 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
2e070 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58 54 20  CURSOR_SKIPNEXT 
2e080 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 65  );.      pCur->e
2e090 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
2e0a0 41 4c 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  ALID;.      if( 
2e0b0 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3c 30  pCur->skipNext<0
2e0c0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
2e0d0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e0e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2e0f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2e100 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 73 6b  }.      pCur->sk
2e110 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  ipNext = 0;.    
2e120 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d  }.  }..  pPage =
2e130 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e140 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
2e150 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
2e160 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 21 70 50  nit );.  if( !pP
2e170 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e180 20 69 6e 74 20 69 64 78 20 3d 20 70 43 75 72 2d   int idx = pCur-
2e190 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2e1a0 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  ge];.    rc = mo
2e1b0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
2e1c0 67 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c  get4byte(findCel
2e1d0 6c 28 70 50 61 67 65 2c 20 69 64 78 29 29 29 3b  l(pPage, idx)));
2e1e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
2e1f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
2e200 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
2e210 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
2e220 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
2e230 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2e240 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
2e250 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
2e260 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2e270 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
2e280 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2e290 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
2e2a0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2e2b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2e2c0 20 20 7d 0a 20 20 20 20 20 20 6d 6f 76 65 54 6f    }.      moveTo
2e2d0 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
2e2e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2e2f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2e300 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
2e310 74 28 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  t( (pCur->curFla
2e320 67 73 20 26 20 28 42 54 43 46 5f 56 61 6c 69 64  gs & (BTCF_Valid
2e330 4e 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f  NKey|BTCF_ValidO
2e340 76 66 6c 29 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  vfl))==0 );..   
2e350 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e360 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b 0a 20 20 20  r->iPage]--;.   
2e370 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
2e380 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
2e390 65 5d 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e];.    if( pPag
2e3a0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50  e->intKey && !pP
2e3b0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2e3c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2e3d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43 75  treePrevious(pCu
2e3e0 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
2e3f0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
2e400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2e410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e420 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2e430 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
2e440 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
2e450 20 2a 70 52 65 73 29 7b 0a 20 20 61 73 73 65 72   *pRes){.  asser
2e460 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
2e470 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
2e480 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
2e490 3b 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52 65  ;.  assert( *pRe
2e4a0 73 3d 3d 30 20 7c 7c 20 2a 70 52 65 73 3d 3d 31  s==0 || *pRes==1
2e4b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2e4c0 75 72 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20  ur->skipNext==0 
2e4d0 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21  || pCur->eState!
2e4e0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
2e4f0 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20  .  *pRes = 0;.  
2e500 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26  pCur->curFlags &
2e510 3d 20 7e 28 42 54 43 46 5f 41 74 4c 61 73 74 7c  = ~(BTCF_AtLast|
2e520 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42  BTCF_ValidOvfl|B
2e530 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 29 3b 0a  TCF_ValidNKey);.
2e540 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2e550 7a 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43  ze = 0;.  if( pC
2e560 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2e570 4f 52 5f 56 41 4c 49 44 0a 20 20 20 7c 7c 20 70  OR_VALID.   || p
2e580 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e590 3e 69 50 61 67 65 5d 3d 3d 30 0a 20 20 20 7c 7c  >iPage]==0.   ||
2e5a0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
2e5b0 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6c 65 61 66  ur->iPage]->leaf
2e5c0 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  ==0.  ){.    ret
2e5d0 75 72 6e 20 62 74 72 65 65 50 72 65 76 69 6f 75  urn btreePreviou
2e5e0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2e5f0 20 7d 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78   }.  pCur->aiIdx
2e600 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2e610 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2e620 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  _OK;.}../*.** Al
2e630 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
2e640 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  e from the datab
2e650 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2e660 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20  The new page is 
2e670 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
2e680 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
2e690 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  s, sqlite3PagerW
2e6a0 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c  rite().** has al
2e6b0 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65  ready been calle
2e6c0 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67  d on the new pag
2e6d0 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67  e.)  The new pag
2e6e0 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65  e has also.** be
2e6f0 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e  en referenced an
2e700 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  d the calling ro
2e710 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73  utine is respons
2e720 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67  ible for calling
2e730 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2e740 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e  Unref() on the n
2e750 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20  ew page when it 
2e760 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53  is done..**.** S
2e770 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2e780 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
2e790 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75    Any other retu
2e7a0 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74  rn value indicat
2e7b0 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20  es.** an error. 
2e7c0 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
2e7d0 74 6f 20 4e 55 4c 4c 20 69 6e 20 74 68 65 20 65  to NULL in the e
2e7e0 76 65 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72  vent of an error
2e7f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22  ..**.** If the "
2e800 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65 74 65  nearby" paramete
2e810 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e  r is not 0, then
2e820 20 61 6e 20 65 66 66 6f 72 74 20 69 73 20 6d 61   an effort is ma
2e830 64 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65  de to .** locate
2e840 20 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f   a page close to
2e850 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2e860 20 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73   "nearby".  This
2e870 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20   can be used in 
2e880 61 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f  an.** attempt to
2e890 20 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61   keep related pa
2e8a0 67 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63  ges close to eac
2e8b0 68 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64  h other in the d
2e8c0 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a  atabase file,.**
2e8d0 20 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63   which in turn c
2e8e0 61 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65  an make database
2e8f0 20 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a   access faster..
2e900 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 4d 6f  **.** If the eMo
2e910 64 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  de parameter is 
2e920 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e  BTALLOC_EXACT an
2e930 64 20 74 68 65 20 6e 65 61 72 62 79 20 70 61 67  d the nearby pag
2e940 65 20 65 78 69 73 74 73 0a 2a 2a 20 61 6e 79 77  e exists.** anyw
2e950 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65  here on the free
2e960 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69  -list, then it i
2e970 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
2e980 62 65 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  be returned.  If
2e990 0a 2a 2a 20 65 4d 6f 64 65 20 69 73 20 42 54 41  .** eMode is BTA
2e9a0 4c 4c 4f 43 5f 4c 54 20 74 68 65 6e 20 74 68 65  LLOC_LT then the
2e9b0 20 70 61 67 65 20 72 65 74 75 72 6e 65 64 20 77   page returned w
2e9c0 69 6c 6c 20 62 65 20 6c 65 73 73 20 74 68 61 6e  ill be less than
2e9d0 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20   or equal.** to 
2e9e0 6e 65 61 72 62 79 20 69 66 20 61 6e 79 20 73 75  nearby if any su
2e9f0 63 68 20 70 61 67 65 20 65 78 69 73 74 73 2e 20  ch page exists. 
2ea00 20 49 66 20 65 4d 6f 64 65 20 69 73 20 42 54 41   If eMode is BTA
2ea10 4c 4c 4f 43 5f 41 4e 59 20 74 68 65 6e 20 74 68  LLOC_ANY then th
2ea20 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 72 65  ere.** are no re
2ea30 73 74 72 69 63 74 69 6f 6e 73 20 6f 6e 20 77 68  strictions on wh
2ea40 69 63 68 20 70 61 67 65 20 69 73 20 72 65 74 75  ich page is retu
2ea50 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2ea60 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
2ea70 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2ea80 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2ea90 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
2eaa0 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
2eab0 67 65 2c 20 20 20 20 20 20 2f 2a 20 53 74 6f 72  ge,      /* Stor
2eac0 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  e pointer to the
2ead0 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
2eae0 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a  here */.  Pgno *
2eaf0 70 50 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20  pPgno,          
2eb00 20 2f 2a 20 53 74 6f 72 65 20 74 68 65 20 70 61   /* Store the pa
2eb10 67 65 20 6e 75 6d 62 65 72 20 68 65 72 65 20 2a  ge number here *
2eb20 2f 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c  /.  Pgno nearby,
2eb30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
2eb40 61 72 63 68 20 66 6f 72 20 61 20 70 61 67 65 20  arch for a page 
2eb50 6e 65 61 72 20 74 68 69 73 20 6f 6e 65 20 2a 2f  near this one */
2eb60 0a 20 20 75 38 20 65 4d 6f 64 65 20 20 20 20 20  .  u8 eMode     
2eb70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 54 41            /* BTA
2eb80 4c 4c 4f 43 5f 45 58 41 43 54 2c 20 42 54 41 4c  LLOC_EXACT, BTAL
2eb90 4c 4f 43 5f 4c 54 2c 20 6f 72 20 42 54 41 4c 4c  LOC_LT, or BTALL
2eba0 4f 43 5f 41 4e 59 20 2a 2f 0a 29 7b 0a 20 20 4d  OC_ANY */.){.  M
2ebb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
2ebc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
2ebd0 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  n;     /* Number
2ebe0 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65   of pages on the
2ebf0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 75   freelist */.  u
2ec00 33 32 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d  32 k;     /* Num
2ec10 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e  ber of leaves on
2ec20 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68   the trunk of th
2ec30 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
2ec40 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
2ec50 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
2ec60 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a  pPrevTrunk = 0;.
2ec70 20 20 50 67 6e 6f 20 6d 78 50 61 67 65 3b 20 20    Pgno mxPage;  
2ec80 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65     /* Total size
2ec90 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2eca0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65   file */..  asse
2ecb0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ecc0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
2ecd0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
2ece0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 41  eMode==BTALLOC_A
2ecf0 4e 59 20 7c 7c 20 28 6e 65 61 72 62 79 3e 30 20  NY || (nearby>0 
2ed00 26 26 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70  && IfNotOmitAV(p
2ed10 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 29  Bt->autoVacuum))
2ed20 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d 20 70   );.  pPage1 = p
2ed30 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 6d 78  Bt->pPage1;.  mx
2ed40 50 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65  Page = btreePage
2ed50 63 6f 75 6e 74 28 70 42 74 29 3b 0a 20 20 2f 2a  count(pBt);.  /*
2ed60 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
2ed70 30 35 31 31 39 2d 30 32 36 33 37 20 54 68 65 20  05119-02637 The 
2ed80 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4-byte big-endia
2ed90 6e 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  n integer at off
2eda0 73 65 74 20 33 36 0a 20 20 2a 2a 20 73 74 6f 72  set 36.  ** stor
2edb0 65 73 20 73 74 6f 72 65 73 20 74 68 65 20 74 6f  es stores the to
2edc0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
2edd0 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  ges on the freel
2ede0 69 73 74 2e 20 2a 2f 0a 20 20 6e 20 3d 20 67 65  ist. */.  n = ge
2edf0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
2ee00 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 74 65  aData[36]);.  te
2ee10 73 74 63 61 73 65 28 20 6e 3d 3d 6d 78 50 61 67  stcase( n==mxPag
2ee20 65 2d 31 20 29 3b 0a 20 20 69 66 28 20 6e 3e 3d  e-1 );.  if( n>=
2ee30 6d 78 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  mxPage ){.    re
2ee40 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
2ee50 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
2ee60 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f  if( n>0 ){.    /
2ee70 2a 20 54 68 65 72 65 20 61 72 65 20 70 61 67 65  * There are page
2ee80 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
2ee90 74 2e 20 20 52 65 75 73 65 20 6f 6e 65 20 6f 66  t.  Reuse one of
2eea0 20 74 68 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f   those pages. */
2eeb0 0a 20 20 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b  .    Pgno iTrunk
2eec0 3b 0a 20 20 20 20 75 38 20 73 65 61 72 63 68 4c  ;.    u8 searchL
2eed0 69 73 74 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74  ist = 0; /* If t
2eee0 68 65 20 66 72 65 65 2d 6c 69 73 74 20 6d 75 73  he free-list mus
2eef0 74 20 62 65 20 73 65 61 72 63 68 65 64 20 66 6f  t be searched fo
2ef00 72 20 27 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20  r 'nearby' */.  
2ef10 20 20 75 33 32 20 6e 53 65 61 72 63 68 20 3d 20    u32 nSearch = 
2ef20 30 3b 20 20 20 2f 2a 20 43 6f 75 6e 74 20 6f 66  0;   /* Count of
2ef30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
2ef40 65 61 72 63 68 20 61 74 74 65 6d 70 74 73 20 2a  earch attempts *
2ef50 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
2ef60 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f   eMode==BTALLOC_
2ef70 45 58 41 43 54 20 61 6e 64 20 61 20 71 75 65 72  EXACT and a quer
2ef80 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
2ef90 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
2efa0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
2efb0 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
2efc0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
2efd0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
2efe0 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
2eff0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
2f000 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
2f010 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
2f020 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2f030 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2f040 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43  ( eMode==BTALLOC
2f050 5f 45 58 41 43 54 20 29 7b 0a 20 20 20 20 20 20  _EXACT ){.      
2f060 69 66 28 20 6e 65 61 72 62 79 3c 3d 6d 78 50 61  if( nearby<=mxPa
2f070 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  ge ){.        u8
2f080 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20   eType;.        
2f090 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
2f0a0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2f0b0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
2f0c0 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 72  uum );.        r
2f0d0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2f0e0 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70  t, nearby, &eTyp
2f0f0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
2f100 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2f110 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  c;.        if( e
2f120 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2f130 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2f140 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
2f150 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2f160 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2f170 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  f( eMode==BTALLO
2f180 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 73 65  C_LE ){.      se
2f190 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20  archList = 1;.  
2f1a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
2f1b0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
2f1c0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
2f1d0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
2f1e0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
2f1f0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
2f200 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
2f210 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
2f220 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
2f230 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
2f240 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2f250 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
2f260 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
2f270 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2f280 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
2f290 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
2f2a0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
2f2b0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
2f2c0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
2f2d0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
2f2e0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
2f2f0 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
2f300 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
2f310 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
2f320 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
2f330 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
2f340 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
2f350 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
2f360 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
2f370 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f  d (eMode==BTALLO
2f380 43 5f 45 58 41 43 54 29 0a 20 20 20 20 2a 2a 20  C_EXACT).    ** 
2f390 6f 72 20 75 6e 74 69 6c 20 61 20 70 61 67 65 20  or until a page 
2f3a0 6c 65 73 73 20 74 68 61 6e 20 27 6e 65 61 72 62  less than 'nearb
2f3b0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 20 28 65  y' is located (e
2f3c0 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 54  Mode==BTALLOC_LT
2f3d0 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20  ).    */.    do 
2f3e0 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72 75  {.      pPrevTru
2f3f0 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  nk = pTrunk;.   
2f400 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75 6e     if( pPrevTrun
2f410 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
2f420 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
2f430 31 35 30 36 2d 31 31 30 35 33 20 54 68 65 20 66  1506-11053 The f
2f440 69 72 73 74 20 69 6e 74 65 67 65 72 20 6f 6e 20  irst integer on 
2f450 61 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b  a freelist trunk
2f460 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
2f470 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d   is the page num
2f480 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ber of the next 
2f490 66 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70  freelist trunk p
2f4a0 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20  age in the list 
2f4b0 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 7a 65  or.        ** ze
2f4c0 72 6f 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ro if this is th
2f4d0 65 20 6c 61 73 74 20 66 72 65 65 6c 69 73 74 20  e last freelist 
2f4e0 74 72 75 6e 6b 20 70 61 67 65 2e 20 2a 2f 0a 20  trunk page. */. 
2f4f0 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
2f500 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76 54  get4byte(&pPrevT
2f510 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  runk->aData[0]);
2f520 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f530 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
2f540 45 2d 4f 46 3a 20 52 2d 35 39 38 34 31 2d 31 33  E-OF: R-59841-13
2f550 37 39 38 20 54 68 65 20 34 2d 62 79 74 65 20 62  798 The 4-byte b
2f560 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
2f570 72 20 61 74 20 6f 66 66 73 65 74 20 33 32 0a 20  r at offset 32. 
2f580 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 73         ** stores
2f590 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2f5a0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
2f5b0 67 65 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ge of the freeli
2f5c0 73 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66 0a 20  st, or zero if. 
2f5d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 66 72         ** the fr
2f5e0 65 65 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2e  eelist is empty.
2f5f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54 72 75   */.        iTru
2f600 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2f610 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
2f620 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f630 20 74 65 73 74 63 61 73 65 28 20 69 54 72 75 6e   testcase( iTrun
2f640 6b 3d 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20  k==mxPage );.   
2f650 20 20 20 69 66 28 20 69 54 72 75 6e 6b 3e 6d 78     if( iTrunk>mx
2f660 50 61 67 65 20 7c 7c 20 6e 53 65 61 72 63 68 2b  Page || nSearch+
2f670 2b 20 3e 20 6e 20 29 7b 0a 20 20 20 20 20 20 20  + > n ){.       
2f680 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2f690 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2f6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2f6b0 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75  rc = btreeGetUnu
2f6c0 73 65 64 50 61 67 65 28 70 42 74 2c 20 69 54 72  sedPage(pBt, iTr
2f6d0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
2f6e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f6f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f700 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
2f710 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
2f720 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
2f730 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
2f740 72 74 28 20 70 54 72 75 6e 6b 21 3d 30 20 29 3b  rt( pTrunk!=0 );
2f750 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2f760 54 72 75 6e 6b 2d 3e 61 44 61 74 61 21 3d 30 20  Trunk->aData!=0 
2f770 29 3b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  );.      /* EVID
2f780 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 33 35 32 33  ENCE-OF: R-13523
2f790 2d 30 34 33 39 34 20 54 68 65 20 73 65 63 6f 6e  -04394 The secon
2f7a0 64 20 69 6e 74 65 67 65 72 20 6f 6e 20 61 20 66  d integer on a f
2f7b0 72 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  reelist trunk pa
2f7c0 67 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  ge.      ** is t
2f7d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61  he number of lea
2f7e0 66 20 70 61 67 65 20 70 6f 69 6e 74 65 72 73 20  f page pointers 
2f7f0 74 6f 20 66 6f 6c 6c 6f 77 2e 20 2a 2f 0a 20 20  to follow. */.  
2f800 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
2f810 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
2f820 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
2f830 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
2f840 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
2f850 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
2f860 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
2f870 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
2f880 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
2f890 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
2f8a0 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
2f8b0 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
2f8c0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
2f8d0 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
2f8e0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
2f8f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2f900 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
2f910 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2f920 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2f930 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
2f940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2f950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2f960 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2f970 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
2f980 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
2f990 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
2f9a0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2f9b0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2f9c0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2f9d0 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
2f9e0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2f9f0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
2fa00 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2fa10 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
2fa20 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
2fa30 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
2fa40 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
2fa50 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 28 75    }else if( k>(u
2fa60 33 32 29 28 70 42 74 2d 3e 75 73 61 62 6c 65 53  32)(pBt->usableS
2fa70 69 7a 65 2f 34 20 2d 20 32 29 20 29 7b 0a 20 20  ize/4 - 2) ){.  
2fa80 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f        /* Value o
2fa90 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f k is out of ra
2faa0 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20 63  nge.  Database c
2fab0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
2fac0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2fad0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
2fae0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2faf0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23  allocate_page;.#
2fb00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2fb10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2fb20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
2fb30 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
2fb40 20 20 20 20 20 20 26 26 20 28 6e 65 61 72 62 79        && (nearby
2fb50 3d 3d 69 54 72 75 6e 6b 20 7c 7c 20 28 69 54 72  ==iTrunk || (iTr
2fb60 75 6e 6b 3c 6e 65 61 72 62 79 20 26 26 20 65 4d  unk<nearby && eM
2fb70 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 29  ode==BTALLOC_LE)
2fb80 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
2fb90 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20      /* The list 
2fba0 69 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65  is being searche
2fbb0 64 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b  d and this trunk
2fbc0 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67   page is the pag
2fbd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
2fbe0 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64  allocate, regard
2fbf0 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
2fc00 69 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20  it has leaves.. 
2fc10 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fc20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e    *pPgno = iTrun
2fc30 6b 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  k;.        *ppPa
2fc40 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
2fc50 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2fc60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2fc70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2fc80 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
2fc90 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
2fca0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2fcb0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
2fcc0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
2fcd0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2fce0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
2fcf0 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e    if( !pPrevTrun
2fd00 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k ){.           
2fd10 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
2fd20 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
2fd30 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2fd40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
2fd50 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
2fd60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fd70 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e  rWrite(pPrevTrun
2fd80 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fd90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
2fda0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fdb0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2fdc0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
2fdd0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ge;.            
2fde0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  }.            me
2fdf0 6d 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b  mcpy(&pPrevTrunk
2fe00 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
2fe10 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
2fe20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2fe30 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2fe40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
2fe50 72 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71  runk page is req
2fe60 75 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c  uired by the cal
2fe70 6c 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61  ler but it conta
2fe80 69 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ins .          *
2fe90 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72  * pointers to fr
2fea0 65 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20  ee-list leaves. 
2feb0 54 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62  The first leaf b
2fec0 65 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20  ecomes a trunk. 
2fed0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
2fee0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
2fef0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
2ff00 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
2ff10 4e 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  NewTrunk;.      
2ff20 20 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75      Pgno iNewTru
2ff30 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
2ff40 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29  Trunk->aData[8])
2ff50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2ff60 69 4e 65 77 54 72 75 6e 6b 3e 6d 78 50 61 67 65  iNewTrunk>mxPage
2ff70 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 20   ){ .           
2ff80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
2ff90 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
2ffa0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
2ffb0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
2ffc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ffd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
2ffe0 4e 65 77 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  NewTrunk==mxPage
2fff0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
30000 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
30010 64 50 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54  dPage(pBt, iNewT
30020 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b  runk, &pNewTrunk
30030 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
30040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30050 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
30060 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
30070 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
30080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
30090 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
300a0 57 72 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d  Write(pNewTrunk-
300b0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
300c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
300d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
300e0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
300f0 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  e(pNewTrunk);.  
30100 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
30110 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
30120 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
30130 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
30140 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
30150 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [0], &pTrunk->aD
30160 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
30170 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
30180 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
30190 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20  [4], k-1);.     
301a0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
301b0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d  wTrunk->aData[8]
301c0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
301d0 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a  [12], (k-1)*4);.
301e0 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
301f0 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29  ePage(pNewTrunk)
30200 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30210 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20  !pPrevTrunk ){. 
30220 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
30230 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
30240 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
30250 31 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  1->pDbPage) );. 
30260 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
30270 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
30280 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e  ta[32], iNewTrun
30290 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  k);.          }e
302a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
302b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
302c0 65 72 57 72 69 74 65 28 70 50 72 65 76 54 72 75  erWrite(pPrevTru
302d0 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
302e0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
302f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30300 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
30310 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
30320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30330 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
30340 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  revTrunk->aData[
30350 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a  0], iNewTrunk);.
30360 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54      }.        pT
30380 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
30390 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
303a0 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
303b0 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
303c0 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
303d0 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
303e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 30 20    }else if( k>0 
303f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78  ){.        /* Ex
30400 74 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f  tract a leaf fro
30410 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20  m the trunk */. 
30420 20 20 20 20 20 20 20 75 33 32 20 63 6c 6f 73 65         u32 close
30430 73 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f  st;.        Pgno
30440 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
30450 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
30460 44 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61  Data = pTrunk->a
30470 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 69 66  Data;.        if
30480 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20  ( nearby>0 ){.  
30490 20 20 20 20 20 20 20 20 75 33 32 20 69 3b 0a 20          u32 i;. 
304a0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
304b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
304c0 69 66 28 20 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c  if( eMode==BTALL
304d0 4f 43 5f 4c 45 20 29 7b 0a 20 20 20 20 20 20 20  OC_LE ){.       
304e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
304f0 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  k; i++){.       
30500 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67         iPage = g
30510 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
30520 2b 69 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20  +i*4]);.        
30530 20 20 20 20 20 20 69 66 28 20 69 50 61 67 65 3c        if( iPage<
30540 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20  =nearby ){.     
30550 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
30560 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  st = i;.        
30570 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
30580 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
30590 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
305a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
305b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64 69            int di
305c0 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
305d0 64 69 73 74 20 3d 20 73 71 6c 69 74 65 33 41 62  dist = sqlite3Ab
305e0 73 49 6e 74 33 32 28 67 65 74 34 62 79 74 65 28  sInt32(get4byte(
305f0 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
30600 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rby);.          
30610 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
30620 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
30630 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
30640 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65 74  ite3AbsInt32(get
30650 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
30660 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a  *4]) - nearby);.
30670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
30680 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20  ( d2<dist ){.   
30690 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
306a0 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
306b0 20 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d            dist =
306c0 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20   d2;.           
306d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
306e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
306f0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
30700 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20          closest 
30710 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = 0;.        }..
30720 20 20 20 20 20 20 20 20 69 50 61 67 65 20 3d 20          iPage = 
30730 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
30740 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20  8+closest*4]);. 
30750 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
30760 20 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29   iPage==mxPage )
30770 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50  ;.        if( iP
30780 61 67 65 3e 6d 78 50 61 67 65 20 29 7b 0a 20 20  age>mxPage ){.  
30790 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
307a0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
307b0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
307c0 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
307d0 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
307e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
307f0 69 50 61 67 65 3d 3d 6d 78 50 61 67 65 20 29 3b  iPage==mxPage );
30800 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
30810 61 72 63 68 4c 69 73 74 20 0a 20 20 20 20 20 20  archList .      
30820 20 20 20 7c 7c 20 28 69 50 61 67 65 3d 3d 6e 65     || (iPage==ne
30830 61 72 62 79 20 7c 7c 20 28 69 50 61 67 65 3c 6e  arby || (iPage<n
30840 65 61 72 62 79 20 26 26 20 65 4d 6f 64 65 3d 3d  earby && eMode==
30850 42 54 41 4c 4c 4f 43 5f 4c 45 29 29 20 0a 20 20  BTALLOC_LE)) .  
30860 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
30870 20 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74     int noContent
30880 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
30890 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
308a0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c        TRACE(("AL
308b0 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c  LOCATE: %d was l
308c0 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20  eaf %d of %d on 
308d0 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20  trunk %d".      
308e0 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64             ": %d
308f0 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73   more free pages
30900 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30910 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c        *pPgno, cl
30920 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75  osest+1, k, pTru
30930 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b  nk->pgno, n-1));
30940 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30950 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
30960 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
30970 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
30980 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
30990 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
309a0 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f           if( clo
309b0 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20 20  sest<k-1 ){.    
309c0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
309d0 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a  aData[8+closest*
309e0 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a 34  4], &aData[4+k*4
309f0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
30a00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75 74   }.          put
30a10 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d 2c  4byte(&aData[4],
30a20 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20   k-1);.         
30a30 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74   noContent = !bt
30a40 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74  reeGetHasContent
30a50 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3f 20 50  (pBt, *pPgno)? P
30a60 41 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45  AGER_GET_NOCONTE
30a70 4e 54 20 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  NT : 0;.        
30a80 20 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55    rc = btreeGetU
30a90 6e 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 2a  nusedPage(pBt, *
30aa0 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e  pPgno, ppPage, n
30ab0 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20 20 20  oContent);.     
30ac0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
30ad0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30ae0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30af0 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
30b00 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
30b10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
30b20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30b30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
30b40 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
30b50 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
30b60 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30       *ppPage = 0
30b70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
30b80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30b90 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
30ba0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
30bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
30bc0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
30bd0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
30be0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
30bf0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
30c00 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
30c10 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
30c20 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
30c30 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 61 70   freelist, so ap
30c40 70 65 6e 64 20 61 20 6e 65 77 20 70 61 67 65 20  pend a new page 
30c50 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  to the.    ** da
30c60 74 61 62 61 73 65 20 69 6d 61 67 65 2e 0a 20 20  tabase image..  
30c70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 72 6d    **.    ** Norm
30c80 61 6c 6c 79 2c 20 6e 65 77 20 70 61 67 65 73 20  ally, new pages 
30c90 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
30ca0 73 20 62 6c 6f 63 6b 20 63 61 6e 20 62 65 20 72  s block can be r
30cb0 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
30cc0 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 20 6c  e.    ** pager l
30cd0 61 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e  ayer with the 'n
30ce0 6f 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20  o-content' flag 
30cf0 73 65 74 2e 20 54 68 69 73 20 70 72 65 76 65 6e  set. This preven
30d00 74 73 20 74 68 65 20 70 61 67 65 72 0a 20 20 20  ts the pager.   
30d10 20 2a 2a 20 66 72 6f 6d 20 74 72 79 69 6e 67 20   ** from trying 
30d20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61 67 65  to read the page
30d30 73 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  s content from d
30d40 69 73 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  isk. However, if
30d50 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72   the.    ** curr
30d60 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
30d70 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e 20  has already run 
30d80 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 69 6e 63 72  one or more incr
30d90 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 0a 20  emental-vacuum. 
30da0 20 20 20 2a 2a 20 73 74 65 70 73 2c 20 74 68 65     ** steps, the
30db0 6e 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  n the page we ar
30dc0 65 20 61 62 6f 75 74 20 74 6f 20 61 6c 6c 6f 63  e about to alloc
30dd0 61 74 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ate may contain 
30de0 63 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 74  content.    ** t
30df0 68 61 74 20 69 73 20 72 65 71 75 69 72 65 64 20  hat is required 
30e00 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
30e10 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 49 6e 20 74  a rollback. In t
30e20 68 69 73 20 63 61 73 65 2c 20 64 6f 0a 20 20 20  his case, do.   
30e30 20 2a 2a 20 6e 6f 74 20 73 65 74 20 74 68 65 20   ** not set the 
30e40 6e 6f 2d 63 6f 6e 74 65 6e 74 20 66 6c 61 67 2e  no-content flag.
30e50 20 54 68 69 73 20 63 61 75 73 65 73 20 74 68 65   This causes the
30e60 20 70 61 67 65 72 20 74 6f 20 6c 6f 61 64 20 61   pager to load a
30e70 6e 64 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  nd journal.    *
30e80 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  * the current pa
30e90 67 65 20 63 6f 6e 74 65 6e 74 20 62 65 66 6f 72  ge content befor
30ea0 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 69 74  e overwriting it
30eb0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
30ec0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
30ed0 67 65 72 20 77 69 6c 6c 20 6e 6f 74 20 61 63 74  ger will not act
30ee0 75 61 6c 6c 79 20 61 74 74 65 6d 70 74 20 74 6f  ually attempt to
30ef0 20 6c 6f 61 64 20 6f 72 20 6a 6f 75 72 6e 61 6c   load or journal
30f00 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74   .    ** content
30f10 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 74 68   for any page th
30f20 61 74 20 72 65 61 6c 6c 79 20 64 6f 65 73 20 6c  at really does l
30f30 69 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  ie past the end 
30f40 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
30f50 20 20 20 20 2a 2a 20 66 69 6c 65 20 6f 6e 20 64      ** file on d
30f60 69 73 6b 2e 20 53 6f 20 74 68 65 20 65 66 66 65  isk. So the effe
30f70 63 74 73 20 6f 66 20 64 69 73 61 62 6c 69 6e 67  cts of disabling
30f80 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e 74 20   the no-content 
30f90 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20  optimization.   
30fa0 20 2a 2a 20 68 65 72 65 20 61 72 65 20 63 6f 6e   ** here are con
30fb0 66 69 6e 65 64 20 74 6f 20 74 68 6f 73 65 20 70  fined to those p
30fc0 61 67 65 73 20 74 68 61 74 20 6c 69 65 20 62 65  ages that lie be
30fd0 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
30fe0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
30ff0 62 61 73 65 20 69 6d 61 67 65 20 61 6e 64 20 74  base image and t
31000 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
31010 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
31020 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4e 6f 43   */.    int bNoC
31030 6f 6e 74 65 6e 74 20 3d 20 28 30 3d 3d 49 66 4e  ontent = (0==IfN
31040 6f 74 4f 6d 69 74 41 56 28 70 42 74 2d 3e 62 44  otOmitAV(pBt->bD
31050 6f 54 72 75 6e 63 61 74 65 29 29 3f 20 50 41 47  oTruncate))? PAG
31060 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54  ER_GET_NOCONTENT
31070 3a 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71  :0;..    rc = sq
31080 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
31090 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62  pBt->pPage1->pDb
310a0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
310b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
310c0 20 20 20 70 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b     pBt->nPage++;
310d0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50  .    if( pBt->nP
310e0 61 67 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  age==PENDING_BYT
310f0 45 5f 50 41 47 45 28 70 42 74 29 20 29 20 70 42  E_PAGE(pBt) ) pB
31100 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 0a 23 69 66  t->nPage++;..#if
31110 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
31120 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
31130 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
31140 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
31150 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
31160 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 2f  Page) ){.      /
31170 2a 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65  * If *pPgno refe
31180 72 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d  rs to a pointer-
31190 6d 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61  map page, alloca
311a0 74 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73  te two new pages
311b0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65  .      ** at the
311c0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
311d0 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e   instead of one.
311e0 20 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63   The first alloc
311f0 61 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20  ated page.      
31200 2a 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77  ** becomes a new
31210 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67   pointer-map pag
31220 65 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  e, the second is
31230 20 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c   used by the cal
31240 6c 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ler..      */.  
31250 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67      MemPage *pPg
31260 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
31270 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
31280 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
31290 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
312a0 61 67 65 29 5c 6e 22 2c 20 70 42 74 2d 3e 6e 50  age)\n", pBt->nP
312b0 61 67 65 29 29 3b 0a 20 20 20 20 20 20 61 73 73  age));.      ass
312c0 65 72 74 28 20 70 42 74 2d 3e 6e 50 61 67 65 21  ert( pBt->nPage!
312d0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
312e0 47 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20  GE(pBt) );.     
312f0 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 55 6e   rc = btreeGetUn
31300 75 73 65 64 50 61 67 65 28 70 42 74 2c 20 70 42  usedPage(pBt, pB
31310 74 2d 3e 6e 50 61 67 65 2c 20 26 70 50 67 2c 20  t->nPage, &pPg, 
31320 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 20  bNoContent);.   
31330 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31340 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
31350 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31360 72 57 72 69 74 65 28 70 50 67 2d 3e 70 44 62 50  rWrite(pPg->pDbP
31370 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  age);.        re
31380 6c 65 61 73 65 50 61 67 65 28 70 50 67 29 3b 0a  leasePage(pPg);.
31390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
313a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
313b0 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50 61  ;.      pBt->nPa
313c0 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
313d0 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
313e0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
313f0 74 29 20 29 7b 20 70 42 74 2d 3e 6e 50 61 67 65  t) ){ pBt->nPage
31400 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
31410 69 66 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  if.    put4byte(
31420 32 38 20 2b 20 28 75 38 2a 29 70 42 74 2d 3e 70  28 + (u8*)pBt->p
31430 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 70 42  Page1->aData, pB
31440 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20 2a  t->nPage);.    *
31450 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 50 61  pPgno = pBt->nPa
31460 67 65 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  ge;..    assert(
31470 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
31480 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
31490 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
314a0 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
314b0 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
314c0 67 65 2c 20 62 4e 6f 43 6f 6e 74 65 6e 74 29 3b  ge, bNoContent);
314d0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
314e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20  turn rc;.    rc 
314f0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31500 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
31510 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
31520 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31530 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
31540 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
31550 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
31560 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
31570 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
31580 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65  from end of file
31590 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
315a0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70   }..  assert( *p
315b0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
315c0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
315d0 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61  .end_allocate_pa
315e0 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  ge:.  releasePag
315f0 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72 65 6c  e(pTrunk);.  rel
31600 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72  easePage(pPrevTr
31610 75 6e 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20  unk);.  assert( 
31620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
31630 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
31640 65 52 65 66 63 6f 75 6e 74 28 28 2a 70 70 50 61  eRefcount((*ppPa
31650 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3c 3d 31  ge)->pDbPage)<=1
31660 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63   );.  assert( rc
31670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
31680 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69 74  *ppPage)->isInit
31690 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
316a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
316b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
316c0 65 64 20 74 6f 20 61 64 64 20 70 61 67 65 20 69  ed to add page i
316d0 50 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  Page to the data
316e0 62 61 73 65 20 66 69 6c 65 20 66 72 65 65 2d 6c  base file free-l
316f0 69 73 74 2e 20 0a 2a 2a 20 49 74 20 69 73 20 61  ist. .** It is a
31700 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
31710 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
31720 61 64 79 20 61 20 70 61 72 74 20 6f 66 20 74 68  ady a part of th
31730 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a 2a 2a 0a  e free-list..**.
31740 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 70 61 73  ** The value pas
31750 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
31760 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
31770 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f  is function is o
31780 70 74 69 6f 6e 61 6c 2e 0a 2a 2a 20 49 66 20 74  ptional..** If t
31790 68 65 20 63 61 6c 6c 65 72 20 68 61 70 70 65 6e  he caller happen
317a0 73 20 74 6f 20 68 61 76 65 20 61 20 70 6f 69 6e  s to have a poin
317b0 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  ter to the MemPa
317c0 67 65 20 6f 62 6a 65 63 74 20 0a 2a 2a 20 63 6f  ge object .** co
317d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70  rresponding to p
317e0 61 67 65 20 69 50 61 67 65 20 68 61 6e 64 79 2c  age iPage handy,
317f0 20 69 74 20 6d 61 79 20 70 61 73 73 20 69 74 20   it may pass it 
31800 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 76 61  as the second va
31810 6c 75 65 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  lue. .** Otherwi
31820 73 65 2c 20 69 74 20 6d 61 79 20 70 61 73 73 20  se, it may pass 
31830 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
31840 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4d 65   pointer to a Me
31850 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 69 73 20  mPage object is 
31860 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
31870 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
31880 2a 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  * its reference 
31890 63 6f 75 6e 74 20 69 73 20 6e 6f 74 20 61 6c 74  count is not alt
318a0 65 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  ered by this fun
318b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
318c0 20 69 6e 74 20 66 72 65 65 50 61 67 65 32 28 42   int freePage2(B
318d0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 4d 65  tShared *pBt, Me
318e0 6d 50 61 67 65 20 2a 70 4d 65 6d 50 61 67 65 2c  mPage *pMemPage,
318f0 20 50 67 6e 6f 20 69 50 61 67 65 29 7b 0a 20 20   Pgno iPage){.  
31900 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20  MemPage *pTrunk 
31910 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
31920 20 20 20 20 2f 2a 20 46 72 65 65 2d 6c 69 73 74      /* Free-list
31930 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 20   trunk page */. 
31940 20 50 67 6e 6f 20 69 54 72 75 6e 6b 20 3d 20 30   Pgno iTrunk = 0
31950 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31960 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
31970 62 65 72 20 6f 66 20 66 72 65 65 2d 6c 69 73 74  ber of free-list
31980 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 20 0a   trunk page */ .
31990 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
319a0 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
319b0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 72        /* Local r
319c0 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
319d0 20 31 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20   1 */.  MemPage 
319e0 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
319f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31a00 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 2e  age being freed.
31a10 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a 2f   May be NULL. */
31a20 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
31a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a40 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
31a50 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   Code */.  int n
31a60 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  Free;           
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31a80 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
31a90 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 66 72 65   of pages on fre
31aa0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
31ab0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
31ac0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
31ad0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
31ae0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 69   CORRUPT_DB || i
31af0 50 61 67 65 3e 31 20 29 3b 0a 20 20 61 73 73 65  Page>1 );.  asse
31b00 72 74 28 20 21 70 4d 65 6d 50 61 67 65 20 7c 7c  rt( !pMemPage ||
31b10 20 70 4d 65 6d 50 61 67 65 2d 3e 70 67 6e 6f 3d   pMemPage->pgno=
31b20 3d 69 50 61 67 65 20 29 3b 0a 0a 20 20 69 66 28  =iPage );..  if(
31b30 20 69 50 61 67 65 3c 32 20 29 20 72 65 74 75 72   iPage<2 ) retur
31b40 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
31b50 5f 42 4b 50 54 3b 0a 20 20 69 66 28 20 70 4d 65  _BKPT;.  if( pMe
31b60 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  mPage ){.    pPa
31b70 67 65 20 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20  ge = pMemPage;. 
31b80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
31b90 65 66 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ef(pPage->pDbPag
31ba0 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
31bb0 20 70 50 61 67 65 20 3d 20 62 74 72 65 65 50 61   pPage = btreePa
31bc0 67 65 4c 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50  geLookup(pBt, iP
31bd0 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  age);.  }..  /* 
31be0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72  Increment the fr
31bf0 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e  ee page count on
31c00 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63 20   pPage1 */.  rc 
31c10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
31c20 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50  ite(pPage1->pDbP
31c30 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  age);.  if( rc )
31c40 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
31c50 75 74 3b 0a 20 20 6e 46 72 65 65 20 3d 20 67 65  ut;.  nFree = ge
31c60 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31c70 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75  aData[36]);.  pu
31c80 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
31c90 61 44 61 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65  aData[36], nFree
31ca0 2b 31 29 3b 0a 0a 20 20 69 66 28 20 70 42 74 2d  +1);..  if( pBt-
31cb0 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
31cc0 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 29 7b  SECURE_DELETE ){
31cd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
31ce0 65 63 75 72 65 5f 64 65 6c 65 74 65 20 6f 70 74  ecure_delete opt
31cf0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
31d00 74 68 65 6e 0a 20 20 20 20 2a 2a 20 61 6c 77 61  then.    ** alwa
31d10 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69  ys fully overwri
31d20 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
31d30 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
31d40 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
31d50 28 20 28 21 70 50 61 67 65 20 26 26 20 28 28 72  ( (!pPage && ((r
31d60 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67 65  c = btreeGetPage
31d70 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
31d80 61 67 65 2c 20 30 29 29 21 3d 30 29 20 29 0a 20  age, 0))!=0) ). 
31d90 20 20 20 20 7c 7c 20 20 20 20 20 20 20 20 20 20      ||          
31da0 20 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33    ((rc = sqlite3
31db0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
31dc0 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 29 0a  ->pDbPage))!=0).
31dd0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67 6f 74      ){.      got
31de0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
31df0 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
31e00 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30  (pPage->aData, 0
31e10 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61  , pPage->pBt->pa
31e20 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
31e30 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
31e40 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
31e50 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
31e60 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
31e70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
31e80 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
31e90 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
31ea0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53  e..  */.  if( IS
31eb0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
31ec0 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
31ed0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
31ee0 52 45 45 50 41 47 45 2c 20 30 2c 20 26 72 63 29  REEPAGE, 0, &rc)
31ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
31f00 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
31f10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20  ;.  }..  /* Now 
31f20 6d 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61  manipulate the a
31f30 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66  ctual database f
31f40 72 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75  ree-list structu
31f50 72 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  re. There are tw
31f60 6f 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69  o.  ** possibili
31f70 74 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65  ties. If the fre
31f80 65 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e  e-list is curren
31f90 74 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66  tly empty, or if
31fa0 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20   the first.  ** 
31fb0 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
31fc0 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66  e free-list is f
31fd0 75 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ull, then this p
31fe0 61 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  age will become 
31ff0 61 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d  a.  ** new free-
32000 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e  list trunk page.
32010 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77   Otherwise, it w
32020 69 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61  ill become a lea
32030 66 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69  f of the.  ** fi
32040 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69  rst trunk page i
32050 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72  n the current fr
32060 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c  ee-list. This bl
32070 6f 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a  ock tests if it.
32080 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65    ** is possible
32090 20 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65   to add the page
320a0 20 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c   as a new free-l
320b0 69 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20  ist leaf..  */. 
320c0 20 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b   if( nFree!=0 ){
320d0 0a 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 20  .    u32 nLeaf; 
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
320f0 2a 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72  * Initial number
32100 20 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f   of leaf cells o
32110 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a  n trunk page */.
32120 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65  .    iTrunk = ge
32130 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
32140 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20  aData[32]);.    
32150 72 63 20 3d 20 62 74 72 65 65 47 65 74 50 61 67  rc = btreeGetPag
32160 65 28 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26  e(pBt, iTrunk, &
32170 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
32180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32190 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  K ){.      goto 
321a0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
321b0 20 20 7d 0a 0a 20 20 20 20 6e 4c 65 61 66 20 3d    }..    nLeaf =
321c0 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
321d0 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
321e0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75    assert( pBt->u
321f0 73 61 62 6c 65 53 69 7a 65 3e 33 32 20 29 3b 0a  sableSize>32 );.
32200 20 20 20 20 69 66 28 20 6e 4c 65 61 66 20 3e 20      if( nLeaf > 
32210 28 75 33 32 29 70 42 74 2d 3e 75 73 61 62 6c 65  (u32)pBt->usable
32220 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a 20 20  Size/4 - 2 ){.  
32230 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
32240 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
32250 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32260 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
32270 20 69 66 28 20 6e 4c 65 61 66 20 3c 20 28 75 33   if( nLeaf < (u3
32280 32 29 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  2)pBt->usableSiz
32290 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
322a0 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
322b0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
322c0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
322d0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
322e0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
322f0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
32300 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
32310 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
32320 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
32330 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
32340 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
32350 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
32360 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
32370 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
32380 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
32390 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
323a0 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
323b0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
323c0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
323d0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
323e0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
323f0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
32400 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
32410 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
32420 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
32430 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
32440 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
32450 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
32460 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
32470 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
32480 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
32490 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
324a0 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
324b0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
324c0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
324d0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75   we will continu
324e0 65 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68  e to restrict th
324f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
32500 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a  ies to usableSiz
32510 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a  e/4 - 8.      **
32520 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f   for now.  At so
32530 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  me point in the 
32540 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65  future (once eve
32550 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64  ryone has upgrad
32560 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33  ed.      ** to 3
32570 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77  .6.0 or later) w
32580 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65  e should conside
32590 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e  r fixing the con
325a0 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20  ditional above. 
325b0 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20       ** to read 
325c0 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22  "usableSize/4-2"
325d0 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61   instead of "usa
325e0 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20  bleSize/4-8"..  
325f0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
32600 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
32610 39 39 32 30 2d 31 31 35 37 36 20 48 6f 77 65 76  9920-11576 Howev
32620 65 72 2c 20 6e 65 77 65 72 20 76 65 72 73 69 6f  er, newer versio
32630 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 73 74 69  ns of SQLite sti
32640 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 61 76 6f 69  ll.      ** avoi
32650 64 20 75 73 69 6e 67 20 74 68 65 20 6c 61 73 74  d using the last
32660 20 73 69 78 20 65 6e 74 72 69 65 73 20 69 6e 20   six entries in 
32670 74 68 65 20 66 72 65 65 6c 69 73 74 20 74 72 75  the freelist tru
32680 6e 6b 20 70 61 67 65 20 61 72 72 61 79 20 69 6e  nk page array in
32690 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65 72 20  .      ** order 
326a0 74 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69  that database fi
326b0 6c 65 73 20 63 72 65 61 74 65 64 20 62 79 20 6e  les created by n
326c0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
326d0 20 53 51 4c 69 74 65 20 63 61 6e 20 62 65 0a 20   SQLite can be. 
326e0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 62 79 20       ** read by 
326f0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
32700 66 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20  f SQLite..      
32710 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
32720 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
32730 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
32740 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
32750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32760 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
32770 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c  Trunk->aData[4],
32780 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20 20 20 20   nLeaf+1);.     
32790 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72     put4byte(&pTr
327a0 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6e 4c 65  unk->aData[8+nLe
327b0 61 66 2a 34 5d 2c 20 69 50 61 67 65 29 3b 0a 20  af*4], iPage);. 
327c0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
327d0 20 26 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61   && (pBt->btsFla
327e0 67 73 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f  gs & BTS_SECURE_
327f0 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
32800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
32810 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
32820 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
32830 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
32840 20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61   rc = btreeSetHa
32850 73 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50  sContent(pBt, iP
32860 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
32870 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
32880 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
32890 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
328a0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
328b0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
328c0 20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61       goto freepa
328d0 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
328e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  }..  /* If contr
328f0 6f 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73  ol flows to this
32900 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20   point, then it 
32910 77 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65  was not possible
32920 20 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a   to add the.  **
32930 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
32940 66 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20  freed as a leaf 
32950 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73  page of the firs
32960 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66  t trunk in the f
32970 72 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50  ree-list..  ** P
32980 6f 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20  ossibly because 
32990 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
329a0 20 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69   empty, or possi
329b0 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
329c0 0a 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e  .  ** first trun
329d0 6b 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  k in the free-li
329e0 73 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68  st is full. Eith
329f0 65 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65  er way, the page
32a00 20 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a   being freed.  *
32a10 2a 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * will become th
32a20 65 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e  e new first trun
32a30 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72  k page in the fr
32a40 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  ee-list..  */.  
32a50 69 66 28 20 70 50 61 67 65 3d 3d 30 20 26 26 20  if( pPage==0 && 
32a60 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
32a70 20 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42   btreeGetPage(pB
32a80 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67 65  t, iPage, &pPage
32a90 2c 20 30 29 29 20 29 7b 0a 20 20 20 20 67 6f 74  , 0)) ){.    got
32aa0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
32ab0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
32ac0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
32ad0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
32ae0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32af0 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 72  K ){.    goto fr
32b00 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a  eepage_out;.  }.
32b10 20 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65    put4byte(pPage
32b20 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e 6b 29  ->aData, iTrunk)
32b30 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50  ;.  put4byte(&pP
32b40 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 30  age->aData[4], 0
32b50 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
32b60 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
32b70 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52 41 43  , iPage);.  TRAC
32b80 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
32b90 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61 67 65  d new trunk page
32ba0 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c 6e 22   replacing %d\n"
32bb0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 69  , pPage->pgno, i
32bc0 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65 70 61  Trunk));..freepa
32bd0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 50  ge_out:.  if( pP
32be0 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  age ){.    pPage
32bf0 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  ->isInit = 0;.  
32c00 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
32c10 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  pPage);.  releas
32c20 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
32c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
32c40 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 61  atic void freePa
32c50 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ge(MemPage *pPag
32c60 65 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20  e, int *pRC){.  
32c70 69 66 28 20 28 2a 70 52 43 29 3d 3d 53 51 4c 49  if( (*pRC)==SQLI
32c80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
32c90 43 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 50  C = freePage2(pP
32ca0 61 67 65 2d 3e 70 42 74 2c 20 70 50 61 67 65 2c  age->pBt, pPage,
32cb0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
32cc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
32cd0 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
32ce0 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
32cf0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
32d00 6c 6c 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  ll.  Write the.*
32d10 2a 20 6c 6f 63 61 6c 20 43 65 6c 6c 20 73 69 7a  * local Cell siz
32d20 65 20 28 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  e (the number of
32d30 20 62 79 74 65 73 20 6f 6e 20 74 68 65 20 6f 72   bytes on the or
32d40 69 67 69 6e 61 6c 20 70 61 67 65 2c 20 6f 6d 69  iginal page, omi
32d50 74 74 69 6e 67 0a 2a 2a 20 6f 76 65 72 66 6c 6f  tting.** overflo
32d60 77 29 20 69 6e 74 6f 20 2a 70 6e 53 69 7a 65 2e  w) into *pnSize.
32d70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
32d80 6c 65 61 72 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  learCell(.  MemP
32d90 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
32da0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
32db0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
32dc0 68 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he Cell */.  uns
32dd0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
32de0 6c 2c 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62  l,    /* First b
32df0 79 74 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 20  yte of the Cell 
32e00 2a 2f 0a 20 20 75 31 36 20 2a 70 6e 53 69 7a 65  */.  u16 *pnSize
32e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32e20 20 57 72 69 74 65 20 74 68 65 20 73 69 7a 65 20   Write the size 
32e30 6f 66 20 74 68 65 20 43 65 6c 6c 20 68 65 72 65  of the Cell here
32e40 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68 61 72 65   */.){.  BtShare
32e50 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
32e60 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
32e70 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
32e80 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
32e90 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
32ea0 75 33 32 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  u32 ovflPageSize
32eb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
32ec0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
32ed0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
32ee0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 78  x) );.  pPage->x
32ef0 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
32f00 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
32f10 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66 6f    *pnSize = info
32f20 2e 6e 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 6e  .nSize;.  if( in
32f30 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  fo.iOverflow==0 
32f40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
32f50 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
32f60 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
32f70 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
32f80 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
32f90 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
32fa0 2b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 2b  +info.iOverflow+
32fb0 33 20 3e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  3 > pPage->aData
32fc0 2b 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65  +pPage->maskPage
32fd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
32fe0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
32ff0 50 54 3b 20 20 2f 2a 20 43 65 6c 6c 20 65 78 74  PT;  /* Cell ext
33000 65 6e 64 73 20 70 61 73 74 20 65 6e 64 20 6f 66  ends past end of
33010 20 70 61 67 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f   page */.  }.  o
33020 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  vflPgno = get4by
33030 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
33040 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 61 73  Overflow]);.  as
33050 73 65 72 74 28 20 70 42 74 2d 3e 75 73 61 62 6c  sert( pBt->usabl
33060 65 53 69 7a 65 20 3e 20 34 20 29 3b 0a 20 20 6f  eSize > 4 );.  o
33070 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42  vflPageSize = pB
33080 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
33090 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e  4;.  nOvfl = (in
330a0 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e  fo.nPayload - in
330b0 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c  fo.nLocal + ovfl
330c0 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76  PageSize - 1)/ov
330d0 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73  flPageSize;.  as
330e0 73 65 72 74 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c  sert( nOvfl>0 ||
330f0 20 0a 20 20 20 20 28 43 4f 52 52 55 50 54 5f 44   .    (CORRUPT_D
33100 42 20 26 26 20 28 69 6e 66 6f 2e 6e 50 61 79 6c  B && (info.nPayl
33110 6f 61 64 20 2b 20 6f 76 66 6c 50 61 67 65 53 69  oad + ovflPageSi
33120 7a 65 29 3c 6f 76 66 6c 50 61 67 65 53 69 7a 65  ze)<ovflPageSize
33130 29 0a 20 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  ).  );.  while( 
33140 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 50  nOvfl-- ){.    P
33150 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b 0a 20  gno iNext = 0;. 
33160 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76 66     MemPage *pOvf
33170 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  l = 0;.    if( o
33180 76 66 6c 50 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66  vflPgno<2 || ovf
33190 6c 50 67 6e 6f 3e 62 74 72 65 65 50 61 67 65 63  lPgno>btreePagec
331a0 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
331b0 20 20 20 2f 2a 20 30 20 69 73 20 6e 6f 74 20 61     /* 0 is not a
331c0 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d 62   legal page numb
331d0 65 72 20 61 6e 64 20 70 61 67 65 20 31 20 63 61  er and page 1 ca
331e0 6e 6e 6f 74 20 62 65 20 61 6e 20 0a 20 20 20 20  nnot be an .    
331f0 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
33200 67 65 2e 20 54 68 65 72 65 66 6f 72 65 20 69 66  ge. Therefore if
33210 20 6f 76 66 6c 50 67 6e 6f 3c 32 20 6f 72 20 70   ovflPgno<2 or p
33220 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
33230 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  he .      ** fil
33240 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
33250 75 73 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20  ust be corrupt. 
33260 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
33270 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
33280 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  KPT;.    }.    i
33290 66 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( nOvfl ){.    
332a0 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
332b0 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
332c0 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69  Pgno, &pOvfl, &i
332d0 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Next);.      if(
332e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
332f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
33300 28 20 70 4f 76 66 6c 20 7c 7c 20 28 28 70 4f 76  ( pOvfl || ((pOv
33310 66 6c 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f  fl = btreePageLo
33320 6f 6b 75 70 28 70 42 74 2c 20 6f 76 66 6c 50 67  okup(pBt, ovflPg
33330 6e 6f 29 29 21 3d 30 29 20 29 0a 20 20 20 20 20  no))!=0) ).     
33340 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  && sqlite3PagerP
33350 61 67 65 52 65 66 63 6f 75 6e 74 28 70 4f 76 66  ageRefcount(pOvf
33360 6c 2d 3e 70 44 62 50 61 67 65 29 21 3d 31 0a 20  l->pDbPage)!=1. 
33370 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54     ){.      /* T
33380 68 65 72 65 20 69 73 20 6e 6f 20 72 65 61 73 6f  here is no reaso
33390 6e 20 61 6e 79 20 63 75 72 73 6f 72 20 73 68 6f  n any cursor sho
333a0 75 6c 64 20 68 61 76 65 20 61 6e 20 6f 75 74 73  uld have an outs
333b0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
333c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  e .      ** to a
333d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  n overflow page 
333e0 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 61 20 63  belonging to a c
333f0 65 6c 6c 20 74 68 61 74 20 69 73 20 62 65 69 6e  ell that is bein
33400 67 20 64 65 6c 65 74 65 64 2f 75 70 64 61 74 65  g deleted/update
33410 64 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 20 69  d..      ** So i
33420 66 20 74 68 65 72 65 20 65 78 69 73 74 73 20 6d  f there exists m
33430 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66  ore than one ref
33440 65 72 65 6e 63 65 20 74 6f 20 74 68 69 73 20 70  erence to this p
33450 61 67 65 2c 20 74 68 65 6e 20 69 74 20 0a 20 20  age, then it .  
33460 20 20 20 20 2a 2a 20 6d 75 73 74 20 6e 6f 74 20      ** must not 
33470 72 65 61 6c 6c 79 20 62 65 20 61 6e 20 6f 76 65  really be an ove
33480 72 66 6c 6f 77 20 70 61 67 65 20 61 6e 64 20 74  rflow page and t
33490 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74  he database must
334a0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 0a 20 20   be corrupt. .  
334b0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 68 65 6c      ** It is hel
334c0 70 66 75 6c 20 74 6f 20 64 65 74 65 63 74 20 74  pful to detect t
334d0 68 69 73 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  his before calli
334e0 6e 67 20 66 72 65 65 50 61 67 65 32 28 29 2c 20  ng freePage2(), 
334f0 61 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 72 65  as .      ** fre
33500 65 50 61 67 65 32 28 29 20 6d 61 79 20 7a 65 72  ePage2() may zer
33510 6f 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  o the page conte
33520 6e 74 73 20 69 66 20 73 65 63 75 72 65 2d 64 65  nts if secure-de
33530 6c 65 74 65 20 6d 6f 64 65 20 69 73 0a 20 20 20  lete mode is.   
33540 20 20 20 2a 2a 20 65 6e 61 62 6c 65 64 2e 20 49     ** enabled. I
33550 66 20 74 68 69 73 20 27 6f 76 65 72 66 6c 6f 77  f this 'overflow
33560 27 20 70 61 67 65 20 68 61 70 70 65 6e 73 20 74  ' page happens t
33570 6f 20 62 65 20 61 20 70 61 67 65 20 74 68 61 74  o be a page that
33580 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
33590 6c 6c 65 72 20 69 73 20 69 74 65 72 61 74 69 6e  ller is iteratin
335a0 67 20 74 68 72 6f 75 67 68 20 6f 72 20 75 73 69  g through or usi
335b0 6e 67 20 69 6e 20 73 6f 6d 65 20 6f 74 68 65 72  ng in some other
335c0 20 77 61 79 2c 20 74 68 69 73 0a 20 20 20 20 20   way, this.     
335d0 20 2a 2a 20 63 61 6e 20 62 65 20 70 72 6f 62 6c   ** can be probl
335e0 65 6d 61 74 69 63 2e 0a 20 20 20 20 20 20 2a 2f  ematic..      */
335f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
33600 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33610 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33620 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 32    rc = freePage2
33630 28 70 42 74 2c 20 70 4f 76 66 6c 2c 20 6f 76 66  (pBt, pOvfl, ovf
33640 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20  lPgno);.    }.. 
33650 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a     if( pOvfl ){.
33660 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
33670 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70  erUnref(pOvfl->p
33680 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  DbPage);.    }. 
33690 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
336a0 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50  rn rc;.    ovflP
336b0 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d  gno = iNext;.  }
336c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
336d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
336e0 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65  eate the byte se
336f0 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72  quence used to r
33700 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20  epresent a cell 
33710 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a  on page pPage.**
33720 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20   and write that 
33730 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e  byte sequence in
33740 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65  to pCell[].  Ove
33750 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a  rflow pages are.
33760 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  ** allocated and
33770 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65   filled in as ne
33780 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61  cessary.  The ca
33790 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a  lling procedure.
337a0 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
337b0 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72  e for making sur
337c0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
337d0 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f  ce has been allo
337e0 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65  cated.** for pCe
337f0 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ll[]..**.** Note
33800 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73   that pCell does
33810 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e   not necessary n
33820 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  eed to point to 
33830 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
33840 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c  .** area.  pCell
33850 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
33860 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73  some temporary s
33870 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c  torage.  The cel
33880 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e  l will.** be con
33890 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73  structed in this
338a0 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20   temporary area 
338b0 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f  then copied into
338c0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a   pPage->aData.**
338d0 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   later..*/.stati
338e0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c  c int fillInCell
338f0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
33900 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ge,             
33910 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
33920 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
33930 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67   cell */.  unsig
33940 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c  ned char *pCell,
33950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
33960 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68  plete text of th
33970 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73  e cell */.  cons
33980 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36  t void *pKey, i6
33990 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68  4 nKey,    /* Th
339a0 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  e key */.  const
339b0 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74   void *pData,int
339c0 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65   nData,   /* The
339d0 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e   data */.  int n
339e0 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Zero,           
339f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
33a00 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f  ra zero bytes to
33a10 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61   append to pData
33a20 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a   */.  int *pnSiz
33a30 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
33a40 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65       /* Write ce
33a50 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a  ll size here */.
33a60 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61  ){.  int nPayloa
33a70 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  d;.  const u8 *p
33a80 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c  Src;.  int nSrc,
33a90 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70   n, rc;.  int sp
33aa0 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61  aceLeft;.  MemPa
33ab0 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20  ge *pOvfl = 0;. 
33ac0 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c   MemPage *pToRel
33ad0 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69  ease = 0;.  unsi
33ae0 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f  gned char *pPrio
33af0 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
33b00 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20  ar *pPayload;.  
33b10 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
33b20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67  pPage->pBt;.  Pg
33b30 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b  no pgnoOvfl = 0;
33b40 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a  .  int nHeader;.
33b50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
33b60 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
33b70 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
33b80 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
33b90 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
33ba0 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
33bb0 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
33bc0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
33bd0 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
33be0 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
33bf0 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
33c00 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
33c10 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
33c20 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
33c30 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
33c40 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
33c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
33c60 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
33c70 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
33c80 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
33c90 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
33ca0 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
33cb0 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  r = pPage->child
33cc0 50 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c  PtrSize;.  nPayl
33cd0 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a  oad = nData + nZ
33ce0 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ero;.  if( pPage
33cf0 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a  ->intKeyLeaf ){.
33d00 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
33d10 75 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  utVarint32(&pCel
33d20 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79  l[nHeader], nPay
33d30 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  load);.  }else{.
33d40 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 61 74      assert( nDat
33d50 61 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  a==0 );.    asse
33d60 72 74 28 20 6e 5a 65 72 6f 3d 3d 30 20 29 3b 0a  rt( nZero==0 );.
33d70 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
33d80 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
33d90 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
33da0 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 0a 20 20  4*)&nKey);.  .  
33db0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
33dc0 61 79 6c 6f 61 64 20 73 69 7a 65 20 2a 2f 0a 20  ayload size */. 
33dd0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
33de0 65 79 20 29 7b 0a 20 20 20 20 70 53 72 63 20 3d  ey ){.    pSrc =
33df0 20 70 44 61 74 61 3b 0a 20 20 20 20 6e 53 72 63   pData;.    nSrc
33e00 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44   = nData;.    nD
33e10 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ata = 0;.  }else
33e20 7b 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  { .    assert( n
33e30 4b 65 79 3c 3d 30 78 37 66 66 66 66 66 66 66 20  Key<=0x7fffffff 
33e40 26 26 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20  && pKey!=0 );.  
33e50 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 69 6e    nPayload = (in
33e60 74 29 6e 4b 65 79 3b 0a 20 20 20 20 70 53 72 63  t)nKey;.    pSrc
33e70 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72   = pKey;.    nSr
33e80 63 20 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20  c = (int)nKey;. 
33e90 20 7d 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61   }.  if( nPayloa
33ea0 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
33eb0 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48  al ){.    n = nH
33ec0 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
33ed0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
33ee0 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
33ef0 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
33f00 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
33f10 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
33f20 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
33f30 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  t = nPayload;.  
33f40 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c    pPrior = pCell
33f50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
33f60 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  nt mn = pPage->m
33f70 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d  inLocal;.    n =
33f80 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
33f90 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
33fa0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
33fb0 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
33fc0 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
33fd0 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
33fe0 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
33ff0 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
34000 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67      if( n > pPag
34010 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
34020 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  = mn;.    spaceL
34030 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e  eft = n;.    *pn
34040 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
34050 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69  er + 4;.    pPri
34060 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
34070 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50  der+n];.  }.  pP
34080 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
34090 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20  nHeader];..  /* 
340a0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
340b0 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
340c0 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
340d0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
340e0 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
340f0 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
34100 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
34110 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
34120 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
34130 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
34140 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
34150 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
34160 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
34170 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
34180 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
34190 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
341a0 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
341b0 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
341c0 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
341d0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
341e0 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
341f0 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
34200 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
34210 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
34220 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
34230 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
34240 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
34250 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
34260 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
34270 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
34280 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
34290 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
342a0 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
342b0 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
342c0 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
342d0 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
342e0 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c  ly..  */.#if SQL
342f0 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20  ITE_DEBUG.  {.  
34300 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
34310 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
34320 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
34330 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
34340 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72   assert( nHeader
34350 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61 79  =(int)(info.pPay
34360 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29 3b  load - pCell) );
34370 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 66  .    assert( inf
34380 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a  o.nKey==nKey );.
34390 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 6e 53      assert( *pnS
343a0 69 7a 65 20 3d 3d 20 69 6e 66 6f 2e 6e 53 69 7a  ize == info.nSiz
343b0 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
343c0 20 73 70 61 63 65 4c 65 66 74 20 3d 3d 20 69 6e   spaceLeft == in
343d0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  fo.nLocal );.   
343e0 20 61 73 73 65 72 74 28 20 70 50 72 69 6f 72 20   assert( pPrior 
343f0 3d 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  == &pCell[info.i
34400 4f 76 65 72 66 6c 6f 77 5d 20 29 3b 0a 20 20 7d  Overflow] );.  }
34410 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 57 72  .#endif..  /* Wr
34420 69 74 65 20 74 68 65 20 70 61 79 6c 6f 61 64 20  ite the payload 
34430 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 43  into the local C
34440 65 6c 6c 20 61 6e 64 20 61 6e 79 20 65 78 74 72  ell and any extr
34450 61 20 69 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  a into overflow 
34460 70 61 67 65 73 20 2a 2f 0a 20 20 77 68 69 6c 65  pages */.  while
34470 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a  ( nPayload>0 ){.
34480 20 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66      if( spaceLef
34490 74 3d 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20  t==0 ){.#ifndef 
344a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
344b0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e  VACUUM.      Pgn
344c0 6f 20 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70  o pgnoPtrmap = p
344d0 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72  gnoOvfl; /* Over
344e0 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
344f0 72 2d 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65  r-map entry page
34500 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
34510 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
34520 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  .        do{.   
34530 20 20 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b         pgnoOvfl+
34540 2b 3b 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69  +;.        } whi
34550 6c 65 28 20 0a 20 20 20 20 20 20 20 20 20 20 50  le( .          P
34560 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
34570 2c 20 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70  , pgnoOvfl) || p
34580 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47  gnoOvfl==PENDING
34590 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
345a0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
345b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
345c0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
345d0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f  reePage(pBt, &pO
345e0 76 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20  vfl, &pgnoOvfl, 
345f0 70 67 6e 6f 4f 76 66 6c 2c 20 30 29 3b 0a 23 69  pgnoOvfl, 0);.#i
34600 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34610 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
34620 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74     /* If the dat
34630 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
34640 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20  uto-vacuum, and 
34650 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73 75  the second or su
34660 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20 2a  bsequent.      *
34670 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * overflow page 
34680 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74  is being allocat
34690 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72 79  ed, add an entry
346a0 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
346b0 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72  map.      ** for
346c0 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e 20   that page now. 
346d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
346e0 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ** If this is th
346f0 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
34700 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69 74   page, then writ
34710 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74 72  e a partial entr
34720 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  y .      ** to t
34730 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20  he pointer-map. 
34740 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74 68  If we write noth
34750 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ing to this poin
34760 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20  ter-map slot,.  
34770 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
34780 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72 66  optimistic overf
34790 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65 73  low chain proces
347a0 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65 6c  sing in clearCel
347b0 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  l().      ** may
347c0 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74 68   misinterpret th
347d0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  e uninitialized 
347e0 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65 74  values and delet
347f0 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 77  e the.      ** w
34800 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d 20  rong pages from 
34810 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
34820 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
34830 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
34840 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
34850 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  K ){.        u8 
34860 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74 72  eType = (pgnoPtr
34870 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46  map?PTRMAP_OVERF
34880 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52  LOW2:PTRMAP_OVER
34890 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20 20  FLOW1);.        
348a0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
348b0 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
348c0 70 67 6e 6f 50 74 72 6d 61 70 2c 20 26 72 63 29  pgnoPtrmap, &rc)
348d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
348e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
348f0 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c 29  leasePage(pOvfl)
34900 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34910 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
34920 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
34930 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34940 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
34950 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34960 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
34970 20 49 66 20 70 54 6f 52 65 6c 65 61 73 65 20 69   If pToRelease i
34980 73 20 6e 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20  s not zero than 
34990 70 50 72 69 6f 72 20 70 6f 69 6e 74 73 20 69 6e  pPrior points in
349a0 74 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61  to the data area
349b0 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f  .      ** of pTo
349c0 52 65 6c 65 61 73 65 2e 20 20 4d 61 6b 65 20 73  Release.  Make s
349d0 75 72 65 20 70 54 6f 52 65 6c 65 61 73 65 20 69  ure pToRelease i
349e0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
349f0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  e. */.      asse
34a00 72 74 28 20 70 54 6f 52 65 6c 65 61 73 65 3d 3d  rt( pToRelease==
34a10 30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65  0 || sqlite3Page
34a20 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 54 6f  rIswriteable(pTo
34a30 52 65 6c 65 61 73 65 2d 3e 70 44 62 50 61 67 65  Release->pDbPage
34a40 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  ) );..      /* I
34a50 66 20 70 50 72 69 6f 72 20 69 73 20 70 61 72 74  f pPrior is part
34a60 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 72 65   of the data are
34a70 61 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 6e  a of pPage, then
34a80 20 6d 61 6b 65 20 73 75 72 65 20 70 50 61 67 65   make sure pPage
34a90 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 73 74 69  .      ** is sti
34aa0 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a 2f 0a  ll writeable */.
34ab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
34ac0 72 69 6f 72 3c 70 50 61 67 65 2d 3e 61 44 61 74  rior<pPage->aDat
34ad0 61 20 7c 7c 20 70 50 72 69 6f 72 3e 3d 26 70 50  a || pPrior>=&pP
34ae0 61 67 65 2d 3e 61 44 61 74 61 5b 70 42 74 2d 3e  age->aData[pBt->
34af0 70 61 67 65 53 69 7a 65 5d 0a 20 20 20 20 20 20  pageSize].      
34b00 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
34b10 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34b20 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
34b30 20 29 3b 0a 0a 20 20 20 20 20 20 70 75 74 34 62   );..      put4b
34b40 79 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f  yte(pPrior, pgno
34b50 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c  Ovfl);.      rel
34b60 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
34b70 61 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52  ase);.      pToR
34b80 65 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a  elease = pOvfl;.
34b90 20 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70        pPrior = p
34ba0 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20  Ovfl->aData;.   
34bb0 20 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69     put4byte(pPri
34bc0 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  or, 0);.      pP
34bd0 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d  ayload = &pOvfl-
34be0 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20  >aData[4];.     
34bf0 20 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74   spaceLeft = pBt
34c00 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34  ->usableSize - 4
34c10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20  ;.    }.    n = 
34c20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66  nPayload;.    if
34c30 28 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20  ( n>spaceLeft ) 
34c40 6e 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 0a  n = spaceLeft;..
34c50 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c      /* If pToRel
34c60 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f  ease is not zero
34c70 20 74 68 61 6e 20 70 50 61 79 6c 6f 61 64 20 70   than pPayload p
34c80 6f 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64  oints into the d
34c90 61 74 61 20 61 72 65 61 0a 20 20 20 20 2a 2a 20  ata area.    ** 
34ca0 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20  of pToRelease.  
34cb0 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c  Make sure pToRel
34cc0 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72  ease is still wr
34cd0 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  iteable. */.    
34ce0 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65 61  assert( pToRelea
34cf0 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  se==0 || sqlite3
34d00 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
34d10 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44 62  (pToRelease->pDb
34d20 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  Page) );..    /*
34d30 20 49 66 20 70 50 61 79 6c 6f 61 64 20 69 73 20   If pPayload is 
34d40 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
34d50 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c 20   area of pPage, 
34d60 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20 70  then make sure p
34d70 50 61 67 65 0a 20 20 20 20 2a 2a 20 69 73 20 73  Page.    ** is s
34d80 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 20 2a  till writeable *
34d90 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
34da0 61 79 6c 6f 61 64 3c 70 50 61 67 65 2d 3e 61 44  ayload<pPage->aD
34db0 61 74 61 20 7c 7c 20 70 50 61 79 6c 6f 61 64 3e  ata || pPayload>
34dc0 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  =&pPage->aData[p
34dd0 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20 20  Bt->pageSize].  
34de0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
34df0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
34e00 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
34e10 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 69 66 28  age) );..    if(
34e20 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 20   nSrc>0 ){.     
34e30 20 69 66 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20   if( n>nSrc ) n 
34e40 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20 20 61 73  = nSrc;.      as
34e50 73 65 72 74 28 20 70 53 72 63 20 29 3b 0a 20 20  sert( pSrc );.  
34e60 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
34e70 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20  oad, pSrc, n);. 
34e80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34e90 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f 61 64 2c  memset(pPayload,
34ea0 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   0, n);.    }.  
34eb0 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b    nPayload -= n;
34ec0 0a 20 20 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d  .    pPayload +=
34ed0 20 6e 3b 0a 20 20 20 20 70 53 72 63 20 2b 3d 20   n;.    pSrc += 
34ee0 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e  n;.    nSrc -= n
34ef0 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66 74 20  ;.    spaceLeft 
34f00 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53  -= n;.    if( nS
34f10 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  rc==0 ){.      n
34f20 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
34f30 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
34f40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c  .    }.  }.  rel
34f50 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65  easePage(pToRele
34f60 61 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ase);.  return S
34f70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
34f80 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d  ** Remove the i-
34f90 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61  th cell from pPa
34fa0 67 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ge.  This routin
34fb0 65 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20  e effects pPage 
34fc0 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c  only..** The cel
34fd0 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74  l content is not
34fe0 20 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f   freed or deallo
34ff0 63 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73  cated.  It is as
35000 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68  sumed that.** th
35010 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68  e cell content h
35020 61 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73  as been copied s
35030 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20  omeplace else.  
35040 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73  This routine jus
35050 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65  t.** removes the
35060 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
35070 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  e cell from pPag
35080 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75  e..**.** "sz" mu
35090 73 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72  st be the number
350a0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
350b0 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   cell..*/.static
350c0 20 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d   void dropCell(M
350d0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
350e0 6e 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 2c 20  nt idx, int sz, 
350f0 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 75 33 32  int *pRC){.  u32
35100 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   pc;         /* 
35110 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63  Offset to cell c
35120 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62  ontent of cell b
35130 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a  eing deleted */.
35140 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
35150 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74    /* pPage->aDat
35160 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20  a */.  u8 *ptr; 
35170 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
35180 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f  o move bytes aro
35190 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b  und within data[
351a0 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
351b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
351c0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
351d0 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 2f  nt hdr;        /
351e0 2a 20 42 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  * Beginning of t
351f0 68 65 20 68 65 61 64 65 72 2e 20 20 30 20 6d 6f  he header.  0 mo
35200 73 74 20 70 61 67 65 73 2e 20 20 31 30 30 20 70  st pages.  100 p
35210 61 67 65 20 31 20 2a 2f 0a 0a 20 20 69 66 28 20  age 1 */..  if( 
35220 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
35230 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
35240 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
35250 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
35260 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
35270 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61  sz==cellSize(pPa
35280 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73  ge, idx) );.  as
35290 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
352a0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
352b0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
352c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
352d0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
352e0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
352f0 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61   );.  data = pPa
35300 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72  ge->aData;.  ptr
35310 20 3d 20 26 70 50 61 67 65 2d 3e 61 43 65 6c 6c   = &pPage->aCell
35320 49 64 78 5b 32 2a 69 64 78 5d 3b 0a 20 20 70 63  Idx[2*idx];.  pc
35330 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
35340 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  ;.  hdr = pPage-
35350 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 74 65  >hdrOffset;.  te
35360 73 74 63 61 73 65 28 20 70 63 3d 3d 67 65 74 32  stcase( pc==get2
35370 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
35380 5d 29 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  ]) );.  testcase
35390 28 20 70 63 2b 73 7a 3d 3d 70 50 61 67 65 2d 3e  ( pc+sz==pPage->
353a0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
353b0 29 3b 0a 20 20 69 66 28 20 70 63 20 3c 20 28 75  );.  if( pc < (u
353c0 33 32 29 67 65 74 32 62 79 74 65 28 26 64 61 74  32)get2byte(&dat
353d0 61 5b 68 64 72 2b 35 5d 29 20 7c 7c 20 70 63 2b  a[hdr+5]) || pc+
353e0 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d  sz > pPage->pBt-
353f0 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20  >usableSize ){. 
35400 20 20 20 2a 70 52 43 20 3d 20 53 51 4c 49 54 45     *pRC = SQLITE
35410 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
35420 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
35430 20 72 63 20 3d 20 66 72 65 65 53 70 61 63 65 28   rc = freeSpace(
35440 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a  pPage, pc, sz);.
35450 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35460 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
35470 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 50 61  eturn;.  }.  pPa
35480 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 69  ge->nCell--;.  i
35490 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
354a0 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  =0 ){.    memset
354b0 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30  (&data[hdr+1], 0
354c0 2c 20 34 29 3b 0a 20 20 20 20 64 61 74 61 5b 68  , 4);.    data[h
354d0 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 70  dr+7] = 0;.    p
354e0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
354f0 72 2b 35 5d 2c 20 70 50 61 67 65 2d 3e 70 42 74  r+5], pPage->pBt
35500 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
35510 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
35520 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
35530 61 62 6c 65 53 69 7a 65 20 2d 20 70 50 61 67 65  ableSize - pPage
35540 2d 3e 68 64 72 4f 66 66 73 65 74 0a 20 20 20 20  ->hdrOffset.    
35550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35560 20 20 20 2d 20 70 50 61 67 65 2d 3e 63 68 69 6c     - pPage->chil
35570 64 50 74 72 53 69 7a 65 20 2d 20 38 3b 0a 20 20  dPtrSize - 8;.  
35580 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 6d 6f  }else{.    memmo
35590 76 65 28 70 74 72 2c 20 70 74 72 2b 32 2c 20 32  ve(ptr, ptr+2, 2
355a0 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
355b0 20 69 64 78 29 29 3b 0a 20 20 20 20 70 75 74 32   idx));.    put2
355c0 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
355d0 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29  ], pPage->nCell)
355e0 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72  ;.    pPage->nFr
355f0 65 65 20 2b 3d 20 32 3b 0a 20 20 7d 0a 7d 0a 0a  ee += 2;.  }.}..
35600 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e  /*.** Insert a n
35610 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65  ew cell on pPage
35620 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22   at cell index "
35630 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74  i".  pCell point
35640 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  s to the.** cont
35650 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e  ent of the cell.
35660 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65  .**.** If the ce
35670 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20  ll content will 
35680 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  fit on the page,
35690 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68 65   then put it the
356a0 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69  re.  If it.** wi
356b0 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e  ll not fit, then
356c0 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
356d0 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
356e0 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a   into pTemp if.*
356f0 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e  * pTemp is not n
35700 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73  ull.  Regardless
35710 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63   of pTemp, alloc
35720 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a  ate a new entry.
35730 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 70 4f  ** in pPage->apO
35740 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
35750 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
35760 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
35770 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
35780 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
35790 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
357a0 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
357b0 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
357c0 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
357d0 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
357e0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
357f0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35800 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
35810 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
35820 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65  insertCell(.  Me
35830 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20  mPage *pPage,   
35840 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69  /* Page into whi
35850 63 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e  ch we are copyin
35860 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20  g */.  int i,   
35870 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
35880 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65  cell becomes the
35890 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68   i-th cell of th
358a0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
358b0 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  pCell,        /*
358c0 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   Content of the 
358d0 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  new cell */.  in
358e0 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20  t sz,           
358f0 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74  /* Bytes of cont
35900 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a  ent in pCell */.
35910 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20    u8 *pTemp,    
35920 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
35930 61 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43  age space for pC
35940 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a  ell, if needed *
35950 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
35960 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
35970 7a 65 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69  zero, replace fi
35980 72 73 74 20 34 20 62 79 74 65 73 20 77 69 74 68  rst 4 bytes with
35990 20 74 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20   this value */. 
359a0 20 69 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20   int *pRC       
359b0 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77     /* Read and w
359c0 72 69 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65  rite return code
359d0 20 66 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b   from here */.){
359e0 0a 20 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20  .  int idx = 0; 
359f0 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f       /* Where to
35a00 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20   write new cell 
35a10 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b  content in data[
35a20 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20  ] */.  int j;   
35a30 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
35a40 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38   counter */.  u8
35a50 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
35a60 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f  /* The content o
35a70 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65  f the whole page
35a80 20 2a 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20   */.  u8 *pIns; 
35a90 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
35aa0 6f 69 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61  oint in pPage->a
35ab0 43 65 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20  CellIdx[] where 
35ac0 6e 6f 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64  no cell inserted
35ad0 20 2a 2f 0a 0a 20 20 69 66 28 20 2a 70 52 43 20   */..  if( *pRC 
35ae0 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 61 73 73  ) return;..  ass
35af0 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
35b00 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
35b10 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
35b20 0a 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45  .  assert( MX_CE
35b30 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d  LL(pPage->pBt)<=
35b40 31 30 39 32 31 20 29 3b 0a 20 20 61 73 73 65 72  10921 );.  asser
35b50 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c  t( pPage->nCell<
35b60 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
35b70 70 42 74 29 20 7c 7c 20 43 4f 52 52 55 50 54 5f  pBt) || CORRUPT_
35b80 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
35b90 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
35ba0 3c 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  <=ArraySize(pPag
35bb0 65 2d 3e 61 70 4f 76 66 6c 29 20 29 3b 0a 20 20  e->apOvfl) );.  
35bc0 61 73 73 65 72 74 28 20 41 72 72 61 79 53 69 7a  assert( ArraySiz
35bd0 65 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29  e(pPage->apOvfl)
35be0 3d 3d 41 72 72 61 79 53 69 7a 65 28 70 50 61 67  ==ArraySize(pPag
35bf0 65 2d 3e 61 69 4f 76 66 6c 29 20 29 3b 0a 20 20  e->aiOvfl) );.  
35c00 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
35c10 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
35c20 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
35c30 0a 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 73  .  /* The cell s
35c40 68 6f 75 6c 64 20 6e 6f 72 6d 61 6c 6c 79 20 62  hould normally b
35c50 65 20 73 69 7a 65 64 20 63 6f 72 72 65 63 74 6c  e sized correctl
35c60 79 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65  y.  However, whe
35c70 6e 20 6d 6f 76 69 6e 67 20 61 0a 20 20 2a 2a 20  n moving a.  ** 
35c80 6d 61 6c 66 6f 72 6d 65 64 20 63 65 6c 6c 20 66  malformed cell f
35c90 72 6f 6d 20 61 20 6c 65 61 66 20 70 61 67 65 20  rom a leaf page 
35ca0 74 6f 20 61 6e 20 69 6e 74 65 72 69 6f 72 20 70  to an interior p
35cb0 61 67 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c  age, if the cell
35cc0 20 73 69 7a 65 0a 20 20 2a 2a 20 77 61 6e 74 65   size.  ** wante
35cd0 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61  d to be less tha
35ce0 6e 20 34 20 62 75 74 20 67 6f 74 20 72 6f 75 6e  n 4 but got roun
35cf0 64 65 64 20 75 70 20 74 6f 20 34 20 6f 6e 20 74  ded up to 4 on t
35d00 68 65 20 6c 65 61 66 2c 20 74 68 65 6e 20 73 69  he leaf, then si
35d10 7a 65 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ze.  ** might be
35d20 20 6c 65 73 73 20 74 68 61 6e 20 38 20 28 6c 65   less than 8 (le
35d30 61 66 2d 73 69 7a 65 20 2b 20 70 6f 69 6e 74 65  af-size + pointe
35d40 72 29 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 69  r) on the interi
35d50 6f 72 20 6e 6f 64 65 2e 20 20 48 65 6e 63 65 0a  or node.  Hence.
35d60 20 20 2a 2a 20 74 68 65 20 74 65 72 6d 20 61 66    ** the term af
35d70 74 65 72 20 74 68 65 20 7c 7c 20 69 6e 20 74 68  ter the || in th
35d80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
35d90 72 74 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72  rt(). */.  asser
35da0 74 28 20 73 7a 3d 3d 70 50 61 67 65 2d 3e 78 43  t( sz==pPage->xC
35db0 65 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 70  ellSize(pPage, p
35dc0 43 65 6c 6c 29 20 7c 7c 20 28 73 7a 3d 3d 38 20  Cell) || (sz==8 
35dd0 26 26 20 69 43 68 69 6c 64 3e 30 29 20 29 3b 0a  && iChild>0) );.
35de0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
35df0 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70  erflow || sz+2>p
35e00 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
35e10 20 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a     if( pTemp ){.
35e20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65        memcpy(pTe
35e30 6d 70 2c 20 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a  mp, pCell, sz);.
35e40 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
35e50 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  emp;.    }.    i
35e60 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20 20  f( iChild ){.   
35e70 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
35e80 6c 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20  l, iChild);.    
35e90 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
35ea0 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
35eb0 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
35ec0 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
35ed0 61 70 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  apOvfl)/sizeof(p
35ee0 50 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 30 5d 29  Page->apOvfl[0])
35ef0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
35f00 61 70 4f 76 66 6c 5b 6a 5d 20 3d 20 70 43 65 6c  apOvfl[j] = pCel
35f10 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 69  l;.    pPage->ai
35f20 4f 76 66 6c 5b 6a 5d 20 3d 20 28 75 31 36 29 69  Ovfl[j] = (u16)i
35f30 3b 0a 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ;..    /* When m
35f40 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
35f50 73 20 6f 63 63 75 72 2c 20 74 68 65 79 20 61 72  s occur, they ar
35f60 65 20 61 6c 77 61 79 73 20 73 65 71 75 65 6e 74  e always sequent
35f70 69 61 6c 20 61 6e 64 20 69 6e 0a 20 20 20 20 2a  ial and in.    *
35f80 2a 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e 20  * sorted order. 
35f90 20 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 73   This invariants
35fa0 20 61 72 69 73 65 20 62 65 63 61 75 73 65 20 6d   arise because m
35fb0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
35fc0 73 20 63 61 6e 0a 20 20 20 20 2a 2a 20 6f 6e 6c  s can.    ** onl
35fd0 79 20 6f 63 63 75 72 20 77 68 65 6e 20 69 6e 73  y occur when ins
35fe0 65 72 74 69 6e 67 20 64 69 76 69 64 65 72 20 63  erting divider c
35ff0 65 6c 6c 73 20 69 6e 74 6f 20 74 68 65 20 70 61  ells into the pa
36000 72 65 6e 74 20 70 61 67 65 20 64 75 72 69 6e 67  rent page during
36010 0a 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  .    ** balancin
36020 67 2c 20 61 6e 64 20 74 68 65 20 64 69 76 69 64  g, and the divid
36030 65 72 73 20 61 72 65 20 61 64 6a 61 63 65 6e 74  ers are adjacent
36040 20 61 6e 64 20 73 6f 72 74 65 64 2e 0a 20 20 20   and sorted..   
36050 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
36060 6a 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 61  j==0 || pPage->a
36070 69 4f 76 66 6c 5b 6a 2d 31 5d 3c 28 75 31 36 29  iOvfl[j-1]<(u16)
36080 69 20 29 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77  i ); /* Overflow
36090 73 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65  s in sorted orde
360a0 72 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  r */.    assert(
360b0 20 6a 3d 3d 30 20 7c 7c 20 69 3d 3d 70 50 61 67   j==0 || i==pPag
360c0 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 2b 31  e->aiOvfl[j-1]+1
360d0 20 29 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f   );   /* Overflo
360e0 77 73 20 61 72 65 20 73 65 71 75 65 6e 74 69 61  ws are sequentia
360f0 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  l */.  }else{.  
36100 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
36110 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
36120 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
36130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
36140 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  _OK ){.      *pR
36150 43 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65  C = rc;.      re
36160 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
36170 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
36180 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
36190 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
361a0 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
361b0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
361c0 61 73 73 65 72 74 28 20 26 64 61 74 61 5b 70 50  assert( &data[pP
361d0 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 5d  age->cellOffset]
361e0 3d 3d 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49 64  ==pPage->aCellId
361f0 78 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 6c  x );.    rc = al
36200 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
36210 65 2c 20 73 7a 2c 20 26 69 64 78 29 3b 0a 20 20  e, sz, &idx);.  
36220 20 20 69 66 28 20 72 63 20 29 7b 20 2a 70 52 43    if( rc ){ *pRC
36230 20 3d 20 72 63 3b 20 72 65 74 75 72 6e 3b 20 7d   = rc; return; }
36240 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 6c 6c 6f  .    /* The allo
36250 63 61 74 65 53 70 61 63 65 28 29 20 72 6f 75 74  cateSpace() rout
36260 69 6e 65 20 67 75 61 72 61 6e 74 65 65 73 20 74  ine guarantees t
36270 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
36280 70 65 72 74 69 65 73 0a 20 20 20 20 2a 2a 20 69  perties.    ** i
36290 66 20 69 74 20 72 65 74 75 72 6e 73 20 73 75 63  f it returns suc
362a0 63 65 73 73 66 75 6c 6c 79 20 2a 2f 0a 20 20 20  cessfully */.   
362b0 20 61 73 73 65 72 74 28 20 69 64 78 20 3e 3d 20   assert( idx >= 
362c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
362d0 20 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 63   idx >= pPage->c
362e0 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67  ellOffset+2*pPag
362f0 65 2d 3e 6e 43 65 6c 6c 2b 32 20 7c 7c 20 43 4f  e->nCell+2 || CO
36300 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
36310 61 73 73 65 72 74 28 20 69 64 78 2b 73 7a 20 3c  assert( idx+sz <
36320 3d 20 28 69 6e 74 29 70 50 61 67 65 2d 3e 70 42  = (int)pPage->pB
36330 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
36340 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
36350 65 20 2d 3d 20 28 75 31 36 29 28 32 20 2b 20 73  e -= (u16)(2 + s
36360 7a 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  z);.    memcpy(&
36370 64 61 74 61 5b 69 64 78 5d 2c 20 70 43 65 6c 6c  data[idx], pCell
36380 2c 20 73 7a 29 3b 0a 20 20 20 20 69 66 28 20 69  , sz);.    if( i
36390 43 68 69 6c 64 20 29 7b 0a 20 20 20 20 20 20 70  Child ){.      p
363a0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 69 64  ut4byte(&data[id
363b0 78 5d 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20  x], iChild);.   
363c0 20 7d 0a 20 20 20 20 70 49 6e 73 20 3d 20 70 50   }.    pIns = pP
363d0 61 67 65 2d 3e 61 43 65 6c 6c 49 64 78 20 2b 20  age->aCellIdx + 
363e0 69 2a 32 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76 65  i*2;.    memmove
363f0 28 70 49 6e 73 2b 32 2c 20 70 49 6e 73 2c 20 32  (pIns+2, pIns, 2
36400 2a 28 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d  *(pPage->nCell -
36410 20 69 29 29 3b 0a 20 20 20 20 70 75 74 32 62 79   i));.    put2by
36420 74 65 28 70 49 6e 73 2c 20 69 64 78 29 3b 0a 20  te(pIns, idx);. 
36430 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b     pPage->nCell+
36440 2b 3b 0a 20 20 20 20 2f 2a 20 69 6e 63 72 65 6d  +;.    /* increm
36450 65 6e 74 20 74 68 65 20 63 65 6c 6c 20 63 6f 75  ent the cell cou
36460 6e 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 2b  nt */.    if( (+
36470 2b 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  +data[pPage->hdr
36480 4f 66 66 73 65 74 2b 34 5d 29 3d 3d 30 20 29 20  Offset+4])==0 ) 
36490 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
364a0 66 66 73 65 74 2b 33 5d 2b 2b 3b 0a 20 20 20 20  ffset+3]++;.    
364b0 61 73 73 65 72 74 28 20 67 65 74 32 62 79 74 65  assert( get2byte
364c0 28 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  (&data[pPage->hd
364d0 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d 70 50 61  rOffset+3])==pPa
364e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 23 69 66  ge->nCell );.#if
364f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36500 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
36510 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
36520 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
36530 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
36540 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
36550 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
36560 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
36570 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
36580 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
36590 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
365a0 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
365b0 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
365c0 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 4f        ptrmapPutO
365d0 76 66 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  vflPtr(pPage, pC
365e0 65 6c 6c 2c 20 70 52 43 29 3b 0a 20 20 20 20 7d  ell, pRC);.    }
365f0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f  .#endif.  }.}../
36600 2a 0a 2a 2a 20 41 20 43 65 6c 6c 41 72 72 61 79  *.** A CellArray
36610 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73   object contains
36620 20 61 20 63 61 63 68 65 20 6f 66 20 70 6f 69 6e   a cache of poin
36630 74 65 72 73 20 61 6e 64 20 73 69 7a 65 73 20 66  ters and sizes f
36640 6f 72 20 61 0a 2a 2a 20 63 6f 6e 73 65 63 75 74  or a.** consecut
36650 69 76 65 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ive sequence of 
36660 63 65 6c 6c 73 20 74 68 61 74 20 6d 69 67 68 74  cells that might
36670 20 62 65 20 68 65 6c 64 20 6d 75 6c 74 69 70 6c   be held multipl
36680 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 74 79 70 65  e pages..*/.type
36690 64 65 66 20 73 74 72 75 63 74 20 43 65 6c 6c 41  def struct CellA
366a0 72 72 61 79 20 43 65 6c 6c 41 72 72 61 79 3b 0a  rray CellArray;.
366b0 73 74 72 75 63 74 20 43 65 6c 6c 41 72 72 61 79  struct CellArray
366c0 20 7b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20   {.  int nCell; 
366d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
366e0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
366f0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
36700 20 4d 65 6d 50 61 67 65 20 2a 70 52 65 66 3b 20   MemPage *pRef; 
36710 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 65           /* Refe
36720 72 65 6e 63 65 20 70 61 67 65 20 2a 2f 0a 20 20  rence page */.  
36730 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20  u8 **apCell;    
36740 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
36750 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
36760 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
36770 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
36780 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
36790 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
367a0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  pCell[] */.};../
367b0 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
367c0 68 65 20 63 65 6c 6c 20 73 69 7a 65 73 20 61 74  he cell sizes at
367d0 20 69 64 78 2c 20 69 64 78 2b 31 2c 20 2e 2e 2e   idx, idx+1, ...
367e0 2c 20 69 64 78 2b 4e 2d 31 20 68 61 76 65 20 62  , idx+N-1 have b
367f0 65 65 6e 0a 2a 2a 20 63 6f 6d 70 75 74 65 64 2e  een.** computed.
36800 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
36810 70 6f 70 75 6c 61 74 65 43 65 6c 6c 43 61 63 68  populateCellCach
36820 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
36830 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 4e 29 7b  int idx, int N){
36840 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
36850 30 20 26 26 20 69 64 78 2b 4e 3c 3d 70 2d 3e 6e  0 && idx+N<=p->n
36860 43 65 6c 6c 20 29 3b 0a 20 20 77 68 69 6c 65 28  Cell );.  while(
36870 20 4e 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65   N>0 ){.    asse
36880 72 74 28 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64  rt( p->apCell[id
36890 78 5d 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  x]!=0 );.    if(
368a0 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d   p->szCell[idx]=
368b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =0 ){.      p->s
368c0 7a 43 65 6c 6c 5b 69 64 78 5d 20 3d 20 70 2d 3e  zCell[idx] = p->
368d0 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  pRef->xCellSize(
368e0 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65  p->pRef, p->apCe
368f0 6c 6c 5b 69 64 78 5d 29 3b 0a 20 20 20 20 7d 65  ll[idx]);.    }e
36900 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
36910 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
36920 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
36930 2d 3e 73 7a 43 65 6c 6c 5b 69 64 78 5d 3d 3d 70  ->szCell[idx]==p
36940 2d 3e 70 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a  ->pRef->xCellSiz
36950 65 28 70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70  e(p->pRef, p->ap
36960 43 65 6c 6c 5b 69 64 78 5d 29 20 29 3b 0a 20 20  Cell[idx]) );.  
36970 20 20 7d 0a 20 20 20 20 69 64 78 2b 2b 3b 0a 20    }.    idx++;. 
36980 20 20 20 4e 2d 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f     N--;.  }.}../
36990 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
369a0 73 69 7a 65 20 6f 66 20 74 68 65 20 4e 74 68 20  size of the Nth 
369b0 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 63  element of the c
369c0 65 6c 6c 20 61 72 72 61 79 0a 2a 2f 0a 73 74 61  ell array.*/.sta
369d0 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  tic SQLITE_NOINL
369e0 49 4e 45 20 75 31 36 20 63 6f 6d 70 75 74 65 43  INE u16 computeC
369f0 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72 72 61  ellSize(CellArra
36a00 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  y *p, int N){.  
36a10 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26 26 20  assert( N>=0 && 
36a20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  N<p->nCell );.  
36a30 61 73 73 65 72 74 28 20 70 2d 3e 73 7a 43 65 6c  assert( p->szCel
36a40 6c 5b 4e 5d 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e  l[N]==0 );.  p->
36a50 73 7a 43 65 6c 6c 5b 4e 5d 20 3d 20 70 2d 3e 70  szCell[N] = p->p
36a60 52 65 66 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70  Ref->xCellSize(p
36a70 2d 3e 70 52 65 66 2c 20 70 2d 3e 61 70 43 65 6c  ->pRef, p->apCel
36a80 6c 5b 4e 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  l[N]);.  return 
36a90 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3b 0a 7d 0a  p->szCell[N];.}.
36aa0 73 74 61 74 69 63 20 75 31 36 20 63 61 63 68 65  static u16 cache
36ab0 64 43 65 6c 6c 53 69 7a 65 28 43 65 6c 6c 41 72  dCellSize(CellAr
36ac0 72 61 79 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  ray *p, int N){.
36ad0 20 20 61 73 73 65 72 74 28 20 4e 3e 3d 30 20 26    assert( N>=0 &
36ae0 26 20 4e 3c 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  & N<p->nCell );.
36af0 20 20 69 66 28 20 70 2d 3e 73 7a 43 65 6c 6c 5b    if( p->szCell[
36b00 4e 5d 20 29 20 72 65 74 75 72 6e 20 70 2d 3e 73  N] ) return p->s
36b10 7a 43 65 6c 6c 5b 4e 5d 3b 0a 20 20 72 65 74 75  zCell[N];.  retu
36b20 72 6e 20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69  rn computeCellSi
36b30 7a 65 28 70 2c 20 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  ze(p, N);.}../*.
36b40 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c 6c 5b  ** Array apCell[
36b50 5d 20 63 6f 6e 74 61 69 6e 73 20 70 6f 69 6e 74  ] contains point
36b60 65 72 73 20 74 6f 20 6e 43 65 6c 6c 20 62 2d 74  ers to nCell b-t
36b70 72 65 65 20 70 61 67 65 20 63 65 6c 6c 73 2e 20  ree page cells. 
36b80 54 68 65 20 0a 2a 2a 20 73 7a 43 65 6c 6c 5b 5d  The .** szCell[]
36b90 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
36ba0 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65  the size in byte
36bb0 73 20 6f 66 20 65 61 63 68 20 63 65 6c 6c 2e 20  s of each cell. 
36bc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
36bd0 20 72 65 70 6c 61 63 65 73 20 74 68 65 20 63 75   replaces the cu
36be0 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
36bf0 66 20 70 61 67 65 20 70 50 67 20 77 69 74 68 20  f page pPg with 
36c00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
36c10 74 68 65 20 63 65 6c 6c 0a 2a 2a 20 61 72 72 61  the cell.** arra
36c20 79 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 66  y..**.** Some of
36c30 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 61 70   the cells in ap
36c40 43 65 6c 6c 5b 5d 20 6d 61 79 20 63 75 72 72 65  Cell[] may curre
36c50 6e 74 6c 79 20 62 65 20 73 74 6f 72 65 64 20 69  ntly be stored i
36c60 6e 20 70 50 67 2e 20 54 68 69 73 0a 2a 2a 20 66  n pPg. This.** f
36c70 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 61 72  unction works ar
36c80 6f 75 6e 64 20 70 72 6f 62 6c 65 6d 73 20 63 61  ound problems ca
36c90 75 73 65 64 20 62 79 20 74 68 69 73 20 62 79 20  used by this by 
36ca0 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 20 6f 66  making a copy of
36cb0 20 61 6e 79 20 0a 2a 2a 20 73 75 63 68 20 63 65   any .** such ce
36cc0 6c 6c 73 20 62 65 66 6f 72 65 20 6f 76 65 72 77  lls before overw
36cd0 72 69 74 69 6e 67 20 74 68 65 20 70 61 67 65 20  riting the page 
36ce0 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  data..**.** The 
36cf0 4d 65 6d 50 61 67 65 2e 6e 46 72 65 65 20 66 69  MemPage.nFree fi
36d00 65 6c 64 20 69 73 20 69 6e 76 61 6c 69 64 61 74  eld is invalidat
36d10 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
36d20 69 6f 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a  ion. It is the .
36d30 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  ** responsibilit
36d40 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20  y of the caller 
36d50 74 6f 20 73 65 74 20 69 74 20 63 6f 72 72 65 63  to set it correc
36d60 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tly..*/.static i
36d70 6e 74 20 72 65 62 75 69 6c 64 50 61 67 65 28 0a  nt rebuildPage(.
36d80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
36d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36da0 20 20 2f 2a 20 45 64 69 74 20 74 68 69 73 20 70    /* Edit this p
36db0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  age */.  int nCe
36dc0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36dd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 61           /* Fina
36de0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  l number of cell
36df0 73 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 75  s on page */.  u
36e00 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20  8 **apCell,     
36e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36e20 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 73  * Array of cells
36e30 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
36e40 6c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l               
36e50 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
36e60 66 20 63 65 6c 6c 20 73 69 7a 65 73 20 2a 2f 0a  f cell sizes */.
36e70 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68  ){.  const int h
36e80 64 72 20 3d 20 70 50 67 2d 3e 68 64 72 4f 66 66  dr = pPg->hdrOff
36e90 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  set;          /*
36ea0 20 4f 66 66 73 65 74 20 6f 66 20 68 65 61 64 65   Offset of heade
36eb0 72 20 6f 6e 20 70 50 67 20 2a 2f 0a 20 20 75 38  r on pPg */.  u8
36ec0 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
36ed0 20 70 50 67 2d 3e 61 44 61 74 61 3b 20 20 20 20   pPg->aData;    
36ee0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
36ef0 72 20 74 6f 20 64 61 74 61 20 66 6f 72 20 70 50  r to data for pP
36f00 67 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 69 6e 74  g */.  const int
36f10 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
36f20 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  g->pBt->usableSi
36f30 7a 65 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  ze;.  u8 * const
36f40 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b 75   pEnd = &aData[u
36f50 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 69 6e  sableSize];.  in
36f60 74 20 69 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  t i;.  u8 *pCell
36f70 70 74 72 20 3d 20 70 50 67 2d 3e 61 43 65 6c 6c  ptr = pPg->aCell
36f80 49 64 78 3b 0a 20 20 75 38 20 2a 70 54 6d 70 20  Idx;.  u8 *pTmp 
36f90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
36fa0 6d 70 53 70 61 63 65 28 70 50 67 2d 3e 70 42 74  mpSpace(pPg->pBt
36fb0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 75 38 20  ->pPager);.  u8 
36fc0 2a 70 44 61 74 61 3b 0a 0a 20 20 69 20 3d 20 67  *pData;..  i = g
36fd0 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 68  et2byte(&aData[h
36fe0 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79  dr+5]);.  memcpy
36ff0 28 26 70 54 6d 70 5b 69 5d 2c 20 26 61 44 61 74  (&pTmp[i], &aDat
37000 61 5b 69 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  a[i], usableSize
37010 20 2d 20 69 29 3b 0a 0a 20 20 70 44 61 74 61 20   - i);..  pData 
37020 3d 20 70 45 6e 64 3b 0a 20 20 66 6f 72 28 69 3d  = pEnd;.  for(i=
37030 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
37040 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
37050 3d 20 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20  = apCell[i];.   
37060 20 69 66 28 20 70 43 65 6c 6c 3e 61 44 61 74 61   if( pCell>aData
37070 20 26 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29   && pCell<pEnd )
37080 7b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  {.      pCell = 
37090 26 70 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44  &pTmp[pCell - aD
370a0 61 74 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ata];.    }.    
370b0 70 44 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b  pData -= szCell[
370c0 69 5d 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  i];.    put2byte
370d0 28 70 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74  (pCellptr, (pDat
370e0 61 20 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20  a - aData));.   
370f0 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a   pCellptr += 2;.
37100 20 20 20 20 69 66 28 20 70 44 61 74 61 20 3c 20      if( pData < 
37110 70 43 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72  pCellptr ) retur
37120 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
37130 5f 42 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70  _BKPT;.    memcp
37140 79 28 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20  y(pData, pCell, 
37150 73 7a 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20  szCell[i]);.    
37160 61 73 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69  assert( szCell[i
37170 5d 3d 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a  ]==pPg->xCellSiz
37180 65 28 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c  e(pPg, pCell) ||
37190 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
371a0 20 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 43     testcase( szC
371b0 65 6c 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65  ell[i]!=pPg->xCe
371c0 6c 6c 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c  llSize(pPg,pCell
371d0 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ) );.  }..  /* T
371e0 68 65 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69  he pPg->nFree fi
371f0 65 6c 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69  eld is now set i
37200 6e 63 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20  ncorrectly. The 
37210 63 61 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20  caller will fix 
37220 69 74 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43  it. */.  pPg->nC
37230 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70  ell = nCell;.  p
37240 50 67 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  Pg->nOverflow = 
37250 30 3b 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26  0;..  put2byte(&
37260 61 44 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29  aData[hdr+1], 0)
37270 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ;.  put2byte(&aD
37280 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d  ata[hdr+3], pPg-
37290 3e 6e 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62  >nCell);.  put2b
372a0 79 74 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35  yte(&aData[hdr+5
372b0 5d 2c 20 70 44 61 74 61 20 2d 20 61 44 61 74 61  ], pData - aData
372c0 29 3b 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37  );.  aData[hdr+7
372d0 5d 20 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75  ] = 0x00;.  retu
372e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
372f0 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43  ./*.** Array apC
37300 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e  ell[] contains n
37310 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f  Cell pointers to
37320 20 62 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41   b-tree cells. A
37330 72 72 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63  rray szCell.** c
37340 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
37350 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
37360 68 20 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69  h such cell. Thi
37370 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
37380 70 74 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74  pts to .** add t
37390 68 65 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20  he cells stored 
373a0 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 6f 20  in the array to 
373b0 70 61 67 65 20 70 50 67 2e 20 49 66 20 69 74 20  page pPg. If it 
373c0 63 61 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20  cannot (because 
373d0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65  .** the page nee
373e0 64 73 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d  ds to be defragm
373f0 65 6e 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  ented before the
37400 20 63 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29   cells will fit)
37410 2c 20 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73  , non-zero.** is
37420 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
37430 77 69 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c  wise, if the cel
37440 6c 73 20 61 72 65 20 61 64 64 65 64 20 73 75 63  ls are added suc
37450 63 65 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20  cessfully, zero 
37460 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
37470 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  **.** Argument p
37480 43 65 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74  Cellptr points t
37490 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  o the first entr
374a0 79 20 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f  y in the cell-po
374b0 69 6e 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28  inter array.** (
374c0 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 67  part of page pPg
374d0 29 20 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41  ) to populate. A
374e0 66 74 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c  fter cell apCell
374f0 5b 30 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74  [0] is written t
37500 6f 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f  o the.** page bo
37510 64 79 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66  dy, a 16-bit off
37520 73 65 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  set is written t
37530 6f 20 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20  o pCellptr. And 
37540 73 6f 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a  so on, for each.
37550 2a 2a 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61  ** cell in the a
37560 72 72 61 79 2e 20 49 74 20 69 73 20 74 68 65 20  rray. It is the 
37570 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
37580 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
37590 65 6e 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69  ensure.** that i
375a0 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
375b0 72 77 72 69 74 65 20 74 68 69 73 20 70 61 72 74  rwrite this part
375c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69   of the cell-poi
375d0 6e 74 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  nter array..**.*
375e0 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * When this func
375f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
37600 2a 70 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74  *ppData points t
37610 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
37620 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61  he .** content a
37630 72 65 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e  rea on page pPg.
37640 20 49 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20   If the size of 
37650 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  the content area
37660 20 69 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a   is extended,.**
37670 20 2a 70 70 44 61 74 61 20 69 73 20 75 70 64 61   *ppData is upda
37680 74 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ted to point to 
37690 74 68 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66  the new start of
376a0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65   the content are
376b0 61 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75  a.** before retu
376c0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e  rning..**.** Fin
376d0 61 6c 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70  ally, argument p
376e0 42 65 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20  Begin points to 
376f0 74 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61  the byte immedia
37700 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
37710 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
37720 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
37730 62 79 20 74 68 69 73 20 70 61 67 65 20 66 6f 72  by this page for
37740 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65   the cell-pointe
37750 72 20 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61  r area (for.** a
37760 6c 6c 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a  ll cells - not j
37770 75 73 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74  ust those insert
37780 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
37790 74 20 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20  t call). If the 
377a0 63 6f 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20  content.** area 
377b0 6d 75 73 74 20 62 65 20 65 78 74 65 6e 64 65 64  must be extended
377c0 20 74 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20   to before this 
377d0 70 6f 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  point in order t
377e0 6f 20 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c  o accomodate all
377f0 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  .** cells in apC
37800 65 6c 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20  ell[], then the 
37810 63 65 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74  cells do not fit
37820 20 61 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73   and non-zero is
37830 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
37840 61 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73  atic int pageIns
37850 65 72 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50  ertArray(.  MemP
37860 61 67 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20  age *pPg,       
37870 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37880 61 67 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73  age to add cells
37890 20 74 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65   to */.  u8 *pBe
378a0 67 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  gin,            
378b0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20           /* End 
378c0 6f 66 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  of cell-pointer 
378d0 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a  array */.  u8 **
378e0 70 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  ppData,         
378f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
37900 2f 4f 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65  /OUT: Page conte
37910 6e 74 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72  nt -area pointer
37920 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70   */.  u8 *pCellp
37930 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tr,             
37940 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
37950 20 74 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72   to cell-pointer
37960 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69   area */.  int i
37970 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
37980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37990 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
379a0 6c 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e  l to add */.  in
379b0 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
379c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
379d0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
379e0 20 74 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a   to add to pPg *
379f0 2f 0a 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70  /.  CellArray *p
37a00 43 41 72 72 61 79 20 20 20 20 20 20 20 20 20 20  CArray          
37a10 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
37a20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  cells */.){.  in
37a30 74 20 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61  t i;.  u8 *aData
37a40 20 3d 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20   = pPg->aData;. 
37a50 20 75 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70   u8 *pData = *pp
37a60 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64  Data;.  int iEnd
37a70 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c   = iFirst + nCel
37a80 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  l;.  assert( COR
37a90 52 55 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e  RUPT_DB || pPg->
37aa0 68 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20  hdrOffset==0 ); 
37ab0 20 20 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c     /* Never call
37ac0 65 64 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a  ed on page 1 */.
37ad0 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
37ae0 69 3c 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<iEnd; i++){.  
37af0 20 20 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20    int sz, rc;.  
37b00 20 20 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20    u8 *pSlot;.   
37b10 20 73 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c   sz = cachedCell
37b20 53 69 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29  Size(pCArray, i)
37b30 3b 0a 20 20 20 20 69 66 28 20 28 61 44 61 74 61  ;.    if( (aData
37b40 5b 31 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b  [1]==0 && aData[
37b50 32 5d 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74  2]==0) || (pSlot
37b60 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28   = pageFindSlot(
37b70 70 50 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20  pPg,sz,&rc))==0 
37b80 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 2d  ){.      pData -
37b90 3d 20 73 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  = sz;.      if( 
37ba0 70 44 61 74 61 3c 70 42 65 67 69 6e 20 29 20 72  pData<pBegin ) r
37bb0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 70  eturn 1;.      p
37bc0 53 6c 6f 74 20 3d 20 70 44 61 74 61 3b 0a 20 20  Slot = pData;.  
37bd0 20 20 7d 0a 20 20 20 20 2f 2a 20 70 53 6c 6f 74    }.    /* pSlot
37be0 20 61 6e 64 20 70 43 41 72 72 61 79 2d 3e 61 70   and pCArray->ap
37bf0 43 65 6c 6c 5b 69 5d 20 77 69 6c 6c 20 6e 65 76  Cell[i] will nev
37c00 65 72 20 6f 76 65 72 6c 61 70 20 6f 6e 20 61 20  er overlap on a 
37c10 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 20 20 20 20  well-formed.    
37c20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 20 42 75  ** database.  Bu
37c30 74 20 74 68 65 79 20 6d 69 67 68 74 20 66 6f 72  t they might for
37c40 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
37c50 61 73 65 2e 20 20 48 65 6e 63 65 20 75 73 65 20  ase.  Hence use 
37c60 6d 65 6d 6d 6f 76 65 28 29 0a 20 20 20 20 2a 2a  memmove().    **
37c70 20 73 69 6e 63 65 20 6d 65 6d 63 70 79 28 29 20   since memcpy() 
37c80 73 65 6e 64 73 20 53 49 47 41 42 4f 52 54 20 77  sends SIGABORT w
37c90 69 74 68 20 6f 76 65 72 6c 61 70 70 69 6e 67 20  ith overlapping 
37ca0 62 75 66 66 65 72 73 20 6f 6e 20 4f 70 65 6e 42  buffers on OpenB
37cb0 53 44 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  SD */.    assert
37cc0 28 20 28 70 53 6c 6f 74 2b 73 7a 29 3c 3d 70 43  ( (pSlot+sz)<=pC
37cd0 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37ce0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70 53 6c  .         || pSl
37cf0 6f 74 3e 3d 28 70 43 41 72 72 61 79 2d 3e 61 70  ot>=(pCArray->ap
37d00 43 65 6c 6c 5b 69 5d 2b 73 7a 29 0a 20 20 20 20  Cell[i]+sz).    
37d10 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f       || CORRUPT_
37d20 44 42 20 29 3b 0a 20 20 20 20 6d 65 6d 6d 6f 76  DB );.    memmov
37d30 65 28 70 53 6c 6f 74 2c 20 70 43 41 72 72 61 79  e(pSlot, pCArray
37d40 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2c 20 73 7a 29  ->apCell[i], sz)
37d50 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
37d60 43 65 6c 6c 70 74 72 2c 20 28 70 53 6c 6f 74 20  Cellptr, (pSlot 
37d70 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
37d80 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37d90 7d 0a 20 20 2a 70 70 44 61 74 61 20 3d 20 70 44  }.  *ppData = pD
37da0 61 74 61 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  ata;.  return 0;
37db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79 20  .}../*.** Array 
37dc0 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69 6e  apCell[] contain
37dd0 73 20 6e 43 65 6c 6c 20 70 6f 69 6e 74 65 72 73  s nCell pointers
37de0 20 74 6f 20 62 2d 74 72 65 65 20 63 65 6c 6c 73   to b-tree cells
37df0 2e 20 41 72 72 61 79 20 73 7a 43 65 6c 6c 20 0a  . Array szCell .
37e00 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ** contains the 
37e10 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
37e20 20 65 61 63 68 20 73 75 63 68 20 63 65 6c 6c 2e   each such cell.
37e30 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
37e40 64 64 73 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  dds the.** space
37e50 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
37e60 20 65 61 63 68 20 63 65 6c 6c 20 69 6e 20 74 68   each cell in th
37e70 65 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20  e array that is 
37e80 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
37e90 20 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20   .** within the 
37ea0 62 6f 64 79 20 6f 66 20 70 50 67 20 74 6f 20 74  body of pPg to t
37eb0 68 65 20 70 50 67 20 66 72 65 65 2d 6c 69 73 74  he pPg free-list
37ec0 2e 20 54 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  . The cell-point
37ed0 65 72 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a  ers and other.**
37ee0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 70   fields of the p
37ef0 61 67 65 20 61 72 65 20 6e 6f 74 20 75 70 64 61  age are not upda
37f00 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
37f10 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
37f20 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
37f30 72 20 6f 66 20 63 65 6c 6c 73 20 61 64 64 65 64  r of cells added
37f40 20 74 6f 20 74 68 65 20 66 72 65 65 2d 6c 69 73   to the free-lis
37f50 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
37f60 20 70 61 67 65 46 72 65 65 41 72 72 61 79 28 0a   pageFreeArray(.
37f70 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 67 2c 20    MemPage *pPg, 
37f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37f90 20 20 2f 2a 20 50 61 67 65 20 74 6f 20 65 64 69    /* Page to edi
37fa0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  t */.  int iFirs
37fb0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
37fc0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
37fd0 63 65 6c 6c 20 74 6f 20 64 65 6c 65 74 65 20 2a  cell to delete *
37fe0 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20  /.  int nCell,  
37ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38000 20 20 20 20 2f 2a 20 43 65 6c 6c 73 20 74 6f 20      /* Cells to 
38010 64 65 6c 65 74 65 20 2a 2f 0a 20 20 43 65 6c 6c  delete */.  Cell
38020 41 72 72 61 79 20 2a 70 43 41 72 72 61 79 20 20  Array *pCArray  
38030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
38040 72 72 61 79 20 6f 66 20 63 65 6c 6c 73 20 2a 2f  rray of cells */
38050 0a 29 7b 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74  .){.  u8 * const
38060 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
38070 61 74 61 3b 0a 20 20 75 38 20 2a 20 63 6f 6e 73  ata;.  u8 * cons
38080 74 20 70 45 6e 64 20 3d 20 26 61 44 61 74 61 5b  t pEnd = &aData[
38090 70 50 67 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  pPg->pBt->usable
380a0 53 69 7a 65 5d 3b 0a 20 20 75 38 20 2a 20 63 6f  Size];.  u8 * co
380b0 6e 73 74 20 70 53 74 61 72 74 20 3d 20 26 61 44  nst pStart = &aD
380c0 61 74 61 5b 70 50 67 2d 3e 68 64 72 4f 66 66 73  ata[pPg->hdrOffs
380d0 65 74 20 2b 20 38 20 2b 20 70 50 67 2d 3e 63 68  et + 8 + pPg->ch
380e0 69 6c 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 69  ildPtrSize];.  i
380f0 6e 74 20 6e 52 65 74 20 3d 20 30 3b 0a 20 20 69  nt nRet = 0;.  i
38100 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 45 6e 64  nt i;.  int iEnd
38110 20 3d 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c   = iFirst + nCel
38120 6c 3b 0a 20 20 75 38 20 2a 70 46 72 65 65 20 3d  l;.  u8 *pFree =
38130 20 30 3b 0a 20 20 69 6e 74 20 73 7a 46 72 65 65   0;.  int szFree
38140 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 69   = 0;..  for(i=i
38150 46 69 72 73 74 3b 20 69 3c 69 45 6e 64 3b 20 69  First; i<iEnd; i
38160 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
38170 6c 6c 20 3d 20 70 43 41 72 72 61 79 2d 3e 61 70  ll = pCArray->ap
38180 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Cell[i];.    if(
38190 20 70 43 65 6c 6c 3e 3d 70 53 74 61 72 74 20 26   pCell>=pStart &
381a0 26 20 70 43 65 6c 6c 3c 70 45 6e 64 20 29 7b 0a  & pCell<pEnd ){.
381b0 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20        int sz;.  
381c0 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64 20 74      /* No need t
381d0 6f 20 75 73 65 20 63 61 63 68 65 64 43 65 6c 6c  o use cachedCell
381e0 53 69 7a 65 28 29 20 68 65 72 65 2e 20 20 54 68  Size() here.  Th
381f0 65 20 73 69 7a 65 73 20 6f 66 20 61 6c 6c 20 63  e sizes of all c
38200 65 6c 6c 73 20 74 68 61 74 0a 20 20 20 20 20 20  ells that.      
38210 2a 2a 20 61 72 65 20 74 6f 20 62 65 20 66 72 65  ** are to be fre
38220 65 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ed have already 
38230 62 65 65 6e 20 63 6f 6d 70 75 74 69 6e 67 20 77  been computing w
38240 68 69 6c 65 20 64 65 63 69 64 69 6e 67 20 77 68  hile deciding wh
38250 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 63 65 6c  ich.      ** cel
38260 6c 73 20 6e 65 65 64 20 66 72 65 65 69 6e 67 20  ls need freeing 
38270 2a 2f 0a 20 20 20 20 20 20 73 7a 20 3d 20 70 43  */.      sz = pC
38280 41 72 72 61 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d  Array->szCell[i]
38290 3b 20 20 61 73 73 65 72 74 28 20 73 7a 3e 30 20  ;  assert( sz>0 
382a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 46 72  );.      if( pFr
382b0 65 65 21 3d 28 70 43 65 6c 6c 20 2b 20 73 7a 29  ee!=(pCell + sz)
382c0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
382d0 70 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 20  pFree ){.       
382e0 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65 65     assert( pFree
382f0 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65 65  >aData && (pFree
38300 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36 20   - aData)<65536 
38310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 72 65  );.          fre
38320 65 53 70 61 63 65 28 70 50 67 2c 20 28 75 31 36  eSpace(pPg, (u16
38330 29 28 70 46 72 65 65 20 2d 20 61 44 61 74 61 29  )(pFree - aData)
38340 2c 20 73 7a 46 72 65 65 29 3b 0a 20 20 20 20 20  , szFree);.     
38350 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 46 72     }.        pFr
38360 65 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20  ee = pCell;.    
38370 20 20 20 20 73 7a 46 72 65 65 20 3d 20 73 7a 3b      szFree = sz;
38380 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72  .        if( pFr
38390 65 65 2b 73 7a 3e 70 45 6e 64 20 29 20 72 65 74  ee+sz>pEnd ) ret
383a0 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 0;.      }el
383b0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 72 65  se{.        pFre
383c0 65 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 20  e = pCell;.     
383d0 20 20 20 73 7a 46 72 65 65 20 2b 3d 20 73 7a 3b     szFree += sz;
383e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
383f0 52 65 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Ret++;.    }.  }
38400 0a 20 20 69 66 28 20 70 46 72 65 65 20 29 7b 0a  .  if( pFree ){.
38410 20 20 20 20 61 73 73 65 72 74 28 20 70 46 72 65      assert( pFre
38420 65 3e 61 44 61 74 61 20 26 26 20 28 70 46 72 65  e>aData && (pFre
38430 65 20 2d 20 61 44 61 74 61 29 3c 36 35 35 33 36  e - aData)<