/ Hex Artifact Content
Login

Artifact 9b30dbe2f6306c50dc5af8296e67034400de37cb:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 69  *.** This file i
0180: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 65 78 74  mplements an ext
0190: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01a0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01b0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
01c0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
01d0: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
01e0: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
01f0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0200: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0210: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0220: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0230: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0240: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0250: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
0260: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
0270: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
0280: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
0290: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02a0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02b0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
02c0: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
02d0: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
02e0: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
02f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0300: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0310: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0320: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0330: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0340: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0350: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 31  ite3BtreeTrace=1
0360: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
0370: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
0380: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
0390: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03a0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03b0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
03c0: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
03d0: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
03e0: 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 72 61 63 74  f../*.** Extract
03f0: 20 61 20 32 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 2-byte big-en
0400: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 66 72 6f  dian integer fro
0410: 6d 20 61 6e 20 61 72 72 61 79 20 6f 66 20 75 6e  m an array of un
0420: 73 69 67 6e 65 64 20 62 79 74 65 73 2e 0a 2a 2a  signed bytes..**
0430: 20 42 75 74 20 69 66 20 74 68 65 20 76 61 6c 75   But if the valu
0440: 65 20 69 73 20 7a 65 72 6f 2c 20 6d 61 6b 65 20  e is zero, make 
0450: 69 74 20 36 35 35 33 36 2e 0a 2a 2a 0a 2a 2a 20  it 65536..**.** 
0460: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0470: 75 73 65 64 20 74 6f 20 65 78 74 72 61 63 74 20  used to extract 
0480: 74 68 65 20 22 6f 66 66 73 65 74 20 74 6f 20 63  the "offset to c
0490: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
04a0: 22 20 76 61 6c 75 65 0a 2a 2a 20 66 72 6f 6d 20  " value.** from 
04b0: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 61 20  the header of a 
04c0: 62 74 72 65 65 20 70 61 67 65 2e 20 20 49 66 20  btree page.  If 
04d0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
04e0: 20 36 35 35 33 36 20 61 6e 64 20 74 68 65 20 70   65536 and the p
04f0: 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79 2c  age.** is empty,
0500: 20 74 68 65 20 6f 66 66 73 65 74 20 73 68 6f 75   the offset shou
0510: 6c 64 20 62 65 20 36 35 35 33 36 2c 20 62 75 74  ld be 65536, but
0520: 20 74 68 65 20 32 2d 62 79 74 65 20 76 61 6c 75   the 2-byte valu
0530: 65 20 73 74 6f 72 65 73 20 7a 65 72 6f 2e 0a 2a  e stores zero..*
0540: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d  * This routine m
0550: 61 6b 65 73 20 74 68 65 20 6e 65 63 65 73 73 61  akes the necessa
0560: 72 79 20 61 64 6a 75 73 74 6d 65 6e 74 20 74 6f  ry adjustment to
0570: 20 36 35 35 33 36 2e 0a 2a 2f 0a 23 64 65 66 69   65536..*/.#defi
0580: 6e 65 20 67 65 74 32 62 79 74 65 4e 6f 74 5a 65  ne get2byteNotZe
0590: 72 6f 28 58 29 20 20 28 28 28 28 28 69 6e 74 29  ro(X)  (((((int)
05a0: 67 65 74 32 62 79 74 65 28 58 29 29 2d 31 29 26  get2byte(X))-1)&
05b0: 30 78 66 66 66 66 29 2b 31 29 0a 0a 2f 2a 0a 2a  0xffff)+1)../*.*
05c0: 2a 20 56 61 6c 75 65 73 20 70 61 73 73 65 64 20  * Values passed 
05d0: 61 73 20 74 68 65 20 35 74 68 20 61 72 67 75 6d  as the 5th argum
05e0: 65 6e 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 42  ent to allocateB
05f0: 74 72 65 65 50 61 67 65 28 29 0a 2a 2f 0a 23 64  treePage().*/.#d
0600: 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f 41 4e  efine BTALLOC_AN
0610: 59 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  Y   0           
0620: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 79 20  /* Allocate any 
0630: 70 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  page */.#define 
0640: 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 31 20  BTALLOC_EXACT 1 
0650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0660: 6f 63 61 74 65 20 65 78 61 63 74 20 70 61 67 65  ocate exact page
0670: 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
0680: 23 64 65 66 69 6e 65 20 42 54 41 4c 4c 4f 43 5f  #define BTALLOC_
0690: 4c 45 20 20 20 20 32 20 20 20 20 20 20 20 20 20  LE    2         
06a0: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
06b0: 79 20 70 61 67 65 20 3c 3d 20 74 68 65 20 70 61  y page <= the pa
06c0: 72 61 6d 65 74 65 72 20 2a 2f 0a 0a 2f 2a 0a 2a  rameter */../*.*
06d0: 2a 20 4d 61 63 72 6f 20 49 66 4e 6f 74 4f 6d 69  * Macro IfNotOmi
06e0: 74 41 56 28 78 29 20 72 65 74 75 72 6e 73 20 28  tAV(x) returns (
06f0: 78 29 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  x) if SQLITE_OMI
0700: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  T_AUTOVACUUM is 
0710: 6e 6f 74 20 0a 2a 2a 20 64 65 66 69 6e 65 64 2c  not .** defined,
0720: 20 6f 72 20 30 20 69 66 20 69 74 20 69 73 2e 20   or 0 if it is. 
0730: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
0740: 2a 2a 20 20 20 62 49 6e 63 72 56 61 63 75 75 6d  **   bIncrVacuum
0750: 20 3d 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 70   = IfNotOmitAV(p
0760: 42 74 53 68 61 72 65 64 2d 3e 69 6e 63 72 56 61  BtShared->incrVa
0770: 63 75 75 6d 29 3b 0a 2a 2f 0a 23 69 66 6e 64 65  cuum);.*/.#ifnde
0780: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
0790: 54 4f 56 41 43 55 55 4d 0a 23 64 65 66 69 6e 65  TOVACUUM.#define
07a0: 20 49 66 4e 6f 74 4f 6d 69 74 41 56 28 65 78 70   IfNotOmitAV(exp
07b0: 72 29 20 28 65 78 70 72 29 0a 23 65 6c 73 65 0a  r) (expr).#else.
07c0: 23 64 65 66 69 6e 65 20 49 66 4e 6f 74 4f 6d 69  #define IfNotOmi
07d0: 74 41 56 28 65 78 70 72 29 20 30 0a 23 65 6e 64  tAV(expr) 0.#end
07e0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
07f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0800: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  ACHE./*.** A lis
0810: 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f 62  t of BtShared ob
0820: 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20 65  jects that are e
0830: 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72 74  ligible for part
0840: 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e 20  icipation.** in 
0850: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
0860: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61 73  his variable has
0870: 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72 69   file scope duri
0880: 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64 73  ng normal builds
0890: 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65 73  ,.** but the tes
08a0: 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73 20  t harness needs 
08b0: 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f 20  to access it so 
08c0: 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62 61  we make it globa
08d0: 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20 62  l for .** test b
08e0: 75 69 6c 64 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 63  uilds..**.** Acc
08f0: 65 73 73 20 74 6f 20 74 68 69 73 20 76 61 72 69  ess to this vari
0900: 61 62 6c 65 20 69 73 20 70 72 6f 74 65 63 74 65  able is protecte
0910: 64 20 62 79 20 53 51 4c 49 54 45 5f 4d 55 54 45  d by SQLITE_MUTE
0920: 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 2e  X_STATIC_MASTER.
0930: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
0940: 45 5f 54 45 53 54 0a 42 74 53 68 61 72 65 64 20  E_TEST.BtShared 
0950: 2a 53 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69  *SQLITE_WSD sqli
0960: 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
0970: 73 74 20 3d 20 30 3b 0a 23 65 6c 73 65 0a 73 74  st = 0;.#else.st
0980: 61 74 69 63 20 42 74 53 68 61 72 65 64 20 2a 53  atic BtShared *S
0990: 51 4c 49 54 45 5f 57 53 44 20 73 71 6c 69 74 65  QLITE_WSD sqlite
09a0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
09b0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65 6e   = 0;.#endif.#en
09c0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
09d0: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
09e0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
09f0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
0a00: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ACHE./*.** Enabl
0a10: 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
0a20: 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61 6e   shared pager an
0a30: 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72 65  d schema feature
0a40: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
0a50: 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66 66  utine has no eff
0a60: 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67 20  ect on existing 
0a70: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
0a80: 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68 61  ions..** The sha
0a90: 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69 6e  red cache settin
0aa0: 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20 66  g effects only f
0ab0: 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a 2a  uture calls to.*
0ac0: 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
0ad0: 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36  , sqlite3_open16
0ae0: 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f  (), or sqlite3_o
0af0: 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e 74  pen_v2()..*/.int
0b00: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
0b10: 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e 74  shared_cache(int
0b20: 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c 69   enable){.  sqli
0b30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
0b40: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
0b50: 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 72  ed = enable;.  r
0b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0b70: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 23 69 66  .}.#endif....#if
0b80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0b90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f  SHARED_CACHE.  /
0ba0: 2a 0a 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74  *.  ** The funct
0bb0: 69 6f 6e 73 20 71 75 65 72 79 53 68 61 72 65 64  ions queryShared
0bc0: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0bd0: 2c 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  , setSharedCache
0be0: 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 0a 20 20 2a  TableLock(),.  *
0bf0: 2a 20 61 6e 64 20 63 6c 65 61 72 41 6c 6c 53 68  * and clearAllSh
0c00: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
0c10: 63 6b 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70  cks().  ** manip
0c20: 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e  ulate entries in
0c30: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c   the BtShared.pL
0c40: 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  ock linked list 
0c50: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20  used to store.  
0c60: 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65 20  ** shared-cache 
0c70: 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b  table level lock
0c80: 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61 72  s. If the librar
0c90: 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69  y is compiled wi
0ca0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72  th the.  ** shar
0cb0: 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72 65  ed-cache feature
0cc0: 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20   disabled, then 
0cd0: 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76  there is only ev
0ce0: 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a  er one user.  **
0cf0: 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72 65   of each BtShare
0d00: 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  d structure and 
0d10: 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20  so this locking 
0d20: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
0d30: 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e  . .  ** So defin
0d40: 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74  e the lock relat
0d50: 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20  ed functions as 
0d60: 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23  no-ops..  */.  #
0d70: 64 65 66 69 6e 65 20 71 75 65 72 79 53 68 61 72  define queryShar
0d80: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0d90: 28 61 2c 62 2c 63 29 20 53 51 4c 49 54 45 5f 4f  (a,b,c) SQLITE_O
0da0: 4b 0a 20 20 23 64 65 66 69 6e 65 20 73 65 74 53  K.  #define setS
0db0: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0dc0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
0dd0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 63  E_OK.  #define c
0de0: 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63  learAllSharedCac
0df0: 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a  heTableLocks(a).
0e00: 20 20 23 64 65 66 69 6e 65 20 64 6f 77 6e 67 72    #define downgr
0e10: 61 64 65 41 6c 6c 53 68 61 72 65 64 43 61 63 68  adeAllSharedCach
0e20: 65 54 61 62 6c 65 4c 6f 63 6b 73 28 61 29 0a 20  eTableLocks(a). 
0e30: 20 23 64 65 66 69 6e 65 20 68 61 73 53 68 61 72   #define hasShar
0e40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0e50: 28 61 2c 62 2c 63 2c 64 29 20 31 0a 20 20 23 64  (a,b,c,d) 1.  #d
0e60: 65 66 69 6e 65 20 68 61 73 52 65 61 64 43 6f 6e  efine hasReadCon
0e70: 66 6c 69 63 74 73 28 61 2c 20 62 29 20 30 0a 23  flicts(a, b) 0.#
0e80: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
0e90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0ea0: 44 5f 43 41 43 48 45 0a 0a 23 69 66 64 65 66 20  D_CACHE..#ifdef 
0eb0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
0ec0: 2a 2a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  **** This functi
0ed0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  on is only used 
0ee0: 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73  as part of an as
0ef0: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
0f00: 2e 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 43 68 65 63  . ***.**.** Chec
0f10: 6b 20 74 6f 20 73 65 65 20 69 66 20 70 42 74 72  k to see if pBtr
0f20: 65 65 20 68 6f 6c 64 73 20 74 68 65 20 72 65 71  ee holds the req
0f30: 75 69 72 65 64 20 6c 6f 63 6b 73 20 74 6f 20 72  uired locks to r
0f40: 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 6f 20  ead or write to 
0f50: 74 68 65 20 0a 2a 2a 20 74 61 62 6c 65 20 77 69  the .** table wi
0f60: 74 68 20 72 6f 6f 74 20 70 61 67 65 20 69 52 6f  th root page iRo
0f70: 6f 74 2e 20 20 20 52 65 74 75 72 6e 20 31 20 69  ot.   Return 1 i
0f80: 66 20 69 74 20 64 6f 65 73 20 61 6e 64 20 30 20  f it does and 0 
0f90: 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  if not..**.** Fo
0fa0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20  r example, when 
0fb0: 77 72 69 74 69 6e 67 20 74 6f 20 61 20 74 61 62  writing to a tab
0fc0: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0fd0: 65 20 69 52 6f 6f 74 20 76 69 61 20 0a 2a 2a 20  e iRoot via .** 
0fe0: 42 74 72 65 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  Btree connection
0ff0: 20 70 42 74 72 65 65 3a 0a 2a 2a 0a 2a 2a 20 20   pBtree:.**.**  
1000: 20 20 61 73 73 65 72 74 28 20 68 61 73 53 68 61    assert( hasSha
1010: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1020: 6b 28 70 42 74 72 65 65 2c 20 69 52 6f 6f 74 2c  k(pBtree, iRoot,
1030: 20 30 2c 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20   0, WRITE_LOCK) 
1040: 29 3b 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 72  );.**.** When wr
1050: 69 74 69 6e 67 20 74 6f 20 61 6e 20 69 6e 64 65  iting to an inde
1060: 78 20 74 68 61 74 20 72 65 73 69 64 65 73 20 69  x that resides i
1070: 6e 20 61 20 73 68 61 72 61 62 6c 65 20 64 61 74  n a sharable dat
1080: 61 62 61 73 65 2c 20 74 68 65 20 0a 2a 2a 20 63  abase, the .** c
1090: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 68 61 76  aller should hav
10a0: 65 20 66 69 72 73 74 20 6f 62 74 61 69 6e 65 64  e first obtained
10b0: 20 61 20 6c 6f 63 6b 20 73 70 65 63 69 66 79 69   a lock specifyi
10c0: 6e 67 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ng the root page
10d0: 20 6f 66 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65   of.** the corre
10e0: 73 70 6f 6e 64 69 6e 67 20 74 61 62 6c 65 2e 20  sponding table. 
10f0: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 69 6e 67  This makes thing
1100: 73 20 61 20 62 69 74 20 6d 6f 72 65 20 63 6f 6d  s a bit more com
1110: 70 6c 69 63 61 74 65 64 2c 0a 2a 2a 20 61 73 20  plicated,.** as 
1120: 74 68 69 73 20 6d 6f 64 75 6c 65 20 74 72 65 61  this module trea
1130: 74 73 20 65 61 63 68 20 74 61 62 6c 65 20 61 73  ts each table as
1140: 20 61 20 73 65 70 61 72 61 74 65 20 73 74 72 75   a separate stru
1150: 63 74 75 72 65 2e 20 54 6f 20 64 65 74 65 72 6d  cture. To determ
1160: 69 6e 65 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  ine.** the table
1170: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
1180: 6f 20 74 68 65 20 69 6e 64 65 78 20 62 65 69 6e  o the index bein
1190: 67 20 77 72 69 74 74 65 6e 2c 20 74 68 69 73 0a  g written, this.
11a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
11b0: 74 6f 20 73 65 61 72 63 68 20 74 68 72 6f 75 67  to search throug
11c0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  h the database s
11d0: 63 68 65 6d 61 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  chema..**.** Ins
11e0: 74 65 61 64 20 6f 66 20 61 20 6c 6f 63 6b 20 6f  tead of a lock o
11f0: 6e 20 74 68 65 20 74 61 62 6c 65 2f 69 6e 64 65  n the table/inde
1200: 78 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65  x rooted at page
1210: 20 69 52 6f 6f 74 2c 20 74 68 65 20 63 61 6c 6c   iRoot, the call
1220: 65 72 20 6d 61 79 0a 2a 2a 20 68 6f 6c 64 20 61  er may.** hold a
1230: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
1240: 68 65 20 73 63 68 65 6d 61 20 74 61 62 6c 65 20  he schema table 
1250: 28 72 6f 6f 74 20 70 61 67 65 20 31 29 2e 20 54  (root page 1). T
1260: 68 69 73 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 61  his is also.** a
1270: 63 63 65 70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  cceptable..*/.st
1280: 61 74 69 63 20 69 6e 74 20 68 61 73 53 68 61 72  atic int hasShar
1290: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
12a0: 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
12b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61  e,         /* Ha
12c0: 6e 64 6c 65 20 74 68 61 74 20 6d 75 73 74 20 68  ndle that must h
12d0: 6f 6c 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 50 67  old lock */.  Pg
12e0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
12f0: 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
1300: 65 20 6f 66 20 62 2d 74 72 65 65 20 2a 2f 0a 20  e of b-tree */. 
1310: 20 69 6e 74 20 69 73 49 6e 64 65 78 2c 20 20 20   int isIndex,   
1320: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1330: 69 66 20 69 52 6f 6f 74 20 69 73 20 74 68 65 20  if iRoot is the 
1340: 72 6f 6f 74 20 6f 66 20 61 6e 20 69 6e 64 65 78  root of an index
1350: 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74   b-tree */.  int
1360: 20 65 4c 6f 63 6b 54 79 70 65 20 20 20 20 20 20   eLockType      
1370: 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
1380: 6c 6f 63 6b 20 74 79 70 65 20 28 52 45 41 44 5f  lock type (READ_
1390: 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f  LOCK or WRITE_LO
13a0: 43 4b 29 20 2a 2f 0a 29 7b 0a 20 20 53 63 68 65  CK) */.){.  Sche
13b0: 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d 20 28 53  ma *pSchema = (S
13c0: 63 68 65 6d 61 20 2a 29 70 42 74 72 65 65 2d 3e  chema *)pBtree->
13d0: 70 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20  pBt->pSchema;.  
13e0: 50 67 6e 6f 20 69 54 61 62 20 3d 20 30 3b 0a 20  Pgno iTab = 0;. 
13f0: 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a   BtLock *pLock;.
1400: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61  .  /* If this da
1410: 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20 73 68  tabase is not sh
1420: 61 72 65 61 62 6c 65 2c 20 6f 72 20 69 66 20 74  areable, or if t
1430: 68 65 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61  he client is rea
1440: 64 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 68 61  ding.  ** and ha
1450: 73 20 74 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d  s the read-uncom
1460: 6d 69 74 74 65 64 20 66 6c 61 67 20 73 65 74 2c  mitted flag set,
1470: 20 74 68 65 6e 20 6e 6f 20 6c 6f 63 6b 20 69 73   then no lock is
1480: 20 72 65 71 75 69 72 65 64 2e 20 0a 20 20 2a 2a   required. .  **
1490: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 6d 6d   Return true imm
14a0: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20  ediately..  */. 
14b0: 20 69 66 28 20 28 70 42 74 72 65 65 2d 3e 73 68   if( (pBtree->sh
14c0: 61 72 61 62 6c 65 3d 3d 30 29 0a 20 20 20 7c 7c  arable==0).   ||
14d0: 20 28 65 4c 6f 63 6b 54 79 70 65 3d 3d 52 45 41   (eLockType==REA
14e0: 44 5f 4c 4f 43 4b 20 26 26 20 28 70 42 74 72 65  D_LOCK && (pBtre
14f0: 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1500: 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d  QLITE_ReadUncomm
1510: 69 74 74 65 64 29 29 0a 20 20 29 7b 0a 20 20 20  itted)).  ){.   
1520: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 0a   return 1;.  }..
1530: 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6c 69 65    /* If the clie
1540: 6e 74 20 69 73 20 72 65 61 64 69 6e 67 20 20 6f  nt is reading  o
1550: 72 20 77 72 69 74 69 6e 67 20 61 6e 20 69 6e 64  r writing an ind
1560: 65 78 20 61 6e 64 20 74 68 65 20 73 63 68 65 6d  ex and the schem
1570: 61 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 6c 6f  a is.  ** not lo
1580: 61 64 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73  aded, then it is
1590: 20 74 6f 6f 20 64 69 66 66 69 63 75 6c 74 20 74   too difficult t
15a0: 6f 20 61 63 74 75 61 6c 6c 79 20 63 68 65 63 6b  o actually check
15b0: 20 74 6f 20 73 65 65 20 69 66 0a 20 20 2a 2a 20   to see if.  ** 
15c0: 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
15d0: 73 20 61 72 65 20 68 65 6c 64 2e 20 20 53 6f 20  s are held.  So 
15e0: 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 2d 20  do not bother - 
15f0: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 72 75 65  just return true
1600: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 63 61 73 65  ..  ** This case
1610: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6d 65 20 75   does not come u
1620: 70 20 76 65 72 79 20 6f 66 74 65 6e 20 61 6e 79  p very often any
1630: 68 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  how..  */.  if( 
1640: 69 73 49 6e 64 65 78 20 26 26 20 28 21 70 53 63  isIndex && (!pSc
1650: 68 65 6d 61 20 7c 7c 20 28 70 53 63 68 65 6d 61  hema || (pSchema
1660: 2d 3e 73 63 68 65 6d 61 46 6c 61 67 73 26 44 42  ->schemaFlags&DB
1670: 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29 3d 3d  _SchemaLoaded)==
1680: 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
1690: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69   1;.  }..  /* Fi
16a0: 67 75 72 65 20 6f 75 74 20 74 68 65 20 72 6f 6f  gure out the roo
16b0: 74 2d 70 61 67 65 20 74 68 61 74 20 74 68 65 20  t-page that the 
16c0: 6c 6f 63 6b 20 73 68 6f 75 6c 64 20 62 65 20 68  lock should be h
16d0: 65 6c 64 20 6f 6e 2e 20 46 6f 72 20 74 61 62 6c  eld on. For tabl
16e0: 65 0a 20 20 2a 2a 20 62 2d 74 72 65 65 73 2c 20  e.  ** b-trees, 
16f0: 74 68 69 73 20 69 73 20 6a 75 73 74 20 74 68 65  this is just the
1700: 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
1710: 65 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 72  e b-tree being r
1720: 65 61 64 20 6f 72 0a 20 20 2a 2a 20 77 72 69 74  ead or.  ** writ
1730: 74 65 6e 2e 20 46 6f 72 20 69 6e 64 65 78 20 62  ten. For index b
1740: 2d 74 72 65 65 73 2c 20 69 74 20 69 73 20 74 68  -trees, it is th
1750: 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
1760: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  he associated.  
1770: 2a 2a 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  ** table.  */.  
1780: 69 66 28 20 69 73 49 6e 64 65 78 20 29 7b 0a 20  if( isIndex ){. 
1790: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
17a0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
17b0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
17c0: 6d 61 2d 3e 69 64 78 48 61 73 68 29 3b 20 70 3b  ma->idxHash); p;
17d0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
17e0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 49 6e 64  t(p)){.      Ind
17f0: 65 78 20 2a 70 49 64 78 20 3d 20 28 49 6e 64 65  ex *pIdx = (Inde
1800: 78 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  x *)sqliteHashDa
1810: 74 61 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  ta(p);.      if(
1820: 20 70 49 64 78 2d 3e 74 6e 75 6d 3d 3d 28 69 6e   pIdx->tnum==(in
1830: 74 29 69 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20  t)iRoot ){.     
1840: 20 20 20 69 66 28 20 69 54 61 62 20 29 7b 0a 20     if( iTab ){. 
1850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 77 6f 20           /* Two 
1860: 6f 72 20 6d 6f 72 65 20 69 6e 64 65 78 65 73 20  or more indexes 
1870: 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20 72  share the same r
1880: 6f 6f 74 20 70 61 67 65 2e 20 20 54 68 65 72 65  oot page.  There
1890: 20 6d 75 73 74 0a 20 20 20 20 20 20 20 20 20 20   must.          
18a0: 2a 2a 20 62 65 20 69 6d 70 6f 73 74 65 72 20 74  ** be imposter t
18b0: 61 62 6c 65 73 2e 20 20 53 6f 20 6a 75 73 74 20  ables.  So just 
18c0: 72 65 74 75 72 6e 20 74 72 75 65 2e 20 20 54 68  return true.  Th
18d0: 65 20 61 73 73 65 72 74 20 69 73 20 6e 6f 74 0a  e assert is not.
18e0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65            ** use
18f0: 66 75 6c 20 69 6e 20 74 68 61 74 20 63 61 73 65  ful in that case
1900: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
1910: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
1920: 20 7d 0a 20 20 20 20 20 20 20 20 69 54 61 62 20   }.        iTab 
1930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
1940: 74 6e 75 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tnum;.      }.  
1950: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1960: 20 69 54 61 62 20 3d 20 69 52 6f 6f 74 3b 0a 20   iTab = iRoot;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20   }..  /* Search 
1980: 66 6f 72 20 74 68 65 20 72 65 71 75 69 72 65 64  for the required
1990: 20 6c 6f 63 6b 2e 20 45 69 74 68 65 72 20 61 20   lock. Either a 
19a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 72 6f  write-lock on ro
19b0: 6f 74 2d 70 61 67 65 20 69 54 61 62 2c 20 61 20  ot-page iTab, a 
19c0: 0a 20 20 2a 2a 20 77 72 69 74 65 2d 6c 6f 63 6b  .  ** write-lock
19d0: 20 6f 6e 20 74 68 65 20 73 63 68 65 6d 61 20 74   on the schema t
19e0: 61 62 6c 65 2c 20 6f 72 20 28 69 66 20 74 68 65  able, or (if the
19f0: 20 63 6c 69 65 6e 74 20 69 73 20 72 65 61 64 69   client is readi
1a00: 6e 67 29 20 61 0a 20 20 2a 2a 20 72 65 61 64 2d  ng) a.  ** read-
1a10: 6c 6f 63 6b 20 6f 6e 20 69 54 61 62 20 77 69 6c  lock on iTab wil
1a20: 6c 20 73 75 66 66 69 63 65 2e 20 52 65 74 75 72  l suffice. Retur
1a30: 6e 20 31 20 69 66 20 61 6e 79 20 6f 66 20 74 68  n 1 if any of th
1a40: 65 73 65 20 61 72 65 20 66 6f 75 6e 64 2e 20 20  ese are found.  
1a50: 2a 2f 0a 20 20 66 6f 72 28 70 4c 6f 63 6b 3d 70  */.  for(pLock=p
1a60: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 4c 6f 63  Btree->pBt->pLoc
1a70: 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3d  k; pLock; pLock=
1a80: 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 29 7b 0a 20  pLock->pNext){. 
1a90: 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e 70 42     if( pLock->pB
1aa0: 74 72 65 65 3d 3d 70 42 74 72 65 65 20 0a 20 20  tree==pBtree .  
1ab0: 20 20 20 26 26 20 28 70 4c 6f 63 6b 2d 3e 69 54     && (pLock->iT
1ac0: 61 62 6c 65 3d 3d 69 54 61 62 20 7c 7c 20 28 70  able==iTab || (p
1ad0: 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 57 52 49  Lock->eLock==WRI
1ae0: 54 45 5f 4c 4f 43 4b 20 26 26 20 70 4c 6f 63 6b  TE_LOCK && pLock
1af0: 2d 3e 69 54 61 62 6c 65 3d 3d 31 29 29 0a 20 20  ->iTable==1)).  
1b00: 20 20 20 26 26 20 70 4c 6f 63 6b 2d 3e 65 4c 6f     && pLock->eLo
1b10: 63 6b 3e 3d 65 4c 6f 63 6b 54 79 70 65 20 0a 20  ck>=eLockType . 
1b20: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1b30: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 1;.    }.  }.
1b40: 0a 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20  .  /* Failed to 
1b50: 66 69 6e 64 20 74 68 65 20 72 65 71 75 69 72 65  find the require
1b60: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 65 74  d lock. */.  ret
1b70: 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 0;.}.#endif 
1b80: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
1b90: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
1ba0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 2a 2a 20  E_DEBUG./*.**** 
1bb0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
1bc0: 79 20 62 65 20 75 73 65 64 20 61 73 20 70 61 72  y be used as par
1bd0: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74  t of assert() st
1be0: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 20 2a  atements only. *
1bf0: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ***.**.** Return
1c00: 20 74 72 75 65 20 69 66 20 69 74 20 77 6f 75 6c   true if it woul
1c10: 64 20 62 65 20 69 6c 6c 65 67 61 6c 20 66 6f 72  d be illegal for
1c20: 20 70 42 74 72 65 65 20 74 6f 20 77 72 69 74 65   pBtree to write
1c30: 20 69 6e 74 6f 20 74 68 65 0a 2a 2a 20 74 61 62   into the.** tab
1c40: 6c 65 20 6f 72 20 69 6e 64 65 78 20 72 6f 6f 74  le or index root
1c50: 65 64 20 61 74 20 69 52 6f 6f 74 20 62 65 63 61  ed at iRoot beca
1c60: 75 73 65 20 6f 74 68 65 72 20 73 68 61 72 65 64  use other shared
1c70: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
1c80: 0a 2a 2a 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  .** simultaneous
1c90: 6c 79 20 72 65 61 64 69 6e 67 20 74 68 61 74 20  ly reading that 
1ca0: 73 61 6d 65 20 74 61 62 6c 65 20 6f 72 20 69 6e  same table or in
1cb0: 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  dex..**.** It is
1cc0: 20 69 6c 6c 65 67 61 6c 20 66 6f 72 20 70 42 74   illegal for pBt
1cd0: 72 65 65 20 74 6f 20 77 72 69 74 65 20 69 66 20  ree to write if 
1ce0: 73 6f 6d 65 20 6f 74 68 65 72 20 42 74 72 65 65  some other Btree
1cf0: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
1d00: 73 68 61 72 65 73 20 74 68 65 20 73 61 6d 65 20  shares the same 
1d10: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
1d20: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 72 65 61  is currently rea
1d30: 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 0a  ding or writing.
1d40: 2a 2a 20 74 68 65 20 69 52 6f 6f 74 20 74 61 62  ** the iRoot tab
1d50: 6c 65 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  le.  Except, if 
1d60: 74 68 65 20 6f 74 68 65 72 20 42 74 72 65 65 20  the other Btree 
1d70: 6f 62 6a 65 63 74 20 68 61 73 20 74 68 65 0a 2a  object has the.*
1d80: 2a 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  * read-uncommitt
1d90: 65 64 20 66 6c 61 67 20 73 65 74 2c 20 74 68 65  ed flag set, the
1da0: 6e 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74  n it is OK for t
1db0: 68 65 20 6f 74 68 65 72 20 6f 62 6a 65 63 74 20  he other object 
1dc0: 74 6f 0a 2a 2a 20 68 61 76 65 20 61 20 72 65 61  to.** have a rea
1dd0: 64 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  d cursor..**.** 
1de0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62 65 66  For example, bef
1df0: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61  ore writing to a
1e00: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 74  ny part of the t
1e10: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 0a 2a 2a  able or index.**
1e20: 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 20   rooted at page 
1e30: 69 52 6f 6f 74 2c 20 6f 6e 65 20 73 68 6f 75 6c  iRoot, one shoul
1e40: 64 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  d call:.**.**   
1e50: 20 61 73 73 65 72 74 28 20 21 68 61 73 52 65 61   assert( !hasRea
1e60: 64 43 6f 6e 66 6c 69 63 74 73 28 70 42 74 72 65  dConflicts(pBtre
1e70: 65 2c 20 69 52 6f 6f 74 29 20 29 3b 0a 2a 2f 0a  e, iRoot) );.*/.
1e80: 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 52 65  static int hasRe
1e90: 61 64 43 6f 6e 66 6c 69 63 74 73 28 42 74 72 65  adConflicts(Btre
1ea0: 65 20 2a 70 42 74 72 65 65 2c 20 50 67 6e 6f 20  e *pBtree, Pgno 
1eb0: 69 52 6f 6f 74 29 7b 0a 20 20 42 74 43 75 72 73  iRoot){.  BtCurs
1ec0: 6f 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  or *p;.  for(p=p
1ed0: 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
1ee0: 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
1ef0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xt){.    if( p->
1f00: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 20  pgnoRoot==iRoot 
1f10: 0a 20 20 20 20 20 26 26 20 70 2d 3e 70 42 74 72  .     && p->pBtr
1f20: 65 65 21 3d 70 42 74 72 65 65 0a 20 20 20 20 20  ee!=pBtree.     
1f30: 26 26 20 30 3d 3d 28 70 2d 3e 70 42 74 72 65 65  && 0==(p->pBtree
1f40: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
1f50: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
1f60: 74 74 65 64 29 0a 20 20 20 20 29 7b 0a 20 20 20  tted).    ){.   
1f70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1f80: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1f90: 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  0;.}.#endif    /
1fa0: 2a 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  * #ifdef SQLITE_
1fb0: 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  DEBUG */../*.** 
1fc0: 51 75 65 72 79 20 74 6f 20 73 65 65 20 69 66 20  Query to see if 
1fd0: 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 20 6d  Btree handle p m
1fe0: 61 79 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ay obtain a lock
1ff0: 20 6f 66 20 74 79 70 65 20 65 4c 6f 63 6b 20 0a   of type eLock .
2000: 2a 2a 20 28 52 45 41 44 5f 4c 4f 43 4b 20 6f 72  ** (READ_LOCK or
2010: 20 57 52 49 54 45 5f 4c 4f 43 4b 29 20 6f 6e 20   WRITE_LOCK) on 
2020: 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 72  the table with r
2030: 6f 6f 74 2d 70 61 67 65 20 69 54 61 62 2e 20 52  oot-page iTab. R
2040: 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f  eturn.** SQLITE_
2050: 4f 4b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 6d  OK if the lock m
2060: 61 79 20 62 65 20 6f 62 74 61 69 6e 65 64 20 28  ay be obtained (
2070: 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 65  by calling.** se
2080: 74 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  tSharedCacheTabl
2090: 65 4c 6f 63 6b 28 29 29 2c 20 6f 72 20 53 51 4c  eLock()), or SQL
20a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 6e 6f  ITE_LOCKED if no
20b0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
20c0: 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63 68   querySharedCach
20d0: 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  eTableLock(Btree
20e0: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
20f0: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
2100: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2110: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
2120: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
2130: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
2140: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
2150: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
2160: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
2170: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
2180: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
2190: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
21a0: 20 21 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26   !(p->db->flags&
21b0: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
21c0: 6d 69 74 74 65 64 29 7c 7c 65 4c 6f 63 6b 3d 3d  mitted)||eLock==
21d0: 57 52 49 54 45 5f 4c 4f 43 4b 7c 7c 69 54 61 62  WRITE_LOCK||iTab
21e0: 3d 3d 31 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==1 );.  .  /* I
21f0: 66 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 77  f requesting a w
2200: 72 69 74 65 2d 6c 6f 63 6b 2c 20 74 68 65 6e 20  rite-lock, then 
2210: 74 68 65 20 42 74 72 65 65 20 6d 75 73 74 20 68  the Btree must h
2220: 61 76 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  ave an open writ
2230: 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  e.  ** transacti
2240: 6f 6e 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2e  on on this file.
2250: 20 41 6e 64 2c 20 6f 62 76 69 6f 75 73 6c 79 2c   And, obviously,
2260: 20 66 6f 72 20 74 68 69 73 20 74 6f 20 62 65 20   for this to be 
2270: 73 6f 20 74 68 65 72 65 20 0a 20 20 2a 2a 20 6d  so there .  ** m
2280: 75 73 74 20 62 65 20 61 6e 20 6f 70 65 6e 20 77  ust be an open w
2290: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
22a0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 69 74 73   on the file its
22b0: 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  elf..  */.  asse
22c0: 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  rt( eLock==READ_
22d0: 4c 4f 43 4b 20 7c 7c 20 28 70 3d 3d 70 42 74 2d  LOCK || (p==pBt-
22e0: 3e 70 57 72 69 74 65 72 20 26 26 20 70 2d 3e 69  >pWriter && p->i
22f0: 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
2300: 49 54 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ITE) );.  assert
2310: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2320: 43 4b 20 7c 7c 20 70 42 74 2d 3e 69 6e 54 72 61  CK || pBt->inTra
2330: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
2340: 57 52 49 54 45 20 29 3b 0a 20 20 0a 20 20 2f 2a  WRITE );.  .  /*
2350: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
2360: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20   a no-op if the 
2370: 73 68 61 72 65 64 2d 63 61 63 68 65 20 69 73 20  shared-cache is 
2380: 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20  not enabled */. 
2390: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
23a0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
23b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
23c0: 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 6f 74 68    /* If some oth
23d0: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73  er connection is
23e0: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 65 78 63 6c   holding an excl
23f0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 74 68 65 0a  usive lock, the.
2400: 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 20 6c    ** requested l
2410: 6f 63 6b 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ock may not be o
2420: 62 74 61 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20  btained..  */.  
2430: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
2440: 21 3d 70 20 26 26 20 28 70 42 74 2d 3e 62 74 73  !=p && (pBt->bts
2450: 46 6c 61 67 73 20 26 20 42 54 53 5f 45 58 43 4c  Flags & BTS_EXCL
2460: 55 53 49 56 45 29 21 3d 30 20 29 7b 0a 20 20 20  USIVE)!=0 ){.   
2470: 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
2480: 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c  onBlocked(p->db,
2490: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64   pBt->pWriter->d
24a0: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
24b0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
24c0: 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
24d0: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
24e0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
24f0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
2500: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ){.    /* The co
2510: 6e 64 69 74 69 6f 6e 20 28 70 49 74 65 72 2d 3e  ndition (pIter->
2520: 65 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 29 20 69 6e  eLock!=eLock) in
2530: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
2540: 66 28 2e 2e 2e 29 20 0a 20 20 20 20 2a 2a 20 73  f(...) .    ** s
2550: 74 61 74 65 6d 65 6e 74 20 69 73 20 61 20 73 69  tatement is a si
2560: 6d 70 6c 69 66 69 63 61 74 69 6f 6e 20 6f 66 3a  mplification of:
2570: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
2580: 20 28 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c   (eLock==WRITE_L
2590: 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65 4c  OCK || pIter->eL
25a0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 29  ock==WRITE_LOCK)
25b0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 73  .    **.    ** s
25c0: 69 6e 63 65 20 77 65 20 6b 6e 6f 77 20 74 68 61  ince we know tha
25d0: 74 20 69 66 20 65 4c 6f 63 6b 3d 3d 57 52 49 54  t if eLock==WRIT
25e0: 45 5f 4c 4f 43 4b 2c 20 74 68 65 6e 20 6e 6f 20  E_LOCK, then no 
25f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2600: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 68 6f 6c 64  .    ** may hold
2610: 20 61 20 57 52 49 54 45 5f 4c 4f 43 4b 20 6f 6e   a WRITE_LOCK on
2620: 20 61 6e 79 20 74 61 62 6c 65 20 69 6e 20 74 68   any table in th
2630: 69 73 20 66 69 6c 65 20 28 73 69 6e 63 65 20 74  is file (since t
2640: 68 65 72 65 20 63 61 6e 0a 20 20 20 20 2a 2a 20  here can.    ** 
2650: 6f 6e 6c 79 20 62 65 20 61 20 73 69 6e 67 6c 65  only be a single
2660: 20 77 72 69 74 65 72 29 2e 0a 20 20 20 20 2a 2f   writer)..    */
2670: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
2680: 65 72 2d 3e 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f  er->eLock==READ_
2690: 4c 4f 43 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 65  LOCK || pIter->e
26a0: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
26b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
26c0: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
26d0: 20 7c 7c 20 70 49 74 65 72 2d 3e 70 42 74 72 65   || pIter->pBtre
26e0: 65 3d 3d 70 20 7c 7c 20 70 49 74 65 72 2d 3e 65  e==p || pIter->e
26f0: 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock==READ_LOCK)
2700: 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
2710: 3e 70 42 74 72 65 65 21 3d 70 20 26 26 20 70 49  >pBtree!=p && pI
2720: 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61  ter->iTable==iTa
2730: 62 20 26 26 20 70 49 74 65 72 2d 3e 65 4c 6f 63  b && pIter->eLoc
2740: 6b 21 3d 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k!=eLock ){.    
2750: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
2760: 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62  ionBlocked(p->db
2770: 2c 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 2d  , pIter->pBtree-
2780: 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
2790: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
27a0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
27b0: 65 72 74 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72  ert( p==pBt->pWr
27c0: 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  iter );.        
27d0: 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
27e0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20   BTS_PENDING;.  
27f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
2800: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2810: 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2820: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2830: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
2840: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
2850: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
2860: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
2870: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
2880: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64  _CACHE./*.** Add
2890: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 74   a lock on the t
28a0: 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70  able with root-p
28b0: 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74 68  age iTable to th
28c0: 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 75  e shared-btree u
28d0: 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65 20  sed.** by Btree 
28e0: 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d 65  handle p. Parame
28f0: 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20 62  ter eLock must b
2900: 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c 4f  e either READ_LO
2910: 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45 5f  CK or .** WRITE_
2920: 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  LOCK..**.** This
2930: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65   function assume
2940: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2950: 0a 2a 2a 0a 2a 2a 20 20 20 28 61 29 20 54 68 65  .**.**   (a) The
2960: 20 73 70 65 63 69 66 69 65 64 20 42 74 72 65 65   specified Btree
2970: 20 6f 62 6a 65 63 74 20 70 20 69 73 20 63 6f 6e   object p is con
2980: 6e 65 63 74 65 64 20 74 6f 20 61 20 73 68 61 72  nected to a shar
2990: 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 64 61  able.**       da
29a0: 74 61 62 61 73 65 20 28 6f 6e 65 20 77 69 74 68  tabase (one with
29b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 73 68   the BtShared.sh
29c0: 61 72 61 62 6c 65 20 66 6c 61 67 20 73 65 74 29  arable flag set)
29d0: 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 28 62  , and.**.**   (b
29e0: 29 20 4e 6f 20 6f 74 68 65 72 20 42 74 72 65 65  ) No other Btree
29f0: 20 6f 62 6a 65 63 74 73 20 68 6f 6c 64 20 61 20   objects hold a 
2a00: 6c 6f 63 6b 20 74 68 61 74 20 63 6f 6e 66 6c 69  lock that confli
2a10: 63 74 73 0a 2a 2a 20 20 20 20 20 20 20 77 69 74  cts.**       wit
2a20: 68 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  h the requested 
2a30: 6c 6f 63 6b 20 28 69 2e 65 2e 20 71 75 65 72 79  lock (i.e. query
2a40: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
2a50: 4c 6f 63 6b 28 29 20 68 61 73 0a 2a 2a 20 20 20  Lock() has.**   
2a60: 20 20 20 20 61 6c 72 65 61 64 79 20 62 65 65 6e      already been
2a70: 20 63 61 6c 6c 65 64 20 61 6e 64 20 72 65 74 75   called and retu
2a80: 72 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4b 29 2e  rned SQLITE_OK).
2a90: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2aa0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2ab0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65  the lock is adde
2ac0: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  d successfully. 
2ad0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 0a 2a 2a  SQLITE_NOMEM .**
2ae0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2af0: 61 20 6d 61 6c 6c 6f 63 20 61 74 74 65 6d 70 74  a malloc attempt
2b00: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
2b10: 63 20 69 6e 74 20 73 65 74 53 68 61 72 65 64 43  c int setSharedC
2b20: 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42 74  acheTableLock(Bt
2b30: 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
2b40: 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a  ble, u8 eLock){.
2b50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2b60: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f  = p->pBt;.  BtLo
2b70: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20  ck *pLock = 0;. 
2b80: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
2b90: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ba0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
2bc0: 28 20 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f  ( eLock==READ_LO
2bd0: 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49  CK || eLock==WRI
2be0: 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  TE_LOCK );.  ass
2bf0: 65 72 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b  ert( p->db!=0 );
2c00: 0a 0a 20 20 2f 2a 20 41 20 63 6f 6e 6e 65 63 74  ..  /* A connect
2c10: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 61  ion with the rea
2c20: 64 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c  d-uncommitted fl
2c30: 61 67 20 73 65 74 20 77 69 6c 6c 20 6e 65 76 65  ag set will neve
2c40: 72 20 74 72 79 20 74 6f 0a 20 20 2a 2a 20 6f 62  r try to.  ** ob
2c50: 74 61 69 6e 20 61 20 72 65 61 64 2d 6c 6f 63 6b  tain a read-lock
2c60: 20 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63   using this func
2c70: 74 69 6f 6e 2e 20 54 68 65 20 6f 6e 6c 79 20 72  tion. The only r
2c80: 65 61 64 2d 6c 6f 63 6b 20 6f 62 74 61 69 6e 65  ead-lock obtaine
2c90: 64 0a 20 20 2a 2a 20 62 79 20 61 20 63 6f 6e 6e  d.  ** by a conn
2ca0: 65 63 74 69 6f 6e 20 69 6e 20 72 65 61 64 2d 75  ection in read-u
2cb0: 6e 63 6f 6d 6d 69 74 74 65 64 20 6d 6f 64 65 20  ncommitted mode 
2cc0: 69 73 20 6f 6e 20 74 68 65 20 73 71 6c 69 74 65  is on the sqlite
2cd0: 5f 6d 61 73 74 65 72 20 0a 20 20 2a 2a 20 74 61  _master .  ** ta
2ce0: 62 6c 65 2c 20 61 6e 64 20 74 68 61 74 20 6c 6f  ble, and that lo
2cf0: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69  ck is obtained i
2d00: 6e 20 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  n BtreeBeginTran
2d10: 73 28 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  s().  */.  asser
2d20: 74 28 20 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c  t( 0==(p->db->fl
2d30: 61 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55  ags&SQLITE_ReadU
2d40: 6e 63 6f 6d 6d 69 74 74 65 64 29 20 7c 7c 20 65  ncommitted) || e
2d50: 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b  Lock==WRITE_LOCK
2d60: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66   );..  /* This f
2d70: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
2d80: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  nly be called on
2d90: 20 61 20 73 68 61 72 61 62 6c 65 20 62 2d 74 72   a sharable b-tr
2da0: 65 65 20 61 66 74 65 72 20 69 74 20 0a 20 20 2a  ee after it .  *
2db0: 2a 20 68 61 73 20 62 65 65 6e 20 64 65 74 65 72  * has been deter
2dc0: 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20 6f 74  mined that no ot
2dd0: 68 65 72 20 62 2d 74 72 65 65 20 68 6f 6c 64 73  her b-tree holds
2de0: 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
2df0: 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  ock.  */.  asser
2e00: 74 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  t( p->sharable )
2e10: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2e20: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
2e30: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
2e40: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
2e50: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 72 73  k) );..  /* Firs
2e60: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
2e70: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
2e80: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
2e90: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
2ea0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
2eb0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
2ec0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
2ed0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
2ee0: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
2ef0: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
2f00: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
2f10: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
2f20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
2f30: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
2f40: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
2f50: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
2f60: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
2f70: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
2f80: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
2f90: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
2fa0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
2fb0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
2fc0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
2fd0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
2fe0: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
2ff0: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
3000: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
3010: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
3020: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
3030: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
3040: 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65     pLock->iTable
3050: 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20 20 20 70   = iTable;.    p
3060: 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 3d 20 70  Lock->pBtree = p
3070: 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ;.    pLock->pNe
3080: 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f 63 6b 3b  xt = pBt->pLock;
3090: 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f 63 6b 20  .    pBt->pLock 
30a0: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  = pLock;.  }..  
30b0: 2f 2a 20 53 65 74 20 74 68 65 20 42 74 4c 6f 63  /* Set the BtLoc
30c0: 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61 62 6c 65  k.eLock variable
30d0: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
30e0: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  of the current l
30f0: 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ock.  ** and the
3100: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2e   requested lock.
3110: 20 54 68 69 73 20 6d 65 61 6e 73 20 69 66 20 61   This means if a
3120: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77 61 73 20   write-lock was 
3130: 61 6c 72 65 61 64 79 20 68 65 6c 64 0a 20 20 2a  already held.  *
3140: 2a 20 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63  * and a read-loc
3150: 6b 20 72 65 71 75 65 73 74 65 64 2c 20 77 65 20  k requested, we 
3160: 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65 63 74 6c  don't incorrectl
3170: 79 20 64 6f 77 6e 67 72 61 64 65 20 74 68 65 20  y downgrade the 
3180: 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  lock..  */.  ass
3190: 65 72 74 28 20 57 52 49 54 45 5f 4c 4f 43 4b 3e  ert( WRITE_LOCK>
31a0: 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  READ_LOCK );.  i
31b0: 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e  f( eLock>pLock->
31c0: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f  eLock ){.    pLo
31d0: 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63  ck->eLock = eLoc
31e0: 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  k;.  }..  return
31f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
3200: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f  ndif /* !SQLITE_
3210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
3220: 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  E */..#ifndef SQ
3230: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
3240: 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 52 65 6c  _CACHE./*.** Rel
3250: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 74 61 62  ease all the tab
3260: 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63 6b 73 20  le locks (locks 
3270: 6f 62 74 61 69 6e 65 64 20 76 69 61 20 63 61 6c  obtained via cal
3280: 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73 65 74  ls to.** the set
3290: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
32a0: 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64 75 72 65  Lock() procedure
32b0: 29 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20  ) held by Btree 
32c0: 6f 62 6a 65 63 74 20 70 2e 0a 2a 2a 0a 2a 2a 20  object p..**.** 
32d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73  This function as
32e0: 73 75 6d 65 73 20 74 68 61 74 20 42 74 72 65 65  sumes that Btree
32f0: 20 70 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 72   p has an open r
3300: 65 61 64 20 6f 72 20 77 72 69 74 65 20 0a 2a 2a  ead or write .**
3310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
3320: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 74 68   it does not, th
3330: 65 6e 20 74 68 65 20 42 54 53 5f 50 45 4e 44 49  en the BTS_PENDI
3340: 4e 47 20 66 6c 61 67 0a 2a 2a 20 6d 61 79 20 62  NG flag.** may b
3350: 65 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 63 6c  e incorrectly cl
3360: 65 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eared..*/.static
3370: 20 76 6f 69 64 20 63 6c 65 61 72 41 6c 6c 53 68   void clearAllSh
3380: 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f  aredCacheTableLo
3390: 63 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  cks(Btree *p){. 
33a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33b0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
33c0: 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26 70 42  k **ppIter = &pB
33d0: 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73  t->pLock;..  ass
33e0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
33f0: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
3400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
3410: 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70  harable || 0==*p
3420: 70 49 74 65 72 20 29 3b 0a 20 20 61 73 73 65 72  pIter );.  asser
3430: 74 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 30 20  t( p->inTrans>0 
3440: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  );..  while( *pp
3450: 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74 4c 6f  Iter ){.    BtLo
3460: 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70 70 49  ck *pLock = *ppI
3470: 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ter;.    assert(
3480: 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20   (pBt->btsFlags 
3490: 26 20 42 54 53 5f 45 58 43 4c 55 53 49 56 45 29  & BTS_EXCLUSIVE)
34a0: 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69  ==0 || pBt->pWri
34b0: 74 65 72 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72  ter==pLock->pBtr
34c0: 65 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ee );.    assert
34d0: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 2d  ( pLock->pBtree-
34e0: 3e 69 6e 54 72 61 6e 73 3e 3d 70 4c 6f 63 6b 2d  >inTrans>=pLock-
34f0: 3e 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66  >eLock );.    if
3500: 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 3d  ( pLock->pBtree=
3510: 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 49  =p ){.      *ppI
3520: 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e 65  ter = pLock->pNe
3530: 78 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  xt;.      assert
3540: 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65 21  ( pLock->iTable!
3550: 3d 31 20 7c 7c 20 70 4c 6f 63 6b 3d 3d 26 70 2d  =1 || pLock==&p-
3560: 3e 6c 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 69  >lock );.      i
3570: 66 28 20 70 4c 6f 63 6b 2d 3e 69 54 61 62 6c 65  f( pLock->iTable
3580: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=1 ){.        s
3590: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c 6f 63  qlite3_free(pLoc
35a0: 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
35b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 49  }else{.      ppI
35c0: 74 65 72 20 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e  ter = &pLock->pN
35d0: 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ext;.    }.  }..
35e0: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
35f0: 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50  btsFlags & BTS_P
3600: 45 4e 44 49 4e 47 29 3d 3d 30 20 7c 7c 20 70 42  ENDING)==0 || pB
3610: 74 2d 3e 70 57 72 69 74 65 72 20 29 3b 0a 20 20  t->pWriter );.  
3620: 69 66 28 20 70 42 74 2d 3e 70 57 72 69 74 65 72  if( pBt->pWriter
3630: 3d 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ==p ){.    pBt->
3640: 70 57 72 69 74 65 72 20 3d 20 30 3b 0a 20 20 20  pWriter = 0;.   
3650: 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
3660: 3d 20 7e 28 42 54 53 5f 45 58 43 4c 55 53 49 56  = ~(BTS_EXCLUSIV
3670: 45 7c 42 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a  E|BTS_PENDING);.
3680: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 74 2d    }else if( pBt-
3690: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 32  >nTransaction==2
36a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
36b0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36c0: 65 64 20 77 68 65 6e 20 42 74 72 65 65 20 70 20  ed when Btree p 
36d0: 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69 74  is concluding it
36e0: 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  s .    ** transa
36f0: 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65 20  ction. If there 
3700: 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 73  currently exists
3710: 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20 70   a writer, and p
3720: 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 74   is not.    ** t
3730: 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65 6e  hat writer, then
3740: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c   the number of l
3750: 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
3760: 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a 20  nections other. 
3770: 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20 77     ** than the w
3780: 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61 62  riter must be ab
3790: 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20 7a  out to drop to z
37a0: 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
37b0: 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65  e.    ** set the
37c0: 20 42 54 53 5f 50 45 4e 44 49 4e 47 20 66 6c 61   BTS_PENDING fla
37d0: 67 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20  g to 0..    **. 
37e0: 20 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69     ** If there i
37f0: 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
3800: 61 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42  a writer, then B
3810: 54 53 5f 50 45 4e 44 49 4e 47 20 6d 75 73 74 0a  TS_PENDING must.
3820: 20 20 20 20 2a 2a 20 62 65 20 7a 65 72 6f 20 61      ** be zero a
3830: 6c 72 65 61 64 79 2e 20 53 6f 20 74 68 69 73 20  lready. So this 
3840: 6e 65 78 74 20 6c 69 6e 65 20 69 73 20 68 61 72  next line is har
3850: 6d 6c 65 73 73 20 69 6e 20 74 68 61 74 20 63 61  mless in that ca
3860: 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  se..    */.    p
3870: 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20  Bt->btsFlags &= 
3880: 7e 42 54 53 5f 50 45 4e 44 49 4e 47 3b 0a 20 20  ~BTS_PENDING;.  
3890: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
38a0: 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67 65 73  function changes
38b0: 20 61 6c 6c 20 77 72 69 74 65 2d 6c 6f 63 6b 73   all write-locks
38c0: 20 68 65 6c 64 20 62 79 20 42 74 72 65 65 20 70   held by Btree p
38d0: 20 69 6e 74 6f 20 72 65 61 64 2d 6c 6f 63 6b 73   into read-locks
38e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
38f0: 20 64 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61   downgradeAllSha
3900: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
3910: 6b 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ks(Btree *p){.  
3920: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
3930: 70 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 70 42  p->pBt;.  if( pB
3940: 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70 20 29 7b  t->pWriter==p ){
3950: 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f  .    BtLock *pLo
3960: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72  ck;.    pBt->pWr
3970: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
3980: 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 3d 20 7e  t->btsFlags &= ~
3990: 28 42 54 53 5f 45 58 43 4c 55 53 49 56 45 7c 42  (BTS_EXCLUSIVE|B
39a0: 54 53 5f 50 45 4e 44 49 4e 47 29 3b 0a 20 20 20  TS_PENDING);.   
39b0: 20 66 6f 72 28 70 4c 6f 63 6b 3d 70 42 74 2d 3e   for(pLock=pBt->
39c0: 70 4c 6f 63 6b 3b 20 70 4c 6f 63 6b 3b 20 70 4c  pLock; pLock; pL
39d0: 6f 63 6b 3d 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74  ock=pLock->pNext
39e0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
39f0: 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 3d 3d 52   pLock->eLock==R
3a00: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 70 4c 6f 63  EAD_LOCK || pLoc
3a10: 6b 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 3b 0a  k->pBtree==p );.
3a20: 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f        pLock->eLo
3a30: 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b 0a  ck = READ_LOCK;.
3a40: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6e      }.  }.}..#en
3a50: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3a60: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20  IT_SHARED_CACHE 
3a70: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */..static void 
3a80: 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50  releasePage(MemP
3a90: 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20 2f 2a  age *pPage);  /*
3aa0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
3ab0: 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 20  ce */../*.***** 
3ac0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
3ad0: 75 73 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61  used inside of a
3ae0: 73 73 65 72 74 28 29 20 6f 6e 6c 79 20 2a 2a 2a  ssert() only ***
3af0: 2a 0a 2a 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74  *.**.** Verify t
3b00: 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 68  hat the cursor h
3b10: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 20 6f  olds the mutex o
3b20: 6e 20 69 74 73 20 42 74 53 68 61 72 65 64 0a 2a  n its BtShared.*
3b30: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3b40: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
3b50: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3b60: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
3b90: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 0a 2f  Bt->mutex);.}../
3ba0: 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
3bb0: 65 20 63 75 72 73 6f 72 20 61 6e 64 20 74 68 65  e cursor and the
3bc0: 20 42 74 53 68 61 72 65 64 20 61 67 72 65 65 20   BtShared agree 
3bd0: 61 62 6f 75 74 20 77 68 61 74 20 69 73 20 74 68  about what is th
3be0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 61 74  e current.** dat
3bf0: 61 62 61 73 65 20 63 6f 6e 6e 65 74 69 6f 6e 2e  abase connetion.
3c00: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
3c10: 6e 74 20 69 6e 20 73 68 61 72 65 64 2d 63 61 63  nt in shared-cac
3c20: 68 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65 20  he mode. If the 
3c30: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 63 6f 6e  database .** con
3c40: 6e 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 73  nection pointers
3c50: 20 67 65 74 20 6f 75 74 2d 6f 66 2d 73 79 6e 63   get out-of-sync
3c60: 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  , it is possible
3c70: 20 66 6f 72 20 72 6f 75 74 69 6e 65 73 20 6c 69   for routines li
3c80: 6b 65 0a 2a 2a 20 62 74 72 65 65 49 6e 69 74 50  ke.** btreeInitP
3c90: 61 67 65 28 29 20 74 6f 20 72 65 66 65 72 65 6e  age() to referen
3ca0: 63 65 20 61 6e 20 73 74 61 6c 65 20 63 6f 6e 6e  ce an stale conn
3cb0: 65 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 74  ection pointer t
3cc0: 68 61 74 20 72 65 66 65 72 65 6e 63 65 73 20 61  hat references a
3cd0: 0a 2a 2a 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  .** a connection
3ce0: 20 74 68 61 74 20 68 61 73 20 61 6c 72 65 61 64   that has alread
3cf0: 79 20 63 6c 6f 73 65 64 2e 20 20 54 68 69 73 20  y closed.  This 
3d00: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
3d10: 69 6e 73 69 64 65 20 61 73 73 65 72 74 28 29 0a  inside assert().
3d20: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  ** statements on
3d30: 6c 79 20 61 6e 64 20 66 6f 72 20 74 68 65 20 70  ly and for the p
3d40: 75 72 70 6f 73 65 20 6f 66 20 64 6f 75 62 6c 65  urpose of double
3d50: 2d 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74  -checking that t
3d60: 68 65 20 62 74 72 65 65 20 63 6f 64 65 0a 2a 2a  he btree code.**
3d70: 20 64 6f 65 73 20 6b 65 65 70 20 74 68 65 20 64   does keep the d
3d80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
3d90: 6f 6e 20 70 6f 69 6e 74 65 72 73 20 75 70 2d 74  on pointers up-t
3da0: 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o-date..*/.stati
3db0: 63 20 69 6e 74 20 63 75 72 73 6f 72 4f 77 6e 73  c int cursorOwns
3dc0: 42 74 53 68 61 72 65 64 28 42 74 43 75 72 73 6f  BtShared(BtCurso
3dd0: 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  r *p){.  assert(
3de0: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
3df0: 78 28 70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  x(p) );.  return
3e00: 20 28 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3d   (p->pBtree->db=
3e10: 3d 70 2d 3e 70 42 74 2d 3e 64 62 29 3b 0a 7d 0a  =p->pBt->db);.}.
3e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
3e30: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
3e40: 72 66 6c 6f 77 20 63 61 63 68 65 20 6f 66 20 74  rflow cache of t
3e50: 68 65 20 63 75 72 73 6f 72 20 70 61 73 73 65 64  he cursor passed
3e60: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
3e70: 67 75 6d 65 6e 74 2e 0a 2a 2a 20 6f 6e 20 74 68  gument..** on th
3e80: 65 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73  e shared btree s
3e90: 74 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f  tructure pBt..*/
3ea0: 0a 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64  .#define invalid
3eb0: 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  ateOverflowCache
3ec0: 28 70 43 75 72 29 20 28 70 43 75 72 2d 3e 63 75  (pCur) (pCur->cu
3ed0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
3ee0: 56 61 6c 69 64 4f 76 66 6c 29 0a 0a 2f 2a 0a 2a  ValidOvfl)../*.*
3ef0: 2a 20 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65  * Invalidate the
3f00: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
3f10: 69 73 74 20 63 61 63 68 65 20 66 6f 72 20 61 6c  ist cache for al
3f20: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
3f30: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 68 61 72 65  .** on the share
3f40: 64 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72  d btree structur
3f50: 65 20 70 42 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e pBt..*/.static
3f60: 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 65   void invalidate
3f70: 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
3f80: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
3f90: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
3fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3fc0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 66 6f  ->mutex) );.  fo
3fd0: 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72  r(p=pBt->pCursor
3fe0: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
3ff0: 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  {.    invalidate
4000: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 29  OverflowCache(p)
4010: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
4020: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
4030: 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  RBLOB./*.** This
4040: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
4050: 6c 65 64 20 62 65 66 6f 72 65 20 6d 6f 64 69 66  led before modif
4060: 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ying the content
4070: 73 20 6f 66 20 61 20 74 61 62 6c 65 0a 2a 2a 20  s of a table.** 
4080: 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  to invalidate an
4090: 79 20 69 6e 63 72 62 6c 6f 62 20 63 75 72 73 6f  y incrblob curso
40a0: 72 73 20 74 68 61 74 20 61 72 65 20 6f 70 65 6e  rs that are open
40b0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 72 6f 77 20 6f   on the.** row o
40c0: 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 72 6f 77  r one of the row
40d0: 73 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64  s being modified
40e0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
40f0: 65 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65  ent isClearTable
4100: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
4110: 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
4120: 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 74 61 62  ts of the.** tab
4130: 6c 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  le is about to b
4140: 65 20 64 65 6c 65 74 65 64 2e 20 49 6e 20 74 68  e deleted. In th
4150: 69 73 20 63 61 73 65 20 69 6e 76 61 6c 69 64 61  is case invalida
4160: 74 65 20 61 6c 6c 20 69 6e 63 72 62 6c 6f 62 0a  te all incrblob.
4170: 2a 2a 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ** cursors open 
4180: 6f 6e 20 61 6e 79 20 72 6f 77 20 77 69 74 68 69  on any row withi
4190: 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  n the table with
41a0: 20 72 6f 6f 74 2d 70 61 67 65 20 70 67 6e 6f 52   root-page pgnoR
41b0: 6f 6f 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  oot..**.** Other
41c0: 77 69 73 65 2c 20 69 66 20 61 72 67 75 6d 65 6e  wise, if argumen
41d0: 74 20 69 73 43 6c 65 61 72 54 61 62 6c 65 20 69  t isClearTable i
41e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 74 68  s false, then th
41f0: 65 20 72 6f 77 20 77 69 74 68 0a 2a 2a 20 72 6f  e row with.** ro
4200: 77 69 64 20 69 52 6f 77 20 69 73 20 62 65 69 6e  wid iRow is bein
4210: 67 20 72 65 70 6c 61 63 65 64 20 6f 72 20 64 65  g replaced or de
4220: 6c 65 74 65 64 2e 20 49 6e 20 74 68 69 73 20 63  leted. In this c
4230: 61 73 65 20 69 6e 76 61 6c 69 64 61 74 65 0a 2a  ase invalidate.*
4240: 2a 20 6f 6e 6c 79 20 74 68 6f 73 65 20 69 6e 63  * only those inc
4250: 72 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70  rblob cursors op
4260: 65 6e 20 6f 6e 20 74 68 61 74 20 73 70 65 63 69  en on that speci
4270: 66 69 63 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  fic row..*/.stat
4280: 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61  ic void invalida
4290: 74 65 49 6e 63 72 62 6c 6f 62 43 75 72 73 6f 72  teIncrblobCursor
42a0: 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
42b0: 65 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ee,          /* 
42c0: 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
42d0: 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
42e0: 69 36 34 20 69 52 6f 77 2c 20 20 20 20 20 20 20  i64 iRow,       
42f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
4300: 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
4310: 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 20  be changing */. 
4320: 20 69 6e 74 20 69 73 43 6c 65 61 72 54 61 62 6c   int isClearTabl
4330: 65 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  e        /* True
4340: 20 69 66 20 61 6c 6c 20 72 6f 77 73 20 61 72 65   if all rows are
4350: 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a   being deleted *
4360: 2f 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  /.){.  BtCursor 
4370: 2a 70 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  *p;.  if( pBtree
4380: 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72  ->hasIncrblobCur
4390: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
43a0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
43b0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
43c0: 42 74 72 65 65 29 20 29 3b 0a 20 20 70 42 74 72  Btree) );.  pBtr
43d0: 65 65 2d 3e 68 61 73 49 6e 63 72 62 6c 6f 62 43  ee->hasIncrblobC
43e0: 75 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d  ur = 0;.  for(p=
43f0: 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75  pBtree->pBt->pCu
4400: 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
4410: 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ext){.    if( (p
4420: 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43  ->curFlags & BTC
4430: 46 5f 49 6e 63 72 62 6c 6f 62 29 21 3d 30 20 29  F_Incrblob)!=0 )
4440: 7b 0a 20 20 20 20 20 20 70 42 74 72 65 65 2d 3e  {.      pBtree->
4450: 68 61 73 49 6e 63 72 62 6c 6f 62 43 75 72 20 3d  hasIncrblobCur =
4460: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73   1;.      if( is
4470: 43 6c 65 61 72 54 61 62 6c 65 20 7c 7c 20 70 2d  ClearTable || p-
4480: 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
4490: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   ){.        p->e
44a0: 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
44b0: 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 7d 0a  NVALID;.      }.
44c0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 65 6c      }.  }.}..#el
44d0: 73 65 0a 20 20 2f 2a 20 53 74 75 62 20 66 75 6e  se.  /* Stub fun
44e0: 63 74 69 6f 6e 20 77 68 65 6e 20 49 4e 43 52 42  ction when INCRB
44f0: 4c 4f 42 20 69 73 20 6f 6d 69 74 74 65 64 20 2a  LOB is omitted *
4500: 2f 0a 20 20 23 64 65 66 69 6e 65 20 69 6e 76 61  /.  #define inva
4510: 6c 69 64 61 74 65 49 6e 63 72 62 6c 6f 62 43 75  lidateIncrblobCu
4520: 72 73 6f 72 73 28 78 2c 79 2c 7a 29 0a 23 65 6e  rsors(x,y,z).#en
4530: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
4540: 49 54 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a  IT_INCRBLOB */..
4550: 2f 2a 0a 2a 2a 20 53 65 74 20 62 69 74 20 70 67  /*.** Set bit pg
4560: 6e 6f 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  no of the BtShar
4570: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62  ed.pHasContent b
4580: 69 74 76 65 63 2e 20 54 68 69 73 20 69 73 20 63  itvec. This is c
4590: 61 6c 6c 65 64 20 0a 2a 2a 20 77 68 65 6e 20 61  alled .** when a
45a0: 20 70 61 67 65 20 74 68 61 74 20 70 72 65 76 69   page that previ
45b0: 6f 75 73 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ously contained 
45c0: 64 61 74 61 20 62 65 63 6f 6d 65 73 20 61 20 66  data becomes a f
45d0: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 0a 2a  ree-list leaf .*
45e0: 2a 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  * page..**.** Th
45f0: 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73 43  e BtShared.pHasC
4600: 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 20 65 78  ontent bitvec ex
4610: 69 73 74 73 20 74 6f 20 77 6f 72 6b 20 61 72 6f  ists to work aro
4620: 75 6e 64 20 61 6e 20 6f 62 73 63 75 72 65 0a 2a  und an obscure.*
4630: 2a 20 62 75 67 20 63 61 75 73 65 64 20 62 79 20  * bug caused by 
4640: 74 68 65 20 69 6e 74 65 72 61 63 74 69 6f 6e 20  the interaction 
4650: 6f 66 20 74 77 6f 20 75 73 65 66 75 6c 20 49 4f  of two useful IO
4660: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 73   optimizations s
4670: 75 72 72 6f 75 6e 64 69 6e 67 0a 2a 2a 20 66 72  urrounding.** fr
4680: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
4690: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
46a0: 68 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 73 20  hen all data is 
46b0: 64 65 6c 65 74 65 64 20 66 72 6f 6d 20 61 20 70  deleted from a p
46c0: 61 67 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  age and the page
46d0: 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20   becomes.**     
46e0: 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
46f0: 66 20 70 61 67 65 2c 20 74 68 65 20 70 61 67 65  f page, the page
4700: 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
4710: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
4720: 2a 2a 20 20 20 20 20 20 28 61 73 20 66 72 65 65  **      (as free
4730: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73  -list leaf pages
4740: 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 6d 65 61 6e   contain no mean
4750: 69 6e 67 66 75 6c 20 64 61 74 61 29 2e 20 53 6f  ingful data). So
4760: 6d 65 74 69 6d 65 73 0a 2a 2a 20 20 20 20 20 20  metimes.**      
4770: 73 75 63 68 20 61 20 70 61 67 65 20 69 73 20 6e  such a page is n
4780: 6f 74 20 65 76 65 6e 20 6a 6f 75 72 6e 61 6c 6c  ot even journall
4790: 65 64 20 28 61 73 20 69 74 20 77 69 6c 6c 20 6e  ed (as it will n
47a0: 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 0a  ot be modified,.
47b0: 2a 2a 20 20 20 20 20 20 77 68 79 20 62 6f 74 68  **      why both
47c0: 65 72 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 69  er journalling i
47d0: 74 3f 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20  t?)..**.**   2) 
47e0: 57 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  When a free-list
47f0: 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72 65   leaf page is re
4800: 75 73 65 64 2c 20 69 74 73 20 63 6f 6e 74 65 6e  used, its conten
4810: 74 20 69 73 20 6e 6f 74 20 72 65 61 64 0a 2a 2a  t is not read.**
4820: 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20 64        from the d
4830: 61 74 61 62 61 73 65 20 6f 72 20 77 72 69 74 74  atabase or writt
4840: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
4850: 6c 20 66 69 6c 65 20 28 77 68 79 20 73 68 6f 75  l file (why shou
4860: 6c 64 20 69 74 0a 2a 2a 20 20 20 20 20 20 62 65  ld it.**      be
4870: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61  , if it is not a
4880: 74 20 61 6c 6c 20 6d 65 61 6e 69 6e 67 66 75 6c  t all meaningful
4890: 3f 29 2e 0a 2a 2a 0a 2a 2a 20 42 79 20 74 68 65  ?)..**.** By the
48a0: 6d 73 65 6c 76 65 73 2c 20 74 68 65 73 65 20 6f  mselves, these o
48b0: 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 77 6f 72  ptimizations wor
48c0: 6b 20 66 69 6e 65 20 61 6e 64 20 70 72 6f 76 69  k fine and provi
48d0: 64 65 20 61 20 68 61 6e 64 79 0a 2a 2a 20 70 65  de a handy.** pe
48e0: 72 66 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 20  rformance boost 
48f0: 74 6f 20 62 75 6c 6b 20 64 65 6c 65 74 65 20 6f  to bulk delete o
4900: 72 20 69 6e 73 65 72 74 20 6f 70 65 72 61 74 69  r insert operati
4910: 6f 6e 73 2e 20 48 6f 77 65 76 65 72 2c 20 69 66  ons. However, if
4920: 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 6d 6f  .** a page is mo
4930: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
4940: 6c 69 73 74 20 61 6e 64 20 74 68 65 6e 20 72 65  list and then re
4950: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
4960: 73 61 6d 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  same.** transact
4970: 69 6f 6e 2c 20 61 20 70 72 6f 62 6c 65 6d 20 63  ion, a problem c
4980: 6f 6d 65 73 20 75 70 2e 20 49 66 20 74 68 65 20  omes up. If the 
4990: 70 61 67 65 20 69 73 20 6e 6f 74 20 6a 6f 75 72  page is not jour
49a0: 6e 61 6c 6c 65 64 20 77 68 65 6e 0a 2a 2a 20 69  nalled when.** i
49b0: 74 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 74 68  t is moved to th
49c0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20  e free-list and 
49d0: 69 74 20 69 73 20 61 6c 73 6f 20 6e 6f 74 20 6a  it is also not j
49e0: 6f 75 72 6e 61 6c 6c 65 64 20 77 68 65 6e 20 69  ournalled when i
49f0: 74 0a 2a 2a 20 69 73 20 65 78 74 72 61 63 74 65  t.** is extracte
4a00: 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d  d from the free-
4a10: 6c 69 73 74 20 61 6e 64 20 72 65 75 73 65 64 2c  list and reused,
4a20: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
4a30: 61 6c 20 64 61 74 61 0a 2a 2a 20 6d 61 79 20 62  al data.** may b
4a40: 65 20 6c 6f 73 74 2e 20 49 6e 20 74 68 65 20 65  e lost. In the e
4a50: 76 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  vent of a rollba
4a60: 63 6b 2c 20 69 74 20 6d 61 79 20 6e 6f 74 20 62  ck, it may not b
4a70: 65 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f  e possible.** to
4a80: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
4a90: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
4aa0: 67 69 6e 61 6c 20 63 6f 6e 66 69 67 75 72 61 74  ginal configurat
4ab0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ion..**.** The s
4ac0: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 68 65 20 42  olution is the B
4ad0: 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e 74  tShared.pHasCont
4ae0: 65 6e 74 20 62 69 74 76 65 63 2e 20 57 68 65 6e  ent bitvec. When
4af0: 65 76 65 72 20 61 20 70 61 67 65 20 69 73 20 0a  ever a page is .
4b00: 2a 2a 20 6d 6f 76 65 64 20 74 6f 20 62 65 63 6f  ** moved to beco
4b10: 6d 65 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c  me a free-list l
4b20: 65 61 66 20 70 61 67 65 2c 20 74 68 65 20 63 6f  eaf page, the co
4b30: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
4b40: 69 73 0a 2a 2a 20 73 65 74 20 69 6e 20 74 68 65  is.** set in the
4b50: 20 62 69 74 76 65 63 2e 20 57 68 65 6e 65 76 65   bitvec. Wheneve
4b60: 72 20 61 20 6c 65 61 66 20 70 61 67 65 20 69 73  r a leaf page is
4b70: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
4b80: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 0a 2a  the free-list,.*
4b90: 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 32  * optimization 2
4ba0: 20 61 62 6f 76 65 20 69 73 20 6f 6d 69 74 74 65   above is omitte
4bb0: 64 20 69 66 20 74 68 65 20 63 6f 72 72 65 73 70  d if the corresp
4bc0: 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 61 6c  onding bit is al
4bd0: 72 65 61 64 79 0a 2a 2a 20 73 65 74 20 69 6e 20  ready.** set in 
4be0: 42 74 53 68 61 72 65 64 2e 70 48 61 73 43 6f 6e  BtShared.pHasCon
4bf0: 74 65 6e 74 2e 20 54 68 65 20 63 6f 6e 74 65 6e  tent. The conten
4c00: 74 73 20 6f 66 20 74 68 65 20 62 69 74 76 65 63  ts of the bitvec
4c10: 20 61 72 65 20 63 6c 65 61 72 65 64 0a 2a 2a 20   are cleared.** 
4c20: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  at the end of ev
4c30: 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ery transaction.
4c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
4c50: 74 72 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e  treeSetHasConten
4c60: 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  t(BtShared *pBt,
4c70: 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69   Pgno pgno){.  i
4c80: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
4c90: 4b 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  K;.  if( !pBt->p
4ca0: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
4cb0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
4cc0: 70 42 74 2d 3e 6e 50 61 67 65 20 29 3b 0a 20 20  pBt->nPage );.  
4cd0: 20 20 70 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65    pBt->pHasConte
4ce0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  nt = sqlite3Bitv
4cf0: 65 63 43 72 65 61 74 65 28 70 42 74 2d 3e 6e 50  ecCreate(pBt->nP
4d00: 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 21 70  age);.    if( !p
4d10: 42 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20  Bt->pHasContent 
4d20: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
4d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
4d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
4d60: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
4d70: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
4d80: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
4d90: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
4da0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
4db0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
4dc0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
4dd0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
4de0: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
4df0: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
4e00: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
4e10: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
4e20: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
4e30: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
4e40: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
4e50: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
4e60: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
4e70: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
4e80: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
4e90: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
4ea0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
4eb0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
4ec0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
4ed0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
4ee0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
4ef0: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
4f00: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
4f10: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
4f20: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
4f30: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
4f40: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
4f50: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
4f60: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
4f70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4f80: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
4f90: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
4fa0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
4fb0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
4fc0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
4fd0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
4fe0: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
4ff0: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
5000: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
5010: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
5020: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
5030: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
5040: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
5050: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
5060: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
5070: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
5080: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
5090: 73 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 61 70  se all of the ap
50a0: 50 61 67 65 5b 5d 20 70 61 67 65 73 20 66 6f 72  Page[] pages for
50b0: 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74   a cursor..*/.st
50c0: 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65 52  atic void btreeR
50d0: 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72 50  eleaseAllCursorP
50e0: 61 67 65 73 28 42 74 43 75 72 73 6f 72 20 2a 70  ages(BtCursor *p
50f0: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
5100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75   for(i=0; i<=pCu
5110: 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a  r->iPage; i++){.
5120: 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
5130: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
5140: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61  ;.    pCur->apPa
5150: 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  ge[i] = 0;.  }. 
5160: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
5170: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  1;.}../*.** The 
5180: 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73  cursor passed as
5190: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
51a0: 6e 74 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  nt must point to
51b0: 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 0a 2a   a valid entry.*
51c0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
51d0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 28  tion is called (
51e0: 69 2e 65 2e 20 68 61 76 65 20 65 53 74 61 74 65  i.e. have eState
51f0: 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 29 2e  ==CURSOR_VALID).
5200: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
5210: 6e 20 73 61 76 65 73 20 74 68 65 20 63 75 72 72  n saves the curr
5220: 65 6e 74 20 63 75 72 73 6f 72 20 6b 65 79 20 69  ent cursor key i
5230: 6e 20 76 61 72 69 61 62 6c 65 73 20 70 43 75 72  n variables pCur
5240: 2d 3e 6e 4b 65 79 20 61 6e 64 0a 2a 2a 20 70 43  ->nKey and.** pC
5250: 75 72 2d 3e 70 4b 65 79 2e 20 53 51 4c 49 54 45  ur->pKey. SQLITE
5260: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
5270: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72  if successful or
5280: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
5290: 20 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77   .** code otherw
52a0: 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ise..**.** If th
52b0: 65 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e  e cursor is open
52c0: 20 6f 6e 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   on an intkey ta
52d0: 62 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  ble, then the in
52e0: 74 65 67 65 72 20 6b 65 79 0a 2a 2a 20 28 74 68  teger key.** (th
52f0: 65 20 72 6f 77 69 64 29 20 69 73 20 73 74 6f 72  e rowid) is stor
5300: 65 64 20 69 6e 20 70 43 75 72 2d 3e 6e 4b 65 79  ed in pCur->nKey
5310: 20 61 6e 64 20 70 43 75 72 2d 3e 70 4b 65 79 20   and pCur->pKey 
5320: 69 73 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 2a  is left set to.*
5330: 2a 20 4e 55 4c 4c 2e 20 49 66 20 74 68 65 20 63  * NULL. If the c
5340: 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 6f 6e  ursor is open on
5350: 20 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 74 61   a non-intkey ta
5360: 62 6c 65 2c 20 74 68 65 6e 20 70 43 75 72 2d 3e  ble, then pCur->
5370: 70 4b 65 79 20 69 73 20 0a 2a 2a 20 73 65 74 20  pKey is .** set 
5380: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 6d 61  to point to a ma
5390: 6c 6c 6f 63 65 64 20 62 75 66 66 65 72 20 70 43  lloced buffer pC
53a0: 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 69  ur->nKey bytes i
53b0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
53c0: 67 20 0a 2a 2a 20 74 68 65 20 6b 65 79 2e 0a 2a  g .** the key..*
53d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  /.static int sav
53e0: 65 43 75 72 73 6f 72 4b 65 79 28 42 74 43 75 72  eCursorKey(BtCur
53f0: 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
5400: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
5410: 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
5420: 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  OR_VALID==pCur->
5430: 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65  eState );.  asse
5440: 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65  rt( 0==pCur->pKe
5450: 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  y );.  assert( c
5460: 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
5470: 70 43 75 72 29 20 29 3b 0a 0a 20 20 69 66 28 20  pCur) );..  if( 
5480: 70 43 75 72 2d 3e 63 75 72 49 6e 74 4b 65 79 20  pCur->curIntKey 
5490: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 74  ){.    /* Only t
54a0: 68 65 20 72 6f 77 69 64 20 69 73 20 72 65 71 75  he rowid is requ
54b0: 69 72 65 64 20 66 6f 72 20 61 20 74 61 62 6c 65  ired for a table
54c0: 20 62 74 72 65 65 20 2a 2f 0a 20 20 20 20 70 43   btree */.    pC
54d0: 75 72 2d 3e 6e 4b 65 79 20 3d 20 73 71 6c 69 74  ur->nKey = sqlit
54e0: 65 33 42 74 72 65 65 49 6e 74 65 67 65 72 4b 65  e3BtreeIntegerKe
54f0: 79 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  y(pCur);.  }else
5500: 7b 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6e 20  {.    /* For an 
5510: 69 6e 64 65 78 20 62 74 72 65 65 2c 20 73 61 76  index btree, sav
5520: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 6b  e the complete k
5530: 65 79 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20  ey content */.  
5540: 20 20 76 6f 69 64 20 2a 70 4b 65 79 3b 0a 20 20    void *pKey;.  
5550: 20 20 70 43 75 72 2d 3e 6e 4b 65 79 20 3d 20 73    pCur->nKey = s
5560: 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
5570: 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
5580: 20 20 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33    pKey = sqlite3
5590: 4d 61 6c 6c 6f 63 28 20 70 43 75 72 2d 3e 6e 4b  Malloc( pCur->nK
55a0: 65 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4b  ey );.    if( pK
55b0: 65 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ey ){.      rc =
55c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
55d0: 6c 6f 61 64 28 70 43 75 72 2c 20 30 2c 20 28 69  load(pCur, 0, (i
55e0: 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  nt)pCur->nKey, p
55f0: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
5600: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5610: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
5620: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
5630: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5640: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
5650: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
5660: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
5670: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
5680: 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
5690: 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72 2d    assert( !pCur-
56a0: 3e 63 75 72 49 6e 74 4b 65 79 20 7c 7c 20 21 70  >curIntKey || !p
56b0: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 72  Cur->pKey );.  r
56c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
56d0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
56e0: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
56f0: 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72 69 61  ion in the varia
5700: 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e 6e 4b  bles BtCursor.nK
5710: 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43 75 72  ey .** and BtCur
5720: 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20 63 75  sor.pKey. The cu
5730: 72 73 6f 72 27 73 20 73 74 61 74 65 20 69 73 20  rsor's state is 
5740: 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f 52 45  set to CURSOR_RE
5750: 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2a 0a 2a 2a  QUIRESEEK..**.**
5760: 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   The caller must
5770: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
5780: 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64   cursor is valid
5790: 20 28 68 61 73 20 65 53 74 61 74 65 3d 3d 43 55   (has eState==CU
57a0: 52 53 4f 52 5f 56 41 4c 49 44 29 0a 2a 2a 20 70  RSOR_VALID).** p
57b0: 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
57c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 0a  this routine.  .
57d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
57e0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
57f0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
5800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
5810: 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
5820: 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
5830: 65 20 7c 7c 20 43 55 52 53 4f 52 5f 53 4b 49 50  e || CURSOR_SKIP
5840: 4e 45 58 54 3d 3d 70 43 75 72 2d 3e 65 53 74 61  NEXT==pCur->eSta
5850: 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  te );.  assert( 
5860: 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b  0==pCur->pKey );
5870: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
5880: 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
5890: 29 20 29 3b 0a 0a 20 20 69 66 28 20 70 43 75 72  ) );..  if( pCur
58a0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
58b0: 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
58c0: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
58d0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20  CURSOR_VALID;.  
58e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
58f0: 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a 20  >skipNext = 0;. 
5900: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 61 76 65 43   }..  rc = saveC
5910: 75 72 73 6f 72 4b 65 79 28 70 43 75 72 29 3b 0a  ursorKey(pCur);.
5920: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5930: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 74 72 65 65  _OK ){.    btree
5940: 52 65 6c 65 61 73 65 41 6c 6c 43 75 72 73 6f 72  ReleaseAllCursor
5950: 50 61 67 65 73 28 70 43 75 72 29 3b 0a 20 20 20  Pages(pCur);.   
5960: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
5970: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
5980: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 70 43 75 72 2d  EK;.  }..  pCur-
5990: 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e 28 42  >curFlags &= ~(B
59a0: 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c 42 54  TCF_ValidNKey|BT
59b0: 43 46 5f 56 61 6c 69 64 4f 76 66 6c 7c 42 54 43  CF_ValidOvfl|BTC
59c0: 46 5f 41 74 4c 61 73 74 29 3b 0a 20 20 72 65 74  F_AtLast);.  ret
59d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f  urn rc;.}../* Fo
59e0: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
59f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
5a00: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 61  LITE_NOINLINE sa
5a10: 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74 28  veCursorsOnList(
5a20: 42 74 43 75 72 73 6f 72 2a 2c 50 67 6e 6f 2c 42  BtCursor*,Pgno,B
5a30: 74 43 75 72 73 6f 72 2a 29 3b 0a 0a 2f 2a 0a 2a  tCursor*);../*.*
5a40: 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73 69 74  * Save the posit
5a50: 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73  ions of all curs
5a60: 6f 72 73 20 28 65 78 63 65 70 74 20 70 45 78 63  ors (except pExc
5a70: 65 70 74 29 20 74 68 61 74 20 61 72 65 20 6f 70  ept) that are op
5a80: 65 6e 20 6f 6e 0a 2a 2a 20 74 68 65 20 74 61 62  en on.** the tab
5a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
5aa0: 65 20 69 52 6f 6f 74 2e 20 20 22 53 61 76 69 6e  e iRoot.  "Savin
5ab0: 67 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 73  g the cursor pos
5ac0: 69 74 69 6f 6e 22 20 6d 65 61 6e 73 20 74 68 61  ition" means tha
5ad0: 74 0a 2a 2a 20 74 68 65 20 6c 6f 63 61 74 69 6f  t.** the locatio
5ae0: 6e 20 69 6e 20 74 68 65 20 62 74 72 65 65 20 69  n in the btree i
5af0: 73 20 72 65 6d 65 6d 62 65 72 65 64 20 69 6e 20  s remembered in 
5b00: 73 75 63 68 20 61 20 77 61 79 20 74 68 61 74 20  such a way that 
5b10: 69 74 20 63 61 6e 20 62 65 0a 2a 2a 20 6d 6f 76  it can be.** mov
5b20: 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73  ed back to the s
5b30: 61 6d 65 20 73 70 6f 74 20 61 66 74 65 72 20 74  ame spot after t
5b40: 68 65 20 62 74 72 65 65 20 68 61 73 20 62 65 65  he btree has bee
5b50: 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 54 68 69  n modified.  Thi
5b60: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
5b70: 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  called just befo
5b80: 72 65 20 63 75 72 73 6f 72 20 70 45 78 63 65 70  re cursor pExcep
5b90: 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f 64  t is used to mod
5ba0: 69 66 79 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65  ify the.** table
5bb0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 20 69 6e  , for example in
5bc0: 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
5bd0: 72 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2e  r BtreeInsert().
5be0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
5bf0: 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
5c00: 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 73  cursors on the s
5c10: 61 6d 65 20 62 74 72 65 65 2c 20 74 68 65 6e 20  ame btree, then 
5c20: 61 6c 6c 20 73 75 63 68 20 0a 2a 2a 20 63 75 72  all such .** cur
5c30: 73 6f 72 73 20 73 68 6f 75 6c 64 20 68 61 76 65  sors should have
5c40: 20 74 68 65 69 72 20 42 54 43 46 5f 4d 75 6c 74   their BTCF_Mult
5c50: 69 70 6c 65 20 66 6c 61 67 20 73 65 74 2e 20 20  iple flag set.  
5c60: 54 68 65 20 62 74 72 65 65 43 75 72 73 6f 72 28  The btreeCursor(
5c70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 65 6e 66  ).** routine enf
5c80: 6f 72 63 65 73 20 74 68 61 74 20 72 75 6c 65 2e  orces that rule.
5c90: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6f    This routine o
5ca0: 6e 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20  nly needs to be 
5cb0: 63 61 6c 6c 65 64 20 69 6e 0a 2a 2a 20 74 68 65  called in.** the
5cc0: 20 75 6e 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77   uncommon case w
5cd0: 68 65 6e 20 70 45 78 70 65 63 74 20 68 61 73 20  hen pExpect has 
5ce0: 74 68 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c  the BTCF_Multipl
5cf0: 65 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a  e flag set..**.*
5d00: 2a 20 49 66 20 70 45 78 70 65 63 74 21 3d 4e 55  * If pExpect!=NU
5d10: 4c 4c 20 61 6e 64 20 69 66 20 6e 6f 20 6f 74 68  LL and if no oth
5d20: 65 72 20 63 75 72 73 6f 72 73 20 61 72 65 20 66  er cursors are f
5d30: 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 61 6d 65  ound on the same
5d40: 20 72 6f 6f 74 2d 70 61 67 65 2c 0a 2a 2a 20 74   root-page,.** t
5d50: 68 65 6e 20 74 68 65 20 42 54 43 46 5f 4d 75 6c  hen the BTCF_Mul
5d60: 74 69 70 6c 65 20 66 6c 61 67 20 6f 6e 20 70 45  tiple flag on pE
5d70: 78 70 65 63 74 20 69 73 20 63 6c 65 61 72 65 64  xpect is cleared
5d80: 2c 20 74 6f 20 61 76 6f 69 64 20 61 6e 6f 74 68  , to avoid anoth
5d90: 65 72 0a 2a 2a 20 70 6f 69 6e 74 6c 65 73 73 20  er.** pointless 
5da0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
5db0: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 6d 70 6c  tine..**.** Impl
5dc0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6e 6f 74 65 3a  ementation note:
5dd0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d    This routine m
5de0: 65 72 65 6c 79 20 63 68 65 63 6b 73 20 74 6f 20  erely checks to 
5df0: 73 65 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f  see if any curso
5e00: 72 73 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65  rs.** need to be
5e10: 20 73 61 76 65 64 2e 20 20 49 74 20 63 61 6c 6c   saved.  It call
5e20: 73 20 6f 75 74 20 74 6f 20 73 61 76 65 43 75 72  s out to saveCur
5e30: 73 6f 72 73 4f 6e 4c 69 73 74 28 29 20 69 6e 20  sorsOnList() in 
5e40: 74 68 65 20 28 75 6e 75 73 75 61 6c 29 0a 2a 2a  the (unusual).**
5e50: 20 65 76 65 6e 74 20 74 68 61 74 20 63 75 72 73   event that curs
5e60: 6f 72 73 20 61 72 65 20 69 6e 20 6e 65 65 64 20  ors are in need 
5e70: 74 6f 20 62 65 69 6e 67 20 73 61 76 65 64 2e 0a  to being saved..
5e80: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  */.static int sa
5e90: 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 53  veAllCursors(BtS
5ea0: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
5eb0: 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f 72   iRoot, BtCursor
5ec0: 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42 74   *pExcept){.  Bt
5ed0: 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73 73  Cursor *p;.  ass
5ee0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ef0: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
5f00: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
5f10: 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20 70   pExcept==0 || p
5f20: 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42 74  Except->pBt==pBt
5f30: 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
5f40: 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
5f50: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
5f60: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
5f70: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
5f80: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
5f90: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
5fa0: 69 66 28 20 70 20 29 20 72 65 74 75 72 6e 20 73  if( p ) return s
5fb0: 61 76 65 43 75 72 73 6f 72 73 4f 6e 4c 69 73 74  aveCursorsOnList
5fc0: 28 70 2c 20 69 52 6f 6f 74 2c 20 70 45 78 63 65  (p, iRoot, pExce
5fd0: 70 74 29 3b 0a 20 20 69 66 28 20 70 45 78 63 65  pt);.  if( pExce
5fe0: 70 74 20 29 20 70 45 78 63 65 70 74 2d 3e 63 75  pt ) pExcept->cu
5ff0: 72 46 6c 61 67 73 20 26 3d 20 7e 42 54 43 46 5f  rFlags &= ~BTCF_
6000: 4d 75 6c 74 69 70 6c 65 3b 0a 20 20 72 65 74 75  Multiple;.  retu
6010: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6020: 0a 2f 2a 20 54 68 69 73 20 68 65 6c 70 65 72 20  ./* This helper 
6030: 72 6f 75 74 69 6e 65 20 74 6f 20 73 61 76 65 41  routine to saveA
6040: 6c 6c 43 75 72 73 6f 72 73 20 64 6f 65 73 20 74  llCursors does t
6050: 68 65 20 61 63 74 75 61 6c 20 77 6f 72 6b 20 6f  he actual work o
6060: 66 20 73 61 76 69 6e 67 0a 2a 2a 20 74 68 65 20  f saving.** the 
6070: 63 75 72 73 6f 72 73 20 69 66 20 61 6e 64 20 77  cursors if and w
6080: 68 65 6e 20 61 20 63 75 72 73 6f 72 20 69 73 20  hen a cursor is 
6090: 66 6f 75 6e 64 20 74 68 61 74 20 61 63 74 75 61  found that actua
60a0: 6c 6c 79 20 72 65 71 75 69 72 65 73 20 73 61 76  lly requires sav
60b0: 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 6f 6d 6d  ing..** The comm
60c0: 6f 6e 20 63 61 73 65 20 69 73 20 74 68 61 74 20  on case is that 
60d0: 6e 6f 20 63 75 72 73 6f 72 73 20 6e 65 65 64 20  no cursors need 
60e0: 74 6f 20 62 65 20 73 61 76 65 64 2c 20 73 6f 20  to be saved, so 
60f0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a  this routine is.
6100: 2a 2a 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  ** broken out fr
6110: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 20 74 6f  om its caller to
6120: 20 61 76 6f 69 64 20 75 6e 6e 65 63 65 73 73 61   avoid unnecessa
6130: 72 79 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72  ry stack pointer
6140: 20 6d 6f 76 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   movement..*/.st
6150: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
6160: 4e 4f 49 4e 4c 49 4e 45 20 73 61 76 65 43 75 72  NOINLINE saveCur
6170: 73 6f 72 73 4f 6e 4c 69 73 74 28 0a 20 20 42 74  sorsOnList(.  Bt
6180: 43 75 72 73 6f 72 20 2a 70 2c 20 20 20 20 20 20  Cursor *p,      
6190: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
61a0: 63 75 72 73 6f 72 20 74 68 61 74 20 6e 65 65 64  cursor that need
61b0: 73 20 73 61 76 69 6e 67 20 2a 2f 0a 20 20 50 67  s saving */.  Pg
61c0: 6e 6f 20 69 52 6f 6f 74 2c 20 20 20 20 20 20 20  no iRoot,       
61d0: 20 20 20 2f 2a 20 4f 6e 6c 79 20 73 61 76 65 20     /* Only save 
61e0: 63 75 72 73 6f 72 20 77 69 74 68 20 74 68 69 73  cursor with this
61f0: 20 69 52 6f 6f 74 2e 20 53 61 76 65 20 61 6c 6c   iRoot. Save all
6200: 20 69 66 20 7a 65 72 6f 20 2a 2f 0a 20 20 42 74   if zero */.  Bt
6210: 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 20  Cursor *pExcept 
6220: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 61 76     /* Do not sav
6230: 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  e this cursor */
6240: 0a 29 7b 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66  .){.  do{.    if
6250: 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26 20  ( p!=pExcept && 
6260: 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d 3e  (0==iRoot || p->
6270: 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74 29  pgnoRoot==iRoot)
6280: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   ){.      if( p-
6290: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
62a0: 56 41 4c 49 44 20 7c 7c 20 70 2d 3e 65 53 74 61  VALID || p->eSta
62b0: 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
62c0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69  EXT ){.        i
62d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
62e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
62f0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
6300: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
6310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6320: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6340: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 69 50 61  testcase( p->iPa
6350: 67 65 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ge>0 );.        
6360: 62 74 72 65 65 52 65 6c 65 61 73 65 41 6c 6c 43  btreeReleaseAllC
6370: 75 72 73 6f 72 50 61 67 65 73 28 70 29 3b 0a 20  ursorPages(p);. 
6380: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6390: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
63a0: 20 7d 77 68 69 6c 65 28 20 70 20 29 3b 0a 20 20   }while( p );.  
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
63d0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
63e0: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2f  sor position..*/
63f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
6400: 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 42 74  eeClearCursor(Bt
6410: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
6420: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
6430: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
6440: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
6450: 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20  e(pCur->pKey);. 
6460: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
6470: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6480: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68  ;.}../*.** In th
64a0: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42 74  is version of Bt
64b0: 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20  reeMoveto, pKey 
64c0: 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64 65  is a packed inde
64d0: 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68  x record.** such
64e0: 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65 64   as is generated
64f0: 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
6500: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20 55  ecord opcode.  U
6510: 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63  npack the.** rec
6520: 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61 6c  ord and then cal
6530: 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70  l BtreeMovetoUnp
6540: 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74 68  acked() to do th
6550: 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e work..*/.stati
6560: 63 20 69 6e 74 20 62 74 72 65 65 4d 6f 76 65 74  c int btreeMovet
6570: 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  o(.  BtCursor *p
6580: 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72 73  Cur,     /* Curs
6590: 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62  or open on the b
65a0: 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72 63  tree to be searc
65b0: 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  hed */.  const v
65c0: 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20  oid *pKey,   /* 
65d0: 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74 68  Packed key if th
65e0: 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69 6e  e btree is an in
65f0: 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65  dex */.  i64 nKe
6600: 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
6610: 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  Integer key for 
6620: 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66  tables.  Size of
6630: 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63 65   pKey for indice
6640: 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c  s */.  int bias,
6650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
6660: 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68 65  as search to the
6670: 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69   high end */.  i
6680: 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20  nt *pRes        
6690: 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61 72     /* Write sear
66a0: 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  ch results here 
66b0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
66c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66d0: 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f 64     /* Status cod
66e0: 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  e */.  UnpackedR
66f0: 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b 20  ecord *pIdxKey; 
6700: 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e    /* Unpacked in
6710: 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 63 68 61  dex key */.  cha
6720: 72 20 61 53 70 61 63 65 5b 33 38 34 5d 3b 20 20  r aSpace[384];  
6730: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20          /* Temp 
6740: 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b 65  space for pIdxKe
6750: 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 6d  y - to avoid a m
6760: 61 6c 6c 6f 63 20 2a 2f 0a 20 20 63 68 61 72 20  alloc */.  char 
6770: 2a 70 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 69  *pFree = 0;..  i
6780: 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
6790: 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
67a0: 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
67b0: 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
67c0: 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
67d0: 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 20  ackedRecord(.   
67e0: 20 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 49       pCur->pKeyI
67f0: 6e 66 6f 2c 20 61 53 70 61 63 65 2c 20 73 69 7a  nfo, aSpace, siz
6800: 65 6f 66 28 61 53 70 61 63 65 29 2c 20 26 70 46  eof(aSpace), &pF
6810: 72 65 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ree.    );.    i
6820: 66 28 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 20  f( pIdxKey==0 ) 
6830: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6840: 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
6850: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
6860: 6e 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79  npack(pCur->pKey
6870: 49 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c  Info, (int)nKey,
6880: 20 70 4b 65 79 2c 20 70 49 64 78 4b 65 79 29 3b   pKey, pIdxKey);
6890: 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b 65 79  .    if( pIdxKey
68a0: 2d 3e 6e 46 69 65 6c 64 3d 3d 30 20 29 7b 0a 20  ->nField==0 ){. 
68b0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
68c0: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ee(pCur->pKeyInf
68d0: 6f 2d 3e 64 62 2c 20 70 46 72 65 65 29 3b 0a 20  o->db, pFree);. 
68e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
68f0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
6900: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
6910: 20 20 20 20 70 49 64 78 4b 65 79 20 3d 20 30 3b      pIdxKey = 0;
6920: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
6930: 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
6940: 70 61 63 6b 65 64 28 70 43 75 72 2c 20 70 49 64  packed(pCur, pId
6950: 78 4b 65 79 2c 20 6e 4b 65 79 2c 20 62 69 61 73  xKey, nKey, bias
6960: 2c 20 70 52 65 73 29 3b 0a 20 20 69 66 28 20 70  , pRes);.  if( p
6970: 46 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Free ){.    sqli
6980: 74 65 33 44 62 46 72 65 65 28 70 43 75 72 2d 3e  te3DbFree(pCur->
6990: 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 46  pKeyInfo->db, pF
69a0: 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
69b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
69c0: 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
69d0: 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69  or to the positi
69e0: 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72  on it was in (or
69f0: 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20   as close to as 
6a00: 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65  possible).** whe
6a10: 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  n saveCursorPosi
6a20: 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65  tion() was calle
6a30: 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  d. Note that thi
6a40: 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74  s call deletes t
6a50: 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73  he .** saved pos
6a60: 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65  ition info store
6a70: 64 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50  d by saveCursorP
6a80: 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68  osition(), so th
6a90: 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74  ere can be.** at
6aa0: 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74   most one effect
6ab0: 69 76 65 20 72 65 73 74 6f 72 65 43 75 72 73 6f  ive restoreCurso
6ac0: 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61 6c 6c  rPosition() call
6ad0: 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a 2a 20   after each .** 
6ae0: 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
6af0: 6f 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  on()..*/.static 
6b00: 69 6e 74 20 62 74 72 65 65 52 65 73 74 6f 72 65  int btreeRestore
6b10: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42  CursorPosition(B
6b20: 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
6b30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6b40: 73 6b 69 70 4e 65 78 74 3b 0a 20 20 61 73 73 65  skipNext;.  asse
6b50: 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73 42 74  rt( cursorOwnsBt
6b60: 53 68 61 72 65 64 28 70 43 75 72 29 20 29 3b 0a  Shared(pCur) );.
6b70: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
6b80: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
6b90: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
6ba0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
6bb0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
6bc0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
6bd0: 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 7d  r->skipNext;.  }
6be0: 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20  .  pCur->eState 
6bf0: 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
6c00: 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 4d 6f  ;.  rc = btreeMo
6c10: 76 65 74 6f 28 70 43 75 72 2c 20 70 43 75 72 2d  veto(pCur, pCur-
6c20: 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e 6e 4b 65  >pKey, pCur->nKe
6c30: 79 2c 20 30 2c 20 26 73 6b 69 70 4e 65 78 74 29  y, 0, &skipNext)
6c40: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
6c50: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
6c60: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
6c70: 70 4b 65 79 29 3b 0a 20 20 20 20 70 43 75 72 2d  pKey);.    pCur-
6c80: 3e 70 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 61  >pKey = 0;.    a
6c90: 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
6ca0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
6cb0: 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
6cc0: 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
6cd0: 44 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 73  D );.    pCur->s
6ce0: 6b 69 70 4e 65 78 74 20 7c 3d 20 73 6b 69 70 4e  kipNext |= skipN
6cf0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ext;.    if( pCu
6d00: 72 2d 3e 73 6b 69 70 4e 65 78 74 20 26 26 20 70  r->skipNext && p
6d10: 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
6d20: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
6d30: 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
6d40: 3d 20 43 55 52 53 4f 52 5f 53 4b 49 50 4e 45 58  = CURSOR_SKIPNEX
6d50: 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  T;.    }.  }.  r
6d60: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64 65  eturn rc;.}..#de
6d70: 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72 73  fine restoreCurs
6d80: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a  orPosition(p) \.
6d90: 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55    (p->eState>=CU
6da0: 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
6db0: 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 62 74   ? \.         bt
6dc0: 72 65 65 52 65 73 74 6f 72 65 43 75 72 73 6f 72  reeRestoreCursor
6dd0: 50 6f 73 69 74 69 6f 6e 28 70 29 20 3a 20 5c 0a  Position(p) : \.
6de0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
6df0: 4f 4b 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  OK)../*.** Deter
6e00: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
6e10: 6e 6f 74 20 61 20 63 75 72 73 6f 72 20 68 61 73  not a cursor has
6e20: 20 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20   moved from the 
6e30: 70 6f 73 69 74 69 6f 6e 20 77 68 65 72 65 0a 2a  position where.*
6e40: 2a 20 69 74 20 77 61 73 20 6c 61 73 74 20 70 6c  * it was last pl
6e50: 61 63 65 64 2c 20 6f 72 20 68 61 73 20 62 65 65  aced, or has bee
6e60: 6e 20 69 6e 76 61 6c 69 64 61 74 65 64 20 66 6f  n invalidated fo
6e70: 72 20 61 6e 79 20 6f 74 68 65 72 20 72 65 61 73  r any other reas
6e80: 6f 6e 2e 0a 2a 2a 20 43 75 72 73 6f 72 73 20 63  on..** Cursors c
6e90: 61 6e 20 6d 6f 76 65 20 77 68 65 6e 20 74 68 65  an move when the
6ea0: 20 72 6f 77 20 74 68 65 79 20 61 72 65 20 70 6f   row they are po
6eb0: 69 6e 74 69 6e 67 20 61 74 20 69 73 20 64 65 6c  inting at is del
6ec0: 65 74 65 64 20 6f 75 74 0a 2a 2a 20 66 72 6f 6d  eted out.** from
6ed0: 20 75 6e 64 65 72 20 74 68 65 6d 2c 20 66 6f 72   under them, for
6ee0: 20 65 78 61 6d 70 6c 65 2e 20 20 43 75 72 73 6f   example.  Curso
6ef0: 72 20 6d 69 67 68 74 20 61 6c 73 6f 20 6d 6f 76  r might also mov
6f00: 65 20 69 66 20 61 20 62 74 72 65 65 0a 2a 2a 20  e if a btree.** 
6f10: 69 73 20 72 65 62 61 6c 61 6e 63 65 64 2e 0a 2a  is rebalanced..*
6f20: 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69  *.** Calling thi
6f30: 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
6f40: 20 4e 55 4c 4c 20 63 75 72 73 6f 72 20 70 6f 69   NULL cursor poi
6f50: 6e 74 65 72 20 72 65 74 75 72 6e 73 20 66 61 6c  nter returns fal
6f60: 73 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  se..**.** Use th
6f70: 65 20 73 65 70 61 72 61 74 65 20 73 71 6c 69 74  e separate sqlit
6f80: 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
6f90: 74 6f 72 65 28 29 20 72 6f 75 74 69 6e 65 20 74  tore() routine t
6fa0: 6f 20 72 65 73 74 6f 72 65 20 61 20 63 75 72 73  o restore a curs
6fb0: 6f 72 0a 2a 2a 20 62 61 63 6b 20 74 6f 20 77 68  or.** back to wh
6fc0: 65 72 65 20 69 74 20 6f 75 67 68 74 20 74 6f 20  ere it ought to 
6fd0: 62 65 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  be if this routi
6fe0: 6e 65 20 72 65 74 75 72 6e 73 20 74 72 75 65 2e  ne returns true.
6ff0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
7000: 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
7010: 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ed(BtCursor *pCu
7020: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 43 75  r){.  return pCu
7030: 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
7040: 52 5f 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  R_VALID;.}../*.*
7050: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7060: 65 73 74 6f 72 65 73 20 61 20 63 75 72 73 6f 72  estores a cursor
7070: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
7080: 67 69 6e 61 6c 20 70 6f 73 69 74 69 6f 6e 20 61  ginal position a
7090: 66 74 65 72 20 69 74 0a 2a 2a 20 68 61 73 20 62  fter it.** has b
70a0: 65 65 6e 20 6d 6f 76 65 64 20 62 79 20 73 6f 6d  een moved by som
70b0: 65 20 6f 75 74 73 69 64 65 20 61 63 74 69 76 69  e outside activi
70c0: 74 79 20 28 73 75 63 68 20 61 73 20 61 20 62 74  ty (such as a bt
70d0: 72 65 65 20 72 65 62 61 6c 61 6e 63 65 20 6f 72  ree rebalance or
70e0: 0a 2a 2a 20 61 20 72 6f 77 20 68 61 76 69 6e 67  .** a row having
70f0: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
7100: 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
7110: 20 63 75 72 73 6f 72 29 2e 20 20 0a 2a 2a 0a 2a   cursor).  .**.*
7120: 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 74 68  * On success, th
7130: 65 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77  e *pDifferentRow
7140: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 66 61   parameter is fa
7150: 6c 73 65 20 69 66 20 74 68 65 20 63 75 72 73 6f  lse if the curso
7160: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
7170: 6e 74 69 6e 67 20 61 74 20 65 78 61 63 74 6c 79  nting at exactly
7180: 20 74 68 65 20 73 61 6d 65 20 72 6f 77 2e 20 20   the same row.  
7190: 2a 70 44 69 66 66 65 72 6e 74 52 6f 77 20 69 73  *pDifferntRow is
71a0: 20 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72   the row the cur
71b0: 73 6f 72 0a 2a 2a 20 77 61 73 20 70 6f 69 6e 74  sor.** was point
71c0: 69 6e 67 20 74 6f 20 68 61 73 20 62 65 65 6e 20  ing to has been 
71d0: 64 65 6c 65 74 65 64 2c 20 66 6f 72 63 69 6e 67  deleted, forcing
71e0: 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
71f0: 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 0a 2a 2a 20  oint to some.** 
7200: 6e 65 61 72 62 79 20 72 6f 77 2e 0a 2a 2a 0a 2a  nearby row..**.*
7210: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
7220: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
7230: 6c 6c 65 64 20 66 6f 72 20 61 20 63 75 72 73 6f  lled for a curso
7240: 72 20 74 68 61 74 20 6a 75 73 74 20 72 65 74 75  r that just retu
7250: 72 6e 65 64 0a 2a 2a 20 54 52 55 45 20 66 72 6f  rned.** TRUE fro
7260: 6d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  m sqlite3BtreeCu
7270: 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 29 2e 0a  rsorHasMoved()..
7280: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
7290: 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  reeCursorRestore
72a0: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
72b0: 20 69 6e 74 20 2a 70 44 69 66 66 65 72 65 6e 74   int *pDifferent
72c0: 52 6f 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Row){.  int rc;.
72d0: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
72e0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
72f0: 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
7300: 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
7310: 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
7320: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
7330: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
7340: 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77    *pDifferentRow
7350: 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
7360: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
7370: 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
7380: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
7390: 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f 77 20   *pDifferentRow 
73a0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
73b0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
73c0: 73 6b 69 70 4e 65 78 74 3d 3d 30 20 29 3b 0a 20  skipNext==0 );. 
73d0: 20 20 20 2a 70 44 69 66 66 65 72 65 6e 74 52 6f     *pDifferentRo
73e0: 77 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  w = 0;.  }.  ret
73f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7400: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
7410: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49  ENABLE_CURSOR_HI
7420: 4e 54 53 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64  NTS./*.** Provid
7430: 65 20 68 69 6e 74 73 20 74 6f 20 74 68 65 20 63  e hints to the c
7440: 75 72 73 6f 72 2e 20 20 54 68 65 20 70 61 72 74  ursor.  The part
7450: 69 63 75 6c 61 72 20 68 69 6e 74 20 67 69 76 65  icular hint give
7460: 6e 20 28 61 6e 64 20 74 68 65 20 74 79 70 65 0a  n (and the type.
7470: 2a 2a 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66  ** and number of
7480: 20 74 68 65 20 76 61 72 61 72 67 73 20 70 61 72   the varargs par
7490: 61 6d 65 74 65 72 73 29 20 69 73 20 64 65 74 65  ameters) is dete
74a0: 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 65 48  rmined by the eH
74b0: 69 6e 74 54 79 70 65 0a 2a 2a 20 70 61 72 61 6d  intType.** param
74c0: 65 74 65 72 2e 20 20 53 65 65 20 74 68 65 20 64  eter.  See the d
74d0: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 74 68  efinitions of th
74e0: 65 20 42 54 52 45 45 5f 48 49 4e 54 5f 2a 20 6d  e BTREE_HINT_* m
74f0: 61 63 72 6f 73 20 66 6f 72 20 64 65 74 61 69 6c  acros for detail
7500: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7510: 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 69 6e  e3BtreeCursorHin
7520: 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
7530: 2c 20 69 6e 74 20 65 48 69 6e 74 54 79 70 65 2c  , int eHintType,
7540: 20 2e 2e 2e 29 7b 0a 20 20 2f 2a 20 55 73 65 64   ...){.  /* Used
7550: 20 6f 6e 6c 79 20 62 79 20 73 79 73 74 65 6d 20   only by system 
7560: 74 68 61 74 20 73 75 62 73 74 69 74 75 74 65 20  that substitute 
7570: 74 68 65 69 72 20 6f 77 6e 20 73 74 6f 72 61 67  their own storag
7580: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 7d 0a 23 65  e engine */.}.#e
7590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76  ndif../*.** Prov
75a0: 69 64 65 20 66 6c 61 67 20 68 69 6e 74 73 20 74  ide flag hints t
75b0: 6f 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2f  o the cursor..*/
75c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
75d0: 65 65 43 75 72 73 6f 72 48 69 6e 74 46 6c 61 67  eeCursorHintFlag
75e0: 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
75f0: 2c 20 75 6e 73 69 67 6e 65 64 20 78 29 7b 0a 20  , unsigned x){. 
7600: 20 61 73 73 65 72 74 28 20 78 3d 3d 42 54 52 45   assert( x==BTRE
7610: 45 5f 53 45 45 4b 5f 45 51 20 7c 7c 20 78 3d 3d  E_SEEK_EQ || x==
7620: 42 54 52 45 45 5f 42 55 4c 4b 4c 4f 41 44 20 7c  BTREE_BULKLOAD |
7630: 7c 20 78 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72  | x==0 );.  pCur
7640: 2d 3e 68 69 6e 74 73 20 3d 20 78 3b 0a 7d 0a 0a  ->hints = x;.}..
7650: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7660: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
7670: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
7680: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
7690: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
76a0: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
76b0: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
76c0: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
76d0: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
76e0: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
76f0: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
7700: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
7710: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20 28 6e  *.** Return 0 (n
7720: 6f 74 20 61 20 76 61 6c 69 64 20 70 61 67 65 29  ot a valid page)
7730: 20 66 6f 72 20 70 67 6e 6f 3d 3d 31 20 73 69 6e   for pgno==1 sin
7740: 63 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  ce there is.** n
7750: 6f 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 61 73  o pointer map as
7760: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
7770: 67 65 20 31 2e 20 20 54 68 65 20 69 6e 74 65 67  ge 1.  The integ
7780: 72 69 74 79 5f 63 68 65 63 6b 20 6c 6f 67 69 63  rity_check logic
7790: 0a 2a 2a 20 72 65 71 75 69 72 65 73 20 74 68 61  .** requires tha
77a0: 74 20 70 74 72 6d 61 70 50 61 67 65 6e 6f 28 2a  t ptrmapPageno(*
77b0: 2c 31 29 21 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  ,1)!=1..*/.stati
77c0: 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67  c Pgno ptrmapPag
77d0: 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42  eno(BtShared *pB
77e0: 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  t, Pgno pgno){. 
77f0: 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61   int nPagesPerMa
7800: 70 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50  pPage;.  Pgno iP
7810: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
7820: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
7830: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
7840: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67  tex) );.  if( pg
7850: 6e 6f 3c 32 20 29 20 72 65 74 75 72 6e 20 30 3b  no<2 ) return 0;
7860: 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50  .  nPagesPerMapP
7870: 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  age = (pBt->usab
7880: 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69  leSize/5)+1;.  i
7890: 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32  PtrMap = (pgno-2
78a0: 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61  )/nPagesPerMapPa
78b0: 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74  ge;.  ret = (iPt
78c0: 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61  rMap*nPagesPerMa
78d0: 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69  pPage) + 2; .  i
78e0: 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f  f( ret==PENDING_
78f0: 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
7900: 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d  {.    ret++;.  }
7910: 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
7920: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e  ../*.** Write an
7930: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
7940: 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a  pointer map..**.
7950: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
7960: 75 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e  updates the poin
7970: 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f  ter map entry fo
7980: 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b  r page number 'k
7990: 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ey'.** so that i
79a0: 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27  t maps to type '
79b0: 65 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e  eType' and paren
79c0: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70  t page number 'p
79d0: 67 6e 6f 27 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a  gno'..**.** If *
79e0: 70 52 43 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  pRC is initially
79f0: 20 6e 6f 6e 2d 7a 65 72 6f 20 28 6e 6f 6e 2d 53   non-zero (non-S
7a00: 51 4c 49 54 45 5f 4f 4b 29 20 74 68 65 6e 20 74  QLITE_OK) then t
7a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
7a20: 2a 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 61  * a no-op.  If a
7a30: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
7a40: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
7a50: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 77 72  error code is wr
7a60: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70  itten.** into *p
7a70: 52 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  RC..*/.static vo
7a80: 69 64 20 70 74 72 6d 61 70 50 75 74 28 42 74 53  id ptrmapPut(BtS
7a90: 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
7aa0: 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20   key, u8 eType, 
7ab0: 50 67 6e 6f 20 70 61 72 65 6e 74 2c 20 69 6e 74  Pgno parent, int
7ac0: 20 2a 70 52 43 29 7b 0a 20 20 44 62 50 61 67 65   *pRC){.  DbPage
7ad0: 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20 54   *pDbPage;  /* T
7ae0: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70  he pointer map p
7af0: 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74  age */.  u8 *pPt
7b00: 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54 68  rmap;      /* Th
7b10: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64 61  e pointer map da
7b20: 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74  ta */.  Pgno iPt
7b30: 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  rmap;     /* The
7b40: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
7b50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e  e number */.  in
7b60: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
7b70: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f 69  /* Offset in poi
7b80: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
7b90: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
7ba0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
7bb0: 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
7bc0: 74 69 6f 6e 73 20 2a 2f 0a 0a 20 20 69 66 28 20  tions */..  if( 
7bd0: 2a 70 52 43 20 29 20 72 65 74 75 72 6e 3b 0a 0a  *pRC ) return;..
7be0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7bf0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7c00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
7c10: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
7c20: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
7c30: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
7c40: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
7c50: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
7c60: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
7c70: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
7c80: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
7c90: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
7ca0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
7cb0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
7cc0: 30 20 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20  0 ){.    *pRC = 
7cd0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
7ce0: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  KPT;.    return;
7cf0: 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20 3d  .  }.  iPtrmap =
7d00: 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70   PTRMAP_PAGENO(p
7d10: 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d  Bt, key);.  rc =
7d20: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7d30: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 50  (pBt->pPager, iP
7d40: 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65 2c  trmap, &pDbPage,
7d50: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
7d60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7d70: 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRC = rc;.    r
7d80: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6f 66 66  eturn;.  }.  off
7d90: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
7da0: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
7db0: 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66 73  key);.  if( offs
7dc0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 2a 70 52 43  et<0 ){.    *pRC
7dd0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
7de0: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74 6f  T_BKPT;.    goto
7df0: 20 70 74 72 6d 61 70 5f 65 78 69 74 3b 0a 20 20   ptrmap_exit;.  
7e00: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
7e10: 65 74 20 3c 3d 20 28 69 6e 74 29 70 42 74 2d 3e  et <= (int)pBt->
7e20: 75 73 61 62 6c 65 53 69 7a 65 2d 35 20 29 3b 0a  usableSize-5 );.
7e30: 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20    pPtrmap = (u8 
7e40: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e50: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7e60: 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50  .  if( eType!=pP
7e70: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c  trmap[offset] ||
7e80: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
7e90: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70  ap[offset+1])!=p
7ea0: 61 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41  arent ){.    TRA
7eb0: 43 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41  CE(("PTRMAP_UPDA
7ec0: 54 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c  TE: %d->(%d,%d)\
7ed0: 6e 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20  n", key, eType, 
7ee0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 2a 70  parent));.    *p
7ef0: 52 43 3d 20 72 63 20 3d 20 73 71 6c 69 74 65 33  RC= rc = sqlite3
7f00: 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
7f10: 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ge);.    if( rc=
7f20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7f30: 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66 66 73      pPtrmap[offs
7f40: 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20 20 20  et] = eType;.   
7f50: 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 74     put4byte(&pPt
7f60: 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 2c 20  rmap[offset+1], 
7f70: 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  parent);.    }. 
7f80: 20 7d 0a 0a 70 74 72 6d 61 70 5f 65 78 69 74 3a   }..ptrmap_exit:
7f90: 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
7fa0: 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 7d  nref(pDbPage);.}
7fb0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 20  ../*.** Read an 
7fc0: 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65 20 70  entry from the p
7fd0: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
7fe0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
7ff0: 65 74 72 69 65 76 65 73 20 74 68 65 20 70 6f 69  etrieves the poi
8000: 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
8010: 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c 20 77  or page 'key', w
8020: 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 79  riting.** the ty
8030: 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20 70 61  pe and parent pa
8040: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a 70 45  ge number to *pE
8050: 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20  Type and *pPgno 
8060: 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a  respectively..**
8070: 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   An error code i
8080: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f  s returned if so
8090: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
80a0: 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51  ng, otherwise SQ
80b0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
80c0: 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47 65 74  ic int ptrmapGet
80d0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
80e0: 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a 70 45  Pgno key, u8 *pE
80f0: 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50 67 6e  Type, Pgno *pPgn
8100: 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  o){.  DbPage *pD
8110: 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  bPage;   /* The 
8120: 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  pointer map page
8130: 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72 6d 61   */.  int iPtrma
8140: 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  p;       /* Poin
8150: 74 65 72 20 6d 61 70 20 70 61 67 65 20 69 6e 64  ter map page ind
8160: 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50 74 72  ex */.  u8 *pPtr
8170: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
8180: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 64  inter map page d
8190: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66  ata */.  int off
81a0: 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  set;        /* O
81b0: 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79 20 69  ffset of entry i
81c0: 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 2a 2f  n pointer map */
81d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
81e0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
81f0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
8200: 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74 72 6d  tex) );..  iPtrm
8210: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
8220: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
8230: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
8240: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
8250: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
8260: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8270: 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  c!=0 ){.    retu
8280: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74  rn rc;.  }.  pPt
8290: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
82a0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
82b0: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66  (pDbPage);..  of
82c0: 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54  fset = PTRMAP_PT
82d0: 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c  ROFFSET(iPtrmap,
82e0: 20 6b 65 79 29 3b 0a 20 20 69 66 28 20 6f 66 66   key);.  if( off
82f0: 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c  set<0 ){.    sql
8300: 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
8310: 44 62 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  DbPage);.    ret
8320: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
8330: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61  PT_BKPT;.  }.  a
8340: 73 73 65 72 74 28 20 6f 66 66 73 65 74 20 3c 3d  ssert( offset <=
8350: 20 28 69 6e 74 29 70 42 74 2d 3e 75 73 61 62 6c   (int)pBt->usabl
8360: 65 53 69 7a 65 2d 35 20 29 3b 0a 20 20 61 73 73  eSize-5 );.  ass
8370: 65 72 74 28 20 70 45 54 79 70 65 21 3d 30 20 29  ert( pEType!=0 )
8380: 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50  ;.  *pEType = pP
8390: 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20  trmap[offset];. 
83a0: 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50   if( pPgno ) *pP
83b0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
83c0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31  pPtrmap[offset+1
83d0: 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61  ]);..  sqlite3Pa
83e0: 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67 65  gerUnref(pDbPage
83f0: 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65  );.  if( *pEType
8400: 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20  <1 || *pEType>5 
8410: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
8420: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
8430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8440: 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66  ;.}..#else /* if
8450: 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f   defined SQLITE_
8460: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  OMIT_AUTOVACUUM 
8470: 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  */.  #define ptr
8480: 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a 2c 72  mapPut(w,x,y,z,r
8490: 63 29 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  c).  #define ptr
84a0: 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a 29 20  mapGet(w,x,y,z) 
84b0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
84c0: 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f 76 66  ine ptrmapPutOvf
84d0: 6c 50 74 72 28 78 2c 20 79 2c 20 72 63 29 0a 23  lPtr(x, y, rc).#
84e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 69 76  endif../*.** Giv
84f0: 65 6e 20 61 20 62 74 72 65 65 20 70 61 67 65 20  en a btree page 
8500: 61 6e 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78  and a cell index
8510: 20 28 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69   (0 means the fi
8520: 72 73 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74  rst cell on.** t
8530: 68 65 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73  he page, 1 means
8540: 20 74 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c   the second cell
8550: 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20  , and so forth) 
8560: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
8570: 0a 2a 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  .** to the cell 
8580: 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 66  content..**.** f
8590: 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 29  indCellPastPtr()
85a0: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 65   does the same e
85b0: 78 63 65 70 74 20 69 74 20 73 6b 69 70 73 20 70  xcept it skips p
85c0: 61 73 74 20 74 68 65 20 69 6e 69 74 69 61 6c 0a  ast the initial.
85d0: 2a 2a 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20  ** 4-byte child 
85e0: 70 6f 69 6e 74 65 72 20 66 6f 75 6e 64 20 6f 6e  pointer found on
85f0: 20 69 6e 74 65 72 69 6f 72 20 70 61 67 65 73 2c   interior pages,
8600: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
8610: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
8620: 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20  tine works only 
8630: 66 6f 72 20 70 61 67 65 73 20 74 68 61 74 20 64  for pages that d
8640: 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76  o not contain ov
8650: 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f  erflow cells..*/
8660: 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c  .#define findCel
8670: 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d  l(P,I) \.  ((P)-
8680: 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d  >aData + ((P)->m
8690: 61 73 6b 50 61 67 65 20 26 20 67 65 74 32 62 79  askPage & get2by
86a0: 74 65 41 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e  teAligned(&(P)->
86b0: 61 43 65 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29  aCellIdx[2*(I)])
86c0: 29 29 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  )).#define findC
86d0: 65 6c 6c 50 61 73 74 50 74 72 28 50 2c 49 29 20  ellPastPtr(P,I) 
86e0: 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74 61 4f  \.  ((P)->aDataO
86f0: 66 73 74 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b  fst + ((P)->mask
8700: 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65 41  Page & get2byteA
8710: 6c 69 67 6e 65 64 28 26 28 50 29 2d 3e 61 43 65  ligned(&(P)->aCe
8720: 6c 6c 49 64 78 5b 32 2a 28 49 29 5d 29 29 29 0a  llIdx[2*(I)]))).
8730: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
8740: 63 6f 6d 6d 6f 6e 20 74 61 69 6c 20 70 72 6f 63  common tail proc
8750: 65 73 73 69 6e 67 20 66 6f 72 20 62 74 72 65 65  essing for btree
8760: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
8770: 6e 64 0a 2a 2a 20 62 74 72 65 65 50 61 72 73 65  nd.** btreeParse
8780: 43 65 6c 6c 50 74 72 49 6e 64 65 78 28 29 20 66  CellPtrIndex() f
8790: 6f 72 20 74 68 65 20 63 61 73 65 20 77 68 65 6e  or the case when
87a0: 20 74 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e   the cell does n
87b0: 6f 74 20 66 69 74 20 65 6e 74 69 72 65 6c 79 0a  ot fit entirely.
87c0: 2a 2a 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 42  ** on a single B
87d0: 2d 74 72 65 65 20 70 61 67 65 2e 20 20 4d 61 6b  -tree page.  Mak
87e0: 65 20 6e 65 63 65 73 73 61 72 79 20 61 64 6a 75  e necessary adju
87f0: 73 74 6d 65 6e 74 73 20 74 6f 20 74 68 65 20 43  stments to the C
8800: 65 6c 6c 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63  ellInfo.** struc
8810: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
8820: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
8830: 76 6f 69 64 20 62 74 72 65 65 50 61 72 73 65 43  void btreeParseC
8840: 65 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72  ellAdjustSizeFor
8850: 4f 76 65 72 66 6c 6f 77 28 0a 20 20 4d 65 6d 50  Overflow(.  MemP
8860: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8870: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8880: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8890: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
88b0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
88c0: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
88d0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
88e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
88f0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8900: 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
8910: 68 65 20 70 61 79 6c 6f 61 64 20 77 69 6c 6c 20  he payload will 
8920: 6e 6f 74 20 66 69 74 20 63 6f 6d 70 6c 65 74 65  not fit complete
8930: 6c 79 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ly on the local 
8940: 70 61 67 65 2c 20 77 65 20 68 61 76 65 0a 20 20  page, we have.  
8950: 2a 2a 20 74 6f 20 64 65 63 69 64 65 20 68 6f 77  ** to decide how
8960: 20 6d 75 63 68 20 74 6f 20 73 74 6f 72 65 20 6c   much to store l
8970: 6f 63 61 6c 6c 79 20 61 6e 64 20 68 6f 77 20 6d  ocally and how m
8980: 75 63 68 20 74 6f 20 73 70 69 6c 6c 20 6f 6e 74  uch to spill ont
8990: 6f 0a 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20  o.  ** overflow 
89a0: 70 61 67 65 73 2e 20 20 54 68 65 20 73 74 72 61  pages.  The stra
89b0: 74 65 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d  tegy is to minim
89c0: 69 7a 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ize the amount o
89d0: 66 20 75 6e 75 73 65 64 0a 20 20 2a 2a 20 73 70  f unused.  ** sp
89e0: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
89f0: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
8a00: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
8a10: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
8a20: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
8a30: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
8a40: 4c 6f 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  Local..  **.  **
8a50: 20 57 61 72 6e 69 6e 67 3a 20 20 63 68 61 6e 67   Warning:  chang
8a60: 69 6e 67 20 74 68 65 20 77 61 79 20 6f 76 65 72  ing the way over
8a70: 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 69 73 20  flow payload is 
8a80: 64 69 73 74 72 69 62 75 74 65 64 20 69 6e 20 61  distributed in a
8a90: 6e 79 0a 20 20 2a 2a 20 77 61 79 20 77 69 6c 6c  ny.  ** way will
8aa0: 20 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e   result in an in
8ab0: 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65 20  compatible file 
8ac0: 66 6f 72 6d 61 74 2e 0a 20 20 2a 2f 0a 20 20 69  format..  */.  i
8ad0: 6e 74 20 6d 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a  nt minLocal;  /*
8ae0: 20 4d 69 6e 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   Minimum amount 
8af0: 6f 66 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20  of payload held 
8b00: 6c 6f 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74  locally */.  int
8b10: 20 6d 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d   maxLocal;  /* M
8b20: 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66  aximum amount of
8b30: 20 70 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f   payload held lo
8b40: 63 61 6c 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 73  cally */.  int s
8b50: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
8b60: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
8b70: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
8b80: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
8b90: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
8ba0: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 6d 61  ->minLocal;.  ma
8bb0: 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d 3e  xLocal = pPage->
8bc0: 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 73 75 72 70  maxLocal;.  surp
8bd0: 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20 2b  lus = minLocal +
8be0: 20 28 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61   (pInfo->nPayloa
8bf0: 64 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70  d - minLocal)%(p
8c00: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
8c10: 65 53 69 7a 65 2d 34 29 3b 0a 20 20 74 65 73 74  eSize-4);.  test
8c20: 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d 6d  case( surplus==m
8c30: 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73  axLocal );.  tes
8c40: 74 63 61 73 65 28 20 73 75 72 70 6c 75 73 3d 3d  tcase( surplus==
8c50: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
8c60: 69 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d  if( surplus <= m
8c70: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 70  axLocal ){.    p
8c80: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28  Info->nLocal = (
8c90: 75 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 7d  u16)surplus;.  }
8ca0: 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d  else{.    pInfo-
8cb0: 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6d  >nLocal = (u16)m
8cc0: 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70  inLocal;.  }.  p
8cd0: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 28 75  Info->nSize = (u
8ce0: 31 36 29 28 26 70 49 6e 66 6f 2d 3e 70 50 61 79  16)(&pInfo->pPay
8cf0: 6c 6f 61 64 5b 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  load[pInfo->nLoc
8d00: 61 6c 5d 20 2d 20 70 43 65 6c 6c 29 20 2b 20 34  al] - pCell) + 4
8d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
8d20: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
8d30: 73 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s are implementa
8d40: 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d  tions of the Mem
8d50: 50 61 67 65 2e 78 50 61 72 73 65 43 65 6c 6c 28  Page.xParseCell(
8d60: 29 0a 2a 2a 20 6d 65 74 68 6f 64 2e 0a 2a 2a 0a  ).** method..**.
8d70: 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c 20  ** Parse a cell 
8d80: 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61 6e  content block an
8d90: 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43 65  d fill in the Ce
8da0: 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  llInfo structure
8db0: 2e 0a 2a 2a 0a 2a 2a 20 62 74 72 65 65 50 61 72  ..**.** btreePar
8dc0: 73 65 43 65 6c 6c 50 74 72 28 29 20 20 20 20 20  seCellPtr()     
8dd0: 20 20 20 3d 3e 20 20 20 74 61 62 6c 65 20 62 74     =>   table bt
8de0: 72 65 65 20 6c 65 61 66 20 6e 6f 64 65 73 0a 2a  ree leaf nodes.*
8df0: 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
8e00: 4e 6f 50 61 79 6c 6f 61 64 28 29 20 20 3d 3e 20  NoPayload()  => 
8e10: 20 20 74 61 62 6c 65 20 62 74 72 65 65 20 69 6e    table btree in
8e20: 74 65 72 6e 61 6c 20 6e 6f 64 65 73 0a 2a 2a 20  ternal nodes.** 
8e30: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  btreeParseCellPt
8e40: 72 49 6e 64 65 78 28 29 20 20 20 3d 3e 20 20 20  rIndex()   =>   
8e50: 69 6e 64 65 78 20 62 74 72 65 65 20 6e 6f 64 65  index btree node
8e60: 73 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  s.**.** There is
8e70: 20 61 6c 73 6f 20 61 20 77 72 61 70 70 65 72 20   also a wrapper 
8e80: 66 75 6e 63 74 69 6f 6e 20 62 74 72 65 65 50 61  function btreePa
8e90: 72 73 65 43 65 6c 6c 28 29 20 74 68 61 74 20 77  rseCell() that w
8ea0: 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  orks for.** all 
8eb0: 4d 65 6d 50 61 67 65 20 74 79 70 65 73 20 61 6e  MemPage types an
8ec0: 64 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  d that reference
8ed0: 73 20 74 68 65 20 63 65 6c 6c 20 62 79 20 69 6e  s the cell by in
8ee0: 64 65 78 20 72 61 74 68 65 72 20 74 68 61 6e 0a  dex rather than.
8ef0: 2a 2a 20 62 79 20 70 6f 69 6e 74 65 72 2e 0a 2a  ** by pointer..*
8f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74  /.static void bt
8f10: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 4e  reeParseCellPtrN
8f20: 6f 50 61 79 6c 6f 61 64 28 0a 20 20 4d 65 6d 50  oPayload(.  MemP
8f30: 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20 20  age *pPage,     
8f40: 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
8f50: 61 69 6e 69 6e 67 20 74 68 65 20 63 65 6c 6c 20  aining the cell 
8f60: 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
8f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f80: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  Pointer to the c
8f90: 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a 20 20 43  ell text. */.  C
8fa0: 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20  ellInfo *pInfo  
8fb0: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69         /* Fill i
8fc0: 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
8fd0: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
8fe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8ff0: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
9000: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
9010: 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 3d  rt( pPage->leaf=
9020: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
9030: 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53  pPage->childPtrS
9040: 69 7a 65 3d 3d 34 20 29 3b 0a 23 69 66 6e 64 65  ize==4 );.#ifnde
9050: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9060: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9070: 52 28 70 50 61 67 65 29 3b 0a 23 65 6e 64 69 66  R(pPage);.#endif
9080: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20  .  pInfo->nSize 
9090: 3d 20 34 20 2b 20 67 65 74 56 61 72 69 6e 74 28  = 4 + getVarint(
90a0: 26 70 43 65 6c 6c 5b 34 5d 2c 20 28 75 36 34 2a  &pCell[4], (u64*
90b0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
90c0: 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f 61    pInfo->nPayloa
90d0: 64 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  d = 0;.  pInfo->
90e0: 6e 4c 6f 63 61 6c 20 3d 20 30 3b 0a 20 20 70 49  nLocal = 0;.  pI
90f0: 6e 66 6f 2d 3e 70 50 61 79 6c 6f 61 64 20 3d 20  nfo->pPayload = 
9100: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 73  0;.  return;.}.s
9110: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
9120: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20  ParseCellPtr(.  
9130: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
9140: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
9150: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9160: 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65  ell */.  u8 *pCe
9170: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
9180: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
9190: 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f  he cell text. */
91a0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e  .  CellInfo *pIn
91b0: 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  fo         /* Fi
91c0: 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ll in this struc
91d0: 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  ture */.){.  u8 
91e0: 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
91f0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 73 63 61 6e       /* For scan
9200: 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 70 43 65  ning through pCe
9210: 6c 6c 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79  ll */.  u32 nPay
9220: 6c 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20  load;           
9230: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
9240: 65 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f  es of cell paylo
9250: 61 64 20 2a 2f 0a 20 20 75 36 34 20 69 4b 65 79  ad */.  u64 iKey
9260: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9270: 2f 2a 20 45 78 74 72 61 63 74 65 64 20 4b 65 79  /* Extracted Key
9280: 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 61 73 73   value */..  ass
9290: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
92a0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
92b0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
92c0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
92d0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
92e0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 61 73  >leaf==1 );.  as
92f0: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
9300: 4b 65 79 4c 65 61 66 20 29 3b 0a 20 20 61 73 73  KeyLeaf );.  ass
9310: 65 72 74 28 20 70 50 61 67 65 2d 3e 63 68 69 6c  ert( pPage->chil
9320: 64 50 74 72 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  dPtrSize==0 );. 
9330: 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c 3b 0a   pIter = pCell;.
9340: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 62  .  /* The next b
9350: 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 69 73 20  lock of code is 
9360: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 3a 0a 20  equivalent to:. 
9370: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 70 49 74   **.  **     pIt
9380: 65 72 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  er += getVarint3
9390: 32 28 70 49 74 65 72 2c 20 6e 50 61 79 6c 6f 61  2(pIter, nPayloa
93a0: 64 29 3b 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  d);.  **.  ** Th
93b0: 65 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  e code is inline
93c0: 64 20 74 6f 20 61 76 6f 69 64 20 61 20 66 75 6e  d to avoid a fun
93d0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f  ction call..  */
93e0: 0a 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 2a 70  .  nPayload = *p
93f0: 49 74 65 72 3b 0a 20 20 69 66 28 20 6e 50 61 79  Iter;.  if( nPay
9400: 6c 6f 61 64 3e 3d 30 78 38 30 20 29 7b 0a 20 20  load>=0x80 ){.  
9410: 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 49    u8 *pEnd = &pI
9420: 74 65 72 5b 38 5d 3b 0a 20 20 20 20 6e 50 61 79  ter[8];.    nPay
9430: 6c 6f 61 64 20 26 3d 20 30 78 37 66 3b 0a 20 20  load &= 0x7f;.  
9440: 20 20 64 6f 7b 0a 20 20 20 20 20 20 6e 50 61 79    do{.      nPay
9450: 6c 6f 61 64 20 3d 20 28 6e 50 61 79 6c 6f 61 64  load = (nPayload
9460: 3c 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72  <<7) | (*++pIter
9470: 20 26 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77   & 0x7f);.    }w
9480: 68 69 6c 65 28 20 28 2a 70 49 74 65 72 29 3e 3d  hile( (*pIter)>=
9490: 30 78 38 30 20 26 26 20 70 49 74 65 72 3c 70 45  0x80 && pIter<pE
94a0: 6e 64 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65  nd );.  }.  pIte
94b0: 72 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  r++;..  /* The n
94c0: 65 78 74 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64  ext block of cod
94d0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
94e0: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
94f0: 20 20 70 49 74 65 72 20 2b 3d 20 67 65 74 56 61    pIter += getVa
9500: 72 69 6e 74 28 70 49 74 65 72 2c 20 28 75 36 34  rint(pIter, (u64
9510: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
9520: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 63  .  **.  ** The c
9530: 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65 64 20 74  ode is inlined t
9540: 6f 20 61 76 6f 69 64 20 61 20 66 75 6e 63 74 69  o avoid a functi
9550: 6f 6e 20 63 61 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  on call..  */.  
9560: 69 4b 65 79 20 3d 20 2a 70 49 74 65 72 3b 0a 20  iKey = *pIter;. 
9570: 20 69 66 28 20 69 4b 65 79 3e 3d 30 78 38 30 20   if( iKey>=0x80 
9580: 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64 20  ){.    u8 *pEnd 
9590: 3d 20 26 70 49 74 65 72 5b 37 5d 3b 0a 20 20 20  = &pIter[7];.   
95a0: 20 69 4b 65 79 20 26 3d 20 30 78 37 66 3b 0a 20   iKey &= 0x7f;. 
95b0: 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20     while(1){.   
95c0: 20 20 20 69 4b 65 79 20 3d 20 28 69 4b 65 79 3c     iKey = (iKey<
95d0: 3c 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20  <7) | (*++pIter 
95e0: 26 20 30 78 37 66 29 3b 0a 20 20 20 20 20 20 69  & 0x7f);.      i
95f0: 66 28 20 28 2a 70 49 74 65 72 29 3c 30 78 38 30  f( (*pIter)<0x80
9600: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
9610: 69 66 28 20 70 49 74 65 72 3e 3d 70 45 6e 64 20  if( pIter>=pEnd 
9620: 29 7b 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20  ){.        iKey 
9630: 3d 20 28 69 4b 65 79 3c 3c 38 29 20 7c 20 2a 2b  = (iKey<<8) | *+
9640: 2b 70 49 74 65 72 3b 0a 20 20 20 20 20 20 20 20  +pIter;.        
9650: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9660: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 74 65 72     }.  }.  pIter
9670: 2b 2b 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 6e 4b  ++;..  pInfo->nK
9680: 65 79 20 3d 20 2a 28 69 36 34 2a 29 26 69 4b 65  ey = *(i64*)&iKe
9690: 79 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79  y;.  pInfo->nPay
96a0: 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b  load = nPayload;
96b0: 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61 79 6c 6f  .  pInfo->pPaylo
96c0: 61 64 20 3d 20 70 49 74 65 72 3b 0a 20 20 74 65  ad = pIter;.  te
96d0: 73 74 63 61 73 65 28 20 6e 50 61 79 6c 6f 61 64  stcase( nPayload
96e0: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
96f0: 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  l );.  testcase(
9700: 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50 61 67 65   nPayload==pPage
9710: 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
9720: 20 20 69 66 28 20 6e 50 61 79 6c 6f 61 64 3c 3d    if( nPayload<=
9730: 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20  pPage->maxLocal 
9740: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
9750: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
9760: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
9770: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
9780: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
9790: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
97a0: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
97b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
97c0: 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69  /.    pInfo->nSi
97d0: 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20  ze = nPayload + 
97e0: 28 75 31 36 29 28 70 49 74 65 72 20 2d 20 70 43  (u16)(pIter - pC
97f0: 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ell);.    if( pI
9800: 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20 29 20 70  nfo->nSize<4 ) p
9810: 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 34 3b  Info->nSize = 4;
9820: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63  .    pInfo->nLoc
9830: 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c 6f  al = (u16)nPaylo
9840: 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ad;.  }else{.   
9850: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 41   btreeParseCellA
9860: 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f 76 65 72  djustSizeForOver
9870: 66 6c 6f 77 28 70 50 61 67 65 2c 20 70 43 65 6c  flow(pPage, pCel
9880: 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  l, pInfo);.  }.}
9890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
98a0: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 49 6e  eeParseCellPtrIn
98b0: 64 65 78 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  dex(.  MemPage *
98c0: 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f  pPage,         /
98d0: 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
98e0: 67 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20  g the cell */.  
98f0: 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20  u8 *pCell,      
9900: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
9910: 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74  er to the cell t
9920: 65 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  ext. */.  CellIn
9930: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
9940: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
9950: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
9960: 7b 0a 20 20 75 38 20 2a 70 49 74 65 72 3b 20 20  {.  u8 *pIter;  
9970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9980: 6f 72 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  or scanning thro
9990: 75 67 68 20 70 43 65 6c 6c 20 2a 2f 0a 20 20 75  ugh pCell */.  u
99a0: 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20 20  32 nPayload;    
99b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
99c0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65 6c   of bytes of cel
99d0: 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20 20  l payload */..  
99e0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
99f0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
9a00: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
9a10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9a20: 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61  ->leaf==0 || pPa
9a30: 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20  ge->leaf==1 );. 
9a40: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
9a50: 69 6e 74 4b 65 79 4c 65 61 66 3d 3d 30 20 29 3b  intKeyLeaf==0 );
9a60: 0a 20 20 70 49 74 65 72 20 3d 20 70 43 65 6c 6c  .  pIter = pCell
9a70: 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   + pPage->childP
9a80: 74 72 53 69 7a 65 3b 0a 20 20 6e 50 61 79 6c 6f  trSize;.  nPaylo
9a90: 61 64 20 3d 20 2a 70 49 74 65 72 3b 0a 20 20 69  ad = *pIter;.  i
9aa0: 66 28 20 6e 50 61 79 6c 6f 61 64 3e 3d 30 78 38  f( nPayload>=0x8
9ab0: 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 45 6e  0 ){.    u8 *pEn
9ac0: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
9ad0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 26 3d 20 30     nPayload &= 0
9ae0: 78 37 66 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  x7f;.    do{.   
9af0: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 28 6e     nPayload = (n
9b00: 50 61 79 6c 6f 61 64 3c 3c 37 29 20 7c 20 28 2a  Payload<<7) | (*
9b10: 2b 2b 70 49 74 65 72 20 26 20 30 78 37 66 29 3b  ++pIter & 0x7f);
9b20: 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 2a 28 70  .    }while( *(p
9b30: 49 74 65 72 29 3e 3d 30 78 38 30 20 26 26 20 70  Iter)>=0x80 && p
9b40: 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  Iter<pEnd );.  }
9b50: 0a 20 20 70 49 74 65 72 2b 2b 3b 0a 20 20 70 49  .  pIter++;.  pI
9b60: 6e 66 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79  nfo->nKey = nPay
9b70: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
9b80: 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f  Payload = nPaylo
9b90: 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 50 61  ad;.  pInfo->pPa
9ba0: 79 6c 6f 61 64 20 3d 20 70 49 74 65 72 3b 0a 20  yload = pIter;. 
9bb0: 20 74 65 73 74 63 61 73 65 28 20 6e 50 61 79 6c   testcase( nPayl
9bc0: 6f 61 64 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c  oad==pPage->maxL
9bd0: 6f 63 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61  ocal );.  testca
9be0: 73 65 28 20 6e 50 61 79 6c 6f 61 64 3d 3d 70 50  se( nPayload==pP
9bf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20  age->maxLocal+1 
9c00: 29 3b 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  );.  if( nPayloa
9c10: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
9c20: 61 6c 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  al ){.    /* Thi
9c30: 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29 20  s is the (easy) 
9c40: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
9c50: 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 79  e the entire pay
9c60: 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a 2a  load fits.    **
9c70: 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
9c80: 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77  ge.  No overflow
9c90: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20 20   is required..  
9ca0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 66 6f 2d 3e    */.    pInfo->
9cb0: 6e 53 69 7a 65 20 3d 20 6e 50 61 79 6c 6f 61 64  nSize = nPayload
9cc0: 20 2b 20 28 75 31 36 29 28 70 49 74 65 72 20 2d   + (u16)(pIter -
9cd0: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
9ce0: 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 3c 34 20   pInfo->nSize<4 
9cf0: 29 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d  ) pInfo->nSize =
9d00: 20 34 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   4;.    pInfo->n
9d10: 4c 6f 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61  Local = (u16)nPa
9d20: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
9d30: 20 20 20 20 62 74 72 65 65 50 61 72 73 65 43 65      btreeParseCe
9d40: 6c 6c 41 64 6a 75 73 74 53 69 7a 65 46 6f 72 4f  llAdjustSizeForO
9d50: 76 65 72 66 6c 6f 77 28 70 50 61 67 65 2c 20 70  verflow(pPage, p
9d60: 43 65 6c 6c 2c 20 70 49 6e 66 6f 29 3b 0a 20 20  Cell, pInfo);.  
9d70: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9d80: 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  btreeParseCell(.
9d90: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
9da0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
9db0: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
9dc0: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
9dd0: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
9de0: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
9df0: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
9e00: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
9e10: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
9e20: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
9e30: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
9e40: 0a 29 7b 0a 20 20 70 50 61 67 65 2d 3e 78 50 61  .){.  pPage->xPa
9e50: 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 66  rseCell(pPage, f
9e60: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
9e70: 43 65 6c 6c 29 2c 20 70 49 6e 66 6f 29 3b 0a 7d  Cell), pInfo);.}
9e80: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
9e90: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61  owing routines a
9ea0: 72 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  re implementatio
9eb0: 6e 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67  ns of the MemPag
9ec0: 65 2e 78 43 65 6c 6c 53 69 7a 65 0a 2a 2a 20 6d  e.xCellSize.** m
9ed0: 65 74 68 6f 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ethod..**.** Com
9ee0: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
9ef0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
9f00: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
9f10: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
9f20: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
9f30: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
9f40: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
9f50: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
9f60: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
9f70: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
9f80: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
9f90: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
9fa0: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
9fb0: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
9fc0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  ll pointer..**.*
9fd0: 2a 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50  * cellSizePtrNoP
9fe0: 61 79 6c 6f 61 64 28 29 20 20 20 20 3d 3e 20 20  ayload()    =>  
9ff0: 20 74 61 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20   table internal 
a000: 6e 6f 64 65 73 0a 2a 2a 20 63 65 6c 6c 53 69 7a  nodes.** cellSiz
a010: 65 50 74 72 28 29 20 20 20 20 20 20 20 20 20 20  ePtr()          
a020: 20 20 20 3d 3e 20 20 20 61 6c 6c 20 69 6e 64 65     =>   all inde
a030: 78 20 6e 6f 64 65 73 20 26 20 74 61 62 6c 65 20  x nodes & table 
a040: 6c 65 61 66 20 6e 6f 64 65 73 0a 2a 2f 0a 73 74  leaf nodes.*/.st
a050: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
a060: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
a070: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
a080: 0a 20 20 75 38 20 2a 70 49 74 65 72 20 3d 20 70  .  u8 *pIter = p
a090: 43 65 6c 6c 20 2b 20 70 50 61 67 65 2d 3e 63 68  Cell + pPage->ch
a0a0: 69 6c 64 50 74 72 53 69 7a 65 3b 20 2f 2a 20 46  ildPtrSize; /* F
a0b0: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
a0c0: 62 79 74 65 73 20 6f 66 20 70 43 65 6c 6c 20 2a  bytes of pCell *
a0d0: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20  /.  u8 *pEnd;   
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a100: 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20 76  End mark for a v
a110: 61 72 69 6e 74 20 2a 2f 0a 20 20 75 33 32 20 6e  arint */.  u32 n
a120: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
a130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a140: 20 20 20 20 2f 2a 20 53 69 7a 65 20 76 61 6c 75      /* Size valu
a150: 65 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 0a  e to return */..
a160: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
a170: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c  BUG.  /* The val
a180: 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
a190: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
a1a0: 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 68  uld always be th
a1b0: 65 20 73 61 6d 65 20 61 73 0a 20 20 2a 2a 20 74  e same as.  ** t
a1c0: 68 65 20 28 43 65 6c 6c 49 6e 66 6f 2e 6e 53 69  he (CellInfo.nSi
a1d0: 7a 65 29 20 76 61 6c 75 65 20 66 6f 75 6e 64 20  ze) value found 
a1e0: 62 79 20 64 6f 69 6e 67 20 61 20 66 75 6c 6c 20  by doing a full 
a1f0: 70 61 72 73 65 20 6f 66 20 74 68 65 0a 20 20 2a  parse of the.  *
a200: 2a 20 63 65 6c 6c 2e 20 49 66 20 53 51 4c 49 54  * cell. If SQLIT
a210: 45 5f 44 45 42 55 47 20 69 73 20 64 65 66 69 6e  E_DEBUG is defin
a220: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
a230: 61 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66  at the bottom of
a240: 0a 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  .  ** this funct
a250: 69 6f 6e 20 76 65 72 69 66 69 65 73 20 74 68 61  ion verifies tha
a260: 74 20 74 68 69 73 20 69 6e 76 61 72 69 61 6e 74  t this invariant
a270: 20 69 73 20 6e 6f 74 20 76 69 6f 6c 61 74 65 64   is not violated
a280: 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  . */.  CellInfo 
a290: 64 65 62 75 67 69 6e 66 6f 3b 0a 20 20 70 50 61  debuginfo;.  pPa
a2a0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
a2b0: 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 64 65  Page, pCell, &de
a2c0: 62 75 67 69 6e 66 6f 29 3b 0a 23 65 6e 64 69 66  buginfo);.#endif
a2d0: 0a 0a 20 20 6e 53 69 7a 65 20 3d 20 2a 70 49 74  ..  nSize = *pIt
a2e0: 65 72 3b 0a 20 20 69 66 28 20 6e 53 69 7a 65 3e  er;.  if( nSize>
a2f0: 3d 30 78 38 30 20 29 7b 0a 20 20 20 20 70 45 6e  =0x80 ){.    pEn
a300: 64 20 3d 20 26 70 49 74 65 72 5b 38 5d 3b 0a 20  d = &pIter[8];. 
a310: 20 20 20 6e 53 69 7a 65 20 26 3d 20 30 78 37 66     nSize &= 0x7f
a320: 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
a330: 6e 53 69 7a 65 20 3d 20 28 6e 53 69 7a 65 3c 3c  nSize = (nSize<<
a340: 37 29 20 7c 20 28 2a 2b 2b 70 49 74 65 72 20 26  7) | (*++pIter &
a350: 20 30 78 37 66 29 3b 0a 20 20 20 20 7d 77 68 69   0x7f);.    }whi
a360: 6c 65 28 20 2a 28 70 49 74 65 72 29 3e 3d 30 78  le( *(pIter)>=0x
a370: 38 30 20 26 26 20 70 49 74 65 72 3c 70 45 6e 64  80 && pIter<pEnd
a380: 20 29 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2b   );.  }.  pIter+
a390: 2b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  +;.  if( pPage->
a3a0: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a  intKey ){.    /*
a3b0: 20 70 49 74 65 72 20 6e 6f 77 20 70 6f 69 6e 74   pIter now point
a3c0: 73 20 61 74 20 74 68 65 20 36 34 2d 62 69 74 20  s at the 64-bit 
a3d0: 69 6e 74 65 67 65 72 20 6b 65 79 20 76 61 6c 75  integer key valu
a3e0: 65 2c 20 61 20 76 61 72 69 61 62 6c 65 20 6c 65  e, a variable le
a3f0: 6e 67 74 68 20 0a 20 20 20 20 2a 2a 20 69 6e 74  ngth .    ** int
a400: 65 67 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  eger. The follow
a410: 69 6e 67 20 62 6c 6f 63 6b 20 6d 6f 76 65 73 20  ing block moves 
a420: 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 61  pIter to point a
a430: 74 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  t the first byte
a440: 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74 68 65  .    ** past the
a450: 20 65 6e 64 20 6f 66 20 74 68 65 20 6b 65 79 20   end of the key 
a460: 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 70 45  value. */.    pE
a470: 6e 64 20 3d 20 26 70 49 74 65 72 5b 39 5d 3b 0a  nd = &pIter[9];.
a480: 20 20 20 20 77 68 69 6c 65 28 20 28 2a 70 49 74      while( (*pIt
a490: 65 72 2b 2b 29 26 30 78 38 30 20 26 26 20 70 49  er++)&0x80 && pI
a4a0: 74 65 72 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a  ter<pEnd );.  }.
a4b0: 20 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a    testcase( nSiz
a4c0: 65 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  e==pPage->maxLoc
a4d0: 61 6c 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  al );.  testcase
a4e0: 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d 3e  ( nSize==pPage->
a4f0: 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a 20 20  maxLocal+1 );.  
a500: 69 66 28 20 6e 53 69 7a 65 3c 3d 70 50 61 67 65  if( nSize<=pPage
a510: 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20  ->maxLocal ){.  
a520: 20 20 6e 53 69 7a 65 20 2b 3d 20 28 75 33 32 29    nSize += (u32)
a530: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b  (pIter - pCell);
a540: 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65 3c 34  .    if( nSize<4
a550: 20 29 20 6e 53 69 7a 65 20 3d 20 34 3b 0a 20 20   ) nSize = 4;.  
a560: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6d  }else{.    int m
a570: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
a580: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e  >minLocal;.    n
a590: 53 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 20  Size = minLocal 
a5a0: 2b 20 28 6e 53 69 7a 65 20 2d 20 6d 69 6e 4c 6f  + (nSize - minLo
a5b0: 63 61 6c 29 20 25 20 28 70 50 61 67 65 2d 3e 70  cal) % (pPage->p
a5c0: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
a5d0: 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73   4);.    testcas
a5e0: 65 28 20 6e 53 69 7a 65 3d 3d 70 50 61 67 65 2d  e( nSize==pPage-
a5f0: 3e 6d 61 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20  >maxLocal );.   
a600: 20 74 65 73 74 63 61 73 65 28 20 6e 53 69 7a 65   testcase( nSize
a610: 3d 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61  ==pPage->maxLoca
a620: 6c 2b 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  l+1 );.    if( n
a630: 53 69 7a 65 3e 70 50 61 67 65 2d 3e 6d 61 78 4c  Size>pPage->maxL
a640: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 6e 53  ocal ){.      nS
a650: 69 7a 65 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b 0a  ize = minLocal;.
a660: 20 20 20 20 7d 0a 20 20 20 20 6e 53 69 7a 65 20      }.    nSize 
a670: 2b 3d 20 34 20 2b 20 28 75 31 36 29 28 70 49 74  += 4 + (u16)(pIt
a680: 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a 20 20 7d  er - pCell);.  }
a690: 0a 20 20 61 73 73 65 72 74 28 20 6e 53 69 7a 65  .  assert( nSize
a6a0: 3d 3d 64 65 62 75 67 69 6e 66 6f 2e 6e 53 69 7a  ==debuginfo.nSiz
a6b0: 65 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  e || CORRUPT_DB 
a6c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36  );.  return (u16
a6d0: 29 6e 53 69 7a 65 3b 0a 7d 0a 73 74 61 74 69 63  )nSize;.}.static
a6e0: 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74 72   u16 cellSizePtr
a6f0: 4e 6f 50 61 79 6c 6f 61 64 28 4d 65 6d 50 61 67  NoPayload(MemPag
a700: 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a 70 43  e *pPage, u8 *pC
a710: 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 49 74 65  ell){.  u8 *pIte
a720: 72 20 3d 20 70 43 65 6c 6c 20 2b 20 34 3b 20 2f  r = pCell + 4; /
a730: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
a740: 65 72 20 62 79 74 65 73 20 6f 66 20 70 43 65 6c  er bytes of pCel
a750: 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 3b  l */.  u8 *pEnd;
a760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a770: 20 45 6e 64 20 6d 61 72 6b 20 66 6f 72 20 61 20   End mark for a 
a780: 76 61 72 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65  varint */..#ifde
a790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
a7a0: 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65   /* The value re
a7b0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 66  turned by this f
a7c0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61  unction should a
a7d0: 6c 77 61 79 73 20 62 65 20 74 68 65 20 73 61 6d  lways be the sam
a7e0: 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 28 43  e as.  ** the (C
a7f0: 65 6c 6c 49 6e 66 6f 2e 6e 53 69 7a 65 29 20 76  ellInfo.nSize) v
a800: 61 6c 75 65 20 66 6f 75 6e 64 20 62 79 20 64 6f  alue found by do
a810: 69 6e 67 20 61 20 66 75 6c 6c 20 70 61 72 73 65  ing a full parse
a820: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c   of the.  ** cel
a830: 6c 2e 20 49 66 20 53 51 4c 49 54 45 5f 44 45 42  l. If SQLITE_DEB
a840: 55 47 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  UG is defined, a
a850: 6e 20 61 73 73 65 72 74 28 29 20 61 74 20 74 68  n assert() at th
a860: 65 20 62 6f 74 74 6f 6d 20 6f 66 0a 20 20 2a 2a  e bottom of.  **
a870: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 76   this function v
a880: 65 72 69 66 69 65 73 20 74 68 61 74 20 74 68 69  erifies that thi
a890: 73 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 6e  s invariant is n
a8a0: 6f 74 20 76 69 6f 6c 61 74 65 64 2e 20 2a 2f 0a  ot violated. */.
a8b0: 20 20 43 65 6c 6c 49 6e 66 6f 20 64 65 62 75 67    CellInfo debug
a8c0: 69 6e 66 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 78  info;.  pPage->x
a8d0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
a8e0: 20 70 43 65 6c 6c 2c 20 26 64 65 62 75 67 69 6e   pCell, &debugin
a8f0: 66 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  fo);.#else.  UNU
a900: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50  SED_PARAMETER(pP
a910: 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  age);.#endif..  
a920: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 63  assert( pPage->c
a930: 68 69 6c 64 50 74 72 53 69 7a 65 3d 3d 34 20 29  hildPtrSize==4 )
a940: 3b 0a 20 20 70 45 6e 64 20 3d 20 70 49 74 65 72  ;.  pEnd = pIter
a950: 20 2b 20 39 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 9;.  while( (
a960: 2a 70 49 74 65 72 2b 2b 29 26 30 78 38 30 20 26  *pIter++)&0x80 &
a970: 26 20 70 49 74 65 72 3c 70 45 6e 64 20 29 3b 0a  & pIter<pEnd );.
a980: 20 20 61 73 73 65 72 74 28 20 64 65 62 75 67 69    assert( debugi
a990: 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 28 75 31 36 29  nfo.nSize==(u16)
a9a0: 28 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 20  (pIter - pCell) 
a9b0: 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
a9c0: 0a 20 20 72 65 74 75 72 6e 20 28 75 31 36 29 28  .  return (u16)(
a9d0: 70 49 74 65 72 20 2d 20 70 43 65 6c 6c 29 3b 0a  pIter - pCell);.
a9e0: 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  }...#ifdef SQLIT
a9f0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
aa00: 76 61 72 69 61 74 69 6f 6e 20 6f 6e 20 63 65 6c  variation on cel
aa10: 6c 53 69 7a 65 50 74 72 28 29 20 69 73 20 75 73  lSizePtr() is us
aa20: 65 64 20 69 6e 73 69 64 65 20 6f 66 20 61 73 73  ed inside of ass
aa30: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
aa40: 0a 2a 2a 20 6f 6e 6c 79 2e 20 2a 2f 0a 73 74 61  .** only. */.sta
aa50: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
aa60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
aa70: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 72   int iCell){.  r
aa80: 65 74 75 72 6e 20 70 50 61 67 65 2d 3e 78 43 65  eturn pPage->xCe
aa90: 6c 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 66 69  llSize(pPage, fi
aaa0: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
aab0: 65 6c 6c 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ell));.}.#endif.
aac0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
aad0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
aae0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c  /*.** If the cel
aaf0: 6c 20 70 43 65 6c 6c 2c 20 70 61 72 74 20 6f 66  l pCell, part of
ab00: 20 70 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74   page pPage cont
ab10: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  ains a pointer.*
ab20: 2a 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77  * to an overflow
ab30: 20 70 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e   page, insert an
ab40: 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20   entry into the 
ab50: 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66  pointer-map.** f
ab60: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
ab70: 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
ab80: 76 6f 69 64 20 70 74 72 6d 61 70 50 75 74 4f 76  void ptrmapPutOv
ab90: 66 6c 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70  flPtr(MemPage *p
aba0: 50 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 2c  Page, u8 *pCell,
abb0: 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20 20 43 65   int *pRC){.  Ce
abc0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 69  llInfo info;.  i
abd0: 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72 6e  f( *pRC ) return
abe0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 65 6c  ;.  assert( pCel
abf0: 6c 21 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 2d  l!=0 );.  pPage-
ac00: 3e 78 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67  >xParseCell(pPag
ac10: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
ac20: 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f  ;.  if( info.nLo
ac30: 63 61 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  cal<info.nPayloa
ac40: 64 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  d ){.    Pgno ov
ac50: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
ac60: 43 65 6c 6c 5b 69 6e 66 6f 2e 6e 53 69 7a 65 2d  Cell[info.nSize-
ac70: 34 5d 29 3b 0a 20 20 20 20 70 74 72 6d 61 70 50  4]);.    ptrmapP
ac80: 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f  ut(pPage->pBt, o
ac90: 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52  vfl, PTRMAP_OVER
aca0: 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67  FLOW1, pPage->pg
acb0: 6e 6f 2c 20 70 52 43 29 3b 0a 20 20 7d 0a 7d 0a  no, pRC);.  }.}.
acc0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
acd0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
ace0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
acf0: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
ad00: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
ad10: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
ad20: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
ad30: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
ad40: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
ad50: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
ad60: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
ad70: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
ad80: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
ad90: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
ada0: 74 20 61 72 65 61 2e 0a 2a 2a 0a 2a 2a 20 45 56  t area..**.** EV
adb0: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 35  IDENCE-OF: R-445
adc0: 38 32 2d 36 30 31 33 38 20 53 51 4c 69 74 65 20  82-60138 SQLite 
add0: 6d 61 79 20 66 72 6f 6d 20 74 69 6d 65 20 74 6f  may from time to
ade0: 20 74 69 6d 65 20 72 65 6f 72 67 61 6e 69 7a 65   time reorganize
adf0: 20 61 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67   a.** b-tree pag
ae00: 65 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  e so that there 
ae10: 61 72 65 20 6e 6f 20 66 72 65 65 62 6c 6f 63 6b  are no freeblock
ae20: 73 20 6f 72 20 66 72 61 67 6d 65 6e 74 20 62 79  s or fragment by
ae30: 74 65 73 2c 20 61 6c 6c 0a 2a 2a 20 75 6e 75 73  tes, all.** unus
ae40: 65 64 20 62 79 74 65 73 20 61 72 65 20 63 6f 6e  ed bytes are con
ae50: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 75 6e  tained in the un
ae60: 61 6c 6c 6f 63 61 74 65 64 20 73 70 61 63 65 20  allocated space 
ae70: 72 65 67 69 6f 6e 2c 20 61 6e 64 20 61 6c 6c 0a  region, and all.
ae80: 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 70 61 63  ** cells are pac
ae90: 6b 65 64 20 74 69 67 68 74 6c 79 20 61 74 20 74  ked tightly at t
aea0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
aeb0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
aec0: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
aed0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
aee0: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
af10: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af30: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 74 68 65  * Address of the
af40: 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20   i-th cell */.  
af50: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
af60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
af70: 66 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65  fset to the page
af80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
af90: 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
afa0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
afb0: 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69  of a cell */.  i
afc0: 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
afd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
afe0: 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79  ber of usable by
aff0: 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f  tes on a page */
b000: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
b010: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
b020: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63   Offset to the c
b030: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
b040: 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72 6b 3b  y */.  int cbrk;
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74    /* Offset to t
b070: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
b080: 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  area */.  int nC
b090: 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
b0a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b0b0: 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70  f cells on the p
b0c0: 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  age */.  unsigne
b0d0: 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20  d char *data;   
b0e0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
b0f0: 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  data */.  unsign
b100: 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20  ed char *temp;  
b110: 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65       /* Temp are
b120: 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65  a for cell conte
b130: 6e 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  nt */.  unsigned
b140: 20 63 68 61 72 20 2a 73 72 63 3b 20 20 20 20 20   char *src;     
b150: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6f 66 20     /* Source of 
b160: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  content */.  int
b170: 20 69 43 65 6c 6c 46 69 72 73 74 3b 20 20 20 20   iCellFirst;    
b180: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
b190: 20 61 6c 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20   allowable cell 
b1a0: 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69  index */.  int i
b1b0: 43 65 6c 6c 4c 61 73 74 3b 20 20 20 20 20 20 20  CellLast;       
b1c0: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 6f        /* Last po
b1d0: 73 73 69 62 6c 65 20 63 65 6c 6c 20 69 6e 64 65  ssible cell inde
b1e0: 78 20 2a 2f 0a 0a 0a 20 20 61 73 73 65 72 74 28  x */...  assert(
b1f0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
b200: 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
b210: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
b220: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
b230: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
b240: 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
b250: 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54  bleSize <= SQLIT
b260: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
b270: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
b280: 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
b290: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
b2a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
b2b0: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
b2c0: 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20  ex) );.  temp = 
b2d0: 30 3b 0a 20 20 73 72 63 20 3d 20 64 61 74 61 20  0;.  src = data 
b2e0: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a  = pPage->aData;.
b2f0: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
b300: 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c 6c  drOffset;.  cell
b310: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
b320: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e 43  cellOffset;.  nC
b330: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
b340: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43  ll;.  assert( nC
b350: 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26 64  ell==get2byte(&d
b360: 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a 20  ata[hdr+3]) );. 
b370: 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 50   usableSize = pP
b380: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
b390: 53 69 7a 65 3b 0a 20 20 63 62 72 6b 20 3d 20 75  Size;.  cbrk = u
b3a0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 43 65  sableSize;.  iCe
b3b0: 6c 6c 46 69 72 73 74 20 3d 20 63 65 6c 6c 4f 66  llFirst = cellOf
b3c0: 66 73 65 74 20 2b 20 32 2a 6e 43 65 6c 6c 3b 0a  fset + 2*nCell;.
b3d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
b3e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
b3f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
b400: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
b410: 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54 68  pAddr;     /* Th
b420: 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69 6e  e i-th cell poin
b430: 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64 72  ter */.    pAddr
b440: 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66   = &data[cellOff
b450: 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20 20  set + i*2];.    
b460: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 41  pc = get2byte(pA
b470: 64 64 72 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ddr);.    testca
b480: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 46 69 72  se( pc==iCellFir
b490: 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  st );.    testca
b4a0: 73 65 28 20 70 63 3d 3d 69 43 65 6c 6c 4c 61 73  se( pc==iCellLas
b4b0: 74 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 73  t );.    /* Thes
b4c0: 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61 76  e conditions hav
b4d0: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 76  e already been v
b4e0: 65 72 69 66 69 65 64 20 69 6e 20 62 74 72 65 65  erified in btree
b4f0: 49 6e 69 74 50 61 67 65 28 29 0a 20 20 20 20 2a  InitPage().    *
b500: 2a 20 69 66 20 50 52 41 47 4d 41 20 63 65 6c 6c  * if PRAGMA cell
b510: 5f 73 69 7a 65 5f 63 68 65 63 6b 3d 4f 4e 2e 0a  _size_check=ON..
b520: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
b530: 63 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20  c<iCellFirst || 
b540: 70 63 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a  pc>iCellLast ){.
b550: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b560: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
b570: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
b580: 72 74 28 20 70 63 3e 3d 69 43 65 6c 6c 46 69 72  rt( pc>=iCellFir
b590: 73 74 20 26 26 20 70 63 3c 3d 69 43 65 6c 6c 4c  st && pc<=iCellL
b5a0: 61 73 74 20 29 3b 0a 20 20 20 20 73 69 7a 65 20  ast );.    size 
b5b0: 3d 20 70 50 61 67 65 2d 3e 78 43 65 6c 6c 53 69  = pPage->xCellSi
b5c0: 7a 65 28 70 50 61 67 65 2c 20 26 73 72 63 5b 70  ze(pPage, &src[p
b5d0: 63 5d 29 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d  c]);.    cbrk -=
b5e0: 20 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 63   size;.    if( c
b5f0: 62 72 6b 3c 69 43 65 6c 6c 46 69 72 73 74 20 7c  brk<iCellFirst |
b600: 7c 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65  | pc+size>usable
b610: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65  Size ){.      re
b620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
b630: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
b640: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b      assert( cbrk
b650: 2b 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a  +size<=usableSiz
b660: 65 20 26 26 20 63 62 72 6b 3e 3d 69 43 65 6c 6c  e && cbrk>=iCell
b670: 46 69 72 73 74 20 29 3b 0a 20 20 20 20 74 65 73  First );.    tes
b680: 74 63 61 73 65 28 20 63 62 72 6b 2b 73 69 7a 65  tcase( cbrk+size
b690: 3d 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ==usableSize );.
b6a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 63      testcase( pc
b6b0: 2b 73 69 7a 65 3d 3d 75 73 61 62 6c 65 53 69 7a  +size==usableSiz
b6c0: 65 20 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  e );.    put2byt
b6d0: 65 28 70 41 64 64 72 2c 20 63 62 72 6b 29 3b 0a  e(pAddr, cbrk);.
b6e0: 20 20 20 20 69 66 28 20 74 65 6d 70 3d 3d 30 20      if( temp==0 
b6f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 3b 0a  ){.      int x;.
b700: 20 20 20 20 20 20 69 66 28 20 63 62 72 6b 3d 3d        if( cbrk==
b710: 70 63 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  pc ) continue;. 
b720: 20 20 20 20 20 74 65 6d 70 20 3d 20 73 71 6c 69       temp = sqli
b730: 74 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63  te3PagerTempSpac
b740: 65 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50  e(pPage->pBt->pP
b750: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 78 20 3d  ager);.      x =
b760: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
b770: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 6d  hdr+5]);.      m
b780: 65 6d 63 70 79 28 26 74 65 6d 70 5b 78 5d 2c 20  emcpy(&temp[x], 
b790: 26 64 61 74 61 5b 78 5d 2c 20 28 63 62 72 6b 2b  &data[x], (cbrk+
b7a0: 73 69 7a 65 29 20 2d 20 78 29 3b 0a 20 20 20 20  size) - x);.    
b7b0: 20 20 73 72 63 20 3d 20 74 65 6d 70 3b 0a 20 20    src = temp;.  
b7c0: 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 26    }.    memcpy(&
b7d0: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 73 72 63  data[cbrk], &src
b7e0: 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 7d  [pc], size);.  }
b7f0: 0a 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 3e  .  assert( cbrk>
b800: 3d 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20  =iCellFirst );. 
b810: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
b820: 68 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20  hdr+5], cbrk);. 
b830: 20 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30   data[hdr+1] = 0
b840: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20  ;.  data[hdr+2] 
b850: 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b  = 0;.  data[hdr+
b860: 37 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  7] = 0;.  memset
b870: 28 26 64 61 74 61 5b 69 43 65 6c 6c 46 69 72 73  (&data[iCellFirs
b880: 74 5d 2c 20 30 2c 20 63 62 72 6b 2d 69 43 65 6c  t], 0, cbrk-iCel
b890: 6c 46 69 72 73 74 29 3b 0a 20 20 61 73 73 65 72  lFirst);.  asser
b8a0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
b8b0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
b8c0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
b8d0: 69 66 28 20 63 62 72 6b 2d 69 43 65 6c 6c 46 69  if( cbrk-iCellFi
b8e0: 72 73 74 21 3d 70 50 61 67 65 2d 3e 6e 46 72 65  rst!=pPage->nFre
b8f0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
b900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
b910: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
b920: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b930: 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65  /*.** Search the
b940: 20 66 72 65 65 2d 6c 69 73 74 20 6f 6e 20 70 61   free-list on pa
b950: 67 65 20 70 50 67 20 66 6f 72 20 73 70 61 63 65  ge pPg for space
b960: 20 74 6f 20 73 74 6f 72 65 20 61 20 63 65 6c 6c   to store a cell
b970: 20 6e 42 79 74 65 20 62 79 74 65 73 20 69 6e 0a   nByte bytes in.
b980: 2a 2a 20 73 69 7a 65 2e 20 49 66 20 6f 6e 65 20  ** size. If one 
b990: 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
b9a0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
b9b0: 6f 20 74 68 65 20 73 70 61 63 65 20 61 6e 64 20  o the space and 
b9c0: 72 65 6d 6f 76 65 20 69 74 0a 2a 2a 20 66 72 6f  remove it.** fro
b9d0: 6d 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  m the free-list.
b9e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69  .**.** If no sui
b9f0: 74 61 62 6c 65 20 73 70 61 63 65 20 63 61 6e 20  table space can 
ba00: 62 65 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20  be found on the 
ba10: 66 72 65 65 2d 6c 69 73 74 2c 20 72 65 74 75 72  free-list, retur
ba20: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
ba30: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
ba40: 64 65 74 65 63 74 20 63 6f 72 72 75 70 74 69 6f  detect corruptio
ba50: 6e 20 77 69 74 68 69 6e 20 70 50 67 2e 20 20 49  n within pPg.  I
ba60: 66 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 0a  f corruption is.
ba70: 2a 2a 20 64 65 74 65 63 74 65 64 20 74 68 65 6e  ** detected then
ba80: 20 2a 70 52 63 20 69 73 20 73 65 74 20 74 6f 20   *pRc is set to 
ba90: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
baa0: 6e 64 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  nd NULL is retur
bab0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 6c 6f 74 73  ned..**.** Slots
bac0: 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
bad0: 74 20 74 68 61 74 20 61 72 65 20 62 65 74 77 65  t that are betwe
bae0: 65 6e 20 31 20 61 6e 64 20 33 20 62 79 74 65 73  en 1 and 3 bytes
baf0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e 42 79   larger than nBy
bb00: 74 65 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 69 67  te.** will be ig
bb10: 6e 6f 72 65 64 20 69 66 20 61 64 64 69 6e 67 20  nored if adding 
bb20: 74 68 65 20 65 78 74 72 61 20 73 70 61 63 65 20  the extra space 
bb30: 74 6f 20 74 68 65 20 66 72 61 67 6d 65 6e 74 61  to the fragmenta
bb40: 74 69 6f 6e 20 63 6f 75 6e 74 0a 2a 2a 20 63 61  tion count.** ca
bb50: 75 73 65 73 20 74 68 65 20 66 72 61 67 6d 65 6e  uses the fragmen
bb60: 74 61 74 69 6f 6e 20 63 6f 75 6e 74 20 74 6f 20  tation count to 
bb70: 65 78 63 65 65 64 20 36 30 2e 0a 2a 2f 0a 73 74  exceed 60..*/.st
bb80: 61 74 69 63 20 75 38 20 2a 70 61 67 65 46 69 6e  atic u8 *pageFin
bb90: 64 53 6c 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70  dSlot(MemPage *p
bba0: 50 67 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  Pg, int nByte, i
bbb0: 6e 74 20 2a 70 52 63 29 7b 0a 20 20 63 6f 6e 73  nt *pRc){.  cons
bbc0: 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67 2d  t int hdr = pPg-
bbd0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 75 38  >hdrOffset;.  u8
bbe0: 20 2a 20 63 6f 6e 73 74 20 61 44 61 74 61 20 3d   * const aData =
bbf0: 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 69   pPg->aData;.  i
bc00: 6e 74 20 69 41 64 64 72 20 3d 20 68 64 72 20 2b  nt iAddr = hdr +
bc10: 20 31 3b 0a 20 20 69 6e 74 20 70 63 20 3d 20 67   1;.  int pc = g
bc20: 65 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 69  et2byte(&aData[i
bc30: 41 64 64 72 5d 29 3b 0a 20 20 69 6e 74 20 78 3b  Addr]);.  int x;
bc40: 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
bc50: 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e 75 73  e = pPg->pBt->us
bc60: 61 62 6c 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  ableSize;..  ass
bc70: 65 72 74 28 20 70 63 3e 30 20 29 3b 0a 20 20 64  ert( pc>0 );.  d
bc80: 6f 7b 0a 20 20 20 20 69 6e 74 20 73 69 7a 65 3b  o{.    int size;
bc90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
bca0: 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65 65 20  ize of the free 
bcb0: 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 45  slot */.    /* E
bcc0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 36  VIDENCE-OF: R-06
bcd0: 38 36 36 2d 33 39 31 32 35 20 46 72 65 65 62 6c  866-39125 Freebl
bce0: 6f 63 6b 73 20 61 72 65 20 61 6c 77 61 79 73 20  ocks are always 
bcf0: 63 6f 6e 6e 65 63 74 65 64 20 69 6e 20 6f 72 64  connected in ord
bd00: 65 72 20 6f 66 0a 20 20 20 20 2a 2a 20 69 6e 63  er of.    ** inc
bd10: 72 65 61 73 69 6e 67 20 6f 66 66 73 65 74 2e 20  reasing offset. 
bd20: 2a 2f 0a 20 20 20 20 69 66 28 20 70 63 3e 75 73  */.    if( pc>us
bd30: 61 62 6c 65 53 69 7a 65 2d 34 20 7c 7c 20 70 63  ableSize-4 || pc
bd40: 3c 69 41 64 64 72 2b 34 20 29 7b 0a 20 20 20 20  <iAddr+4 ){.    
bd50: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
bd60: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
bd70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
bd80: 20 20 7d 0a 20 20 20 20 2f 2a 20 45 56 49 44 45    }.    /* EVIDE
bd90: 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 37 31 30 2d  NCE-OF: R-22710-
bda0: 35 33 33 32 38 20 54 68 65 20 74 68 69 72 64 20  53328 The third 
bdb0: 61 6e 64 20 66 6f 75 72 74 68 20 62 79 74 65 73  and fourth bytes
bdc0: 20 6f 66 20 65 61 63 68 0a 20 20 20 20 2a 2a 20   of each.    ** 
bdd0: 66 72 65 65 62 6c 6f 63 6b 20 66 6f 72 6d 20 61  freeblock form a
bde0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
bdf0: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
be00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 72 65   size of the fre
be10: 65 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 69 6e  eblock.    ** in
be20: 20 62 79 74 65 73 2c 20 69 6e 63 6c 75 64 69 6e   bytes, includin
be30: 67 20 74 68 65 20 34 2d 62 79 74 65 20 68 65 61  g the 4-byte hea
be40: 64 65 72 2e 20 2a 2f 0a 20 20 20 20 73 69 7a 65  der. */.    size
be50: 20 3d 20 67 65 74 32 62 79 74 65 28 26 61 44 61   = get2byte(&aDa
be60: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 69  ta[pc+2]);.    i
be70: 66 28 20 28 78 20 3d 20 73 69 7a 65 20 2d 20 6e  f( (x = size - n
be80: 42 79 74 65 29 3e 3d 30 20 29 7b 0a 20 20 20 20  Byte)>=0 ){.    
be90: 20 20 74 65 73 74 63 61 73 65 28 20 78 3d 3d 34    testcase( x==4
bea0: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
beb0: 73 65 28 20 78 3d 3d 33 20 29 3b 0a 20 20 20 20  se( x==3 );.    
bec0: 20 20 69 66 28 20 70 63 20 3c 20 70 50 67 2d 3e    if( pc < pPg->
bed0: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 67  cellOffset+2*pPg
bee0: 2d 3e 6e 43 65 6c 6c 20 7c 7c 20 73 69 7a 65 2b  ->nCell || size+
bef0: 70 63 20 3e 20 75 73 61 62 6c 65 53 69 7a 65 20  pc > usableSize 
bf00: 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 52 63 20  ){.        *pRc 
bf10: 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
bf20: 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 72  _BKPT;.        r
bf30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
bf40: 65 6c 73 65 20 69 66 28 20 78 3c 34 20 29 7b 0a  else if( x<4 ){.
bf50: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
bf60: 4e 43 45 2d 4f 46 3a 20 52 2d 31 31 34 39 38 2d  NCE-OF: R-11498-
bf70: 35 38 30 32 32 20 49 6e 20 61 20 77 65 6c 6c 2d  58022 In a well-
bf80: 66 6f 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61  formed b-tree pa
bf90: 67 65 2c 20 74 68 65 20 74 6f 74 61 6c 0a 20 20  ge, the total.  
bfa0: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
bfb0: 6f 66 20 62 79 74 65 73 20 69 6e 20 66 72 61 67  of bytes in frag
bfc0: 6d 65 6e 74 73 20 6d 61 79 20 6e 6f 74 20 65 78  ments may not ex
bfd0: 63 65 65 64 20 36 30 2e 20 2a 2f 0a 20 20 20 20  ceed 60. */.    
bfe0: 20 20 20 20 69 66 28 20 61 44 61 74 61 5b 68 64      if( aData[hd
bff0: 72 2b 37 5d 3e 35 37 20 29 20 72 65 74 75 72 6e  r+7]>57 ) return
c000: 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
c010: 52 65 6d 6f 76 65 20 74 68 65 20 73 6c 6f 74 20  Remove the slot 
c020: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 2d 6c 69  from the free-li
c030: 73 74 2e 20 55 70 64 61 74 65 20 74 68 65 20 6e  st. Update the n
c040: 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 20 20 20  umber of.       
c050: 20 2a 2a 20 66 72 61 67 6d 65 6e 74 65 64 20 62   ** fragmented b
c060: 79 74 65 73 20 77 69 74 68 69 6e 20 74 68 65 20  ytes within the 
c070: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  page. */.       
c080: 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 69   memcpy(&aData[i
c090: 41 64 64 72 5d 2c 20 26 61 44 61 74 61 5b 70 63  Addr], &aData[pc
c0a0: 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61  ], 2);.        a
c0b0: 44 61 74 61 5b 68 64 72 2b 37 5d 20 2b 3d 20 28  Data[hdr+7] += (
c0c0: 75 38 29 78 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u8)x;.      }els
c0d0: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
c0e0: 65 20 73 6c 6f 74 20 72 65 6d 61 69 6e 73 20 6f  e slot remains o
c0f0: 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
c100: 20 52 65 64 75 63 65 20 69 74 73 20 73 69 7a 65   Reduce its size
c110: 20 74 6f 20 61 63 63 6f 75 6e 74 0a 20 20 20 20   to account.    
c120: 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20       ** for the 
c130: 70 6f 72 74 69 6f 6e 20 75 73 65 64 20 62 79 20  portion used by 
c140: 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63 61 74 69  the new allocati
c150: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  on. */.        p
c160: 75 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70  ut2byte(&aData[p
c170: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
c180: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  }.      return &
c190: 61 44 61 74 61 5b 70 63 20 2b 20 78 5d 3b 0a 20  aData[pc + x];. 
c1a0: 20 20 20 7d 0a 20 20 20 20 69 41 64 64 72 20 3d     }.    iAddr =
c1b0: 20 70 63 3b 0a 20 20 20 20 70 63 20 3d 20 67 65   pc;.    pc = ge
c1c0: 74 32 62 79 74 65 28 26 61 44 61 74 61 5b 70 63  t2byte(&aData[pc
c1d0: 5d 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 63  ]);.  }while( pc
c1e0: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b   );..  return 0;
c1f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
c200: 74 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  te nByte bytes o
c210: 66 20 73 70 61 63 65 20 66 72 6f 6d 20 77 69 74  f space from wit
c220: 68 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 70  hin the B-Tree p
c230: 61 67 65 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  age passed.** as
c240: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
c250: 65 6e 74 2e 20 57 72 69 74 65 20 69 6e 74 6f 20  ent. Write into 
c260: 2a 70 49 64 78 20 74 68 65 20 69 6e 64 65 78 20  *pIdx the index 
c270: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
c280: 61 5b 5d 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69  a[].** of the fi
c290: 72 73 74 20 62 79 74 65 20 6f 66 20 61 6c 6c 6f  rst byte of allo
c2a0: 63 61 74 65 64 20 73 70 61 63 65 2e 20 52 65 74  cated space. Ret
c2b0: 75 72 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54  urn either SQLIT
c2c0: 45 5f 4f 4b 20 6f 72 0a 2a 2a 20 61 6e 20 65 72  E_OK or.** an er
c2d0: 72 6f 72 20 63 6f 64 65 20 28 75 73 75 61 6c 6c  ror code (usuall
c2e0: 79 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  y SQLITE_CORRUPT
c2f0: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  )..**.** The cal
c300: 6c 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74  ler guarantees t
c310: 68 61 74 20 74 68 65 72 65 20 69 73 20 73 75 66  hat there is suf
c320: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 74 6f  ficient space to
c330: 20 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 61 6c 6c   make the.** all
c340: 6f 63 61 74 69 6f 6e 2e 20 20 54 68 69 73 20 72  ocation.  This r
c350: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 6e 65 65  outine might nee
c360: 64 20 74 6f 20 64 65 66 72 61 67 6d 65 6e 74 20  d to defragment 
c370: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 72 69 6e  in order to brin
c380: 67 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 73 70 61  g.** all the spa
c390: 63 65 20 74 6f 67 65 74 68 65 72 2c 20 68 6f 77  ce together, how
c3a0: 65 76 65 72 2e 20 20 54 68 69 73 20 72 6f 75 74  ever.  This rout
c3b0: 69 6e 65 20 77 69 6c 6c 20 61 76 6f 69 64 20 75  ine will avoid u
c3c0: 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 72 73  sing.** the firs
c3d0: 74 20 74 77 6f 20 62 79 74 65 73 20 70 61 73 74  t two bytes past
c3e0: 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65   the cell pointe
c3f0: 72 20 61 72 65 61 20 73 69 6e 63 65 20 70 72 65  r area since pre
c400: 73 75 6d 61 62 6c 79 20 74 68 69 73 0a 2a 2a 20  sumably this.** 
c410: 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 62 65  allocation is be
c420: 69 6e 67 20 6d 61 64 65 20 69 6e 20 6f 72 64 65  ing made in orde
c430: 72 20 74 6f 20 69 6e 73 65 72 74 20 61 20 6e 65  r to insert a ne
c440: 77 20 63 65 6c 6c 2c 20 73 6f 20 77 65 20 77 69  w cell, so we wi
c450: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 65 6e 64 20 75  ll.** also end u
c460: 70 20 6e 65 65 64 69 6e 67 20 61 20 6e 65 77 20  p needing a new 
c470: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
c480: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
c490: 63 61 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67  cateSpace(MemPag
c4a0: 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42  e *pPage, int nB
c4b0: 79 74 65 2c 20 69 6e 74 20 2a 70 49 64 78 29 7b  yte, int *pIdx){
c4c0: 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 68 64 72  .  const int hdr
c4d0: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
c4e0: 73 65 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c  set;    /* Local
c4f0: 20 63 61 63 68 65 20 6f 66 20 70 50 61 67 65 2d   cache of pPage-
c500: 3e 68 64 72 4f 66 66 73 65 74 20 2a 2f 0a 20 20  >hdrOffset */.  
c510: 75 38 20 2a 20 63 6f 6e 73 74 20 64 61 74 61 20  u8 * const data 
c520: 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 20  = pPage->aData; 
c530: 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61       /* Local ca
c540: 63 68 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44  che of pPage->aD
c550: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 70  ata */.  int top
c560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c580: 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 63   First byte of c
c590: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
c5a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
c5b0: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
c5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
c5d0: 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
c5e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 67 61 70 3b 20  e */.  int gap; 
c5f0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
c600: 62 79 74 65 20 6f 66 20 67 61 70 20 62 65 74 77  byte of gap betw
c610: 65 65 6e 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  een cell pointer
c620: 73 20 61 6e 64 20 63 65 6c 6c 20 63 6f 6e 74 65  s and cell conte
c630: 6e 74 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  nt */.  .  asser
c640: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
c650: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
c660: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
c670: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
c680: 42 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Bt );.  assert( 
c690: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c6a0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
c6b0: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
c6c0: 74 28 20 6e 42 79 74 65 3e 3d 30 20 29 3b 20 20  t( nByte>=0 );  
c6d0: 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20  /* Minimum cell 
c6e0: 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20 20 61  size is 4 */.  a
c6f0: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46  ssert( pPage->nF
c700: 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b 0a 20 20  ree>=nByte );.  
c710: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
c720: 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
c730: 20 61 73 73 65 72 74 28 20 6e 42 79 74 65 20 3c   assert( nByte <
c740: 20 28 69 6e 74 29 28 70 50 61 67 65 2d 3e 70 42   (int)(pPage->pB
c750: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 38 29  t->usableSize-8)
c760: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
c770: 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
c780: 20 3d 3d 20 68 64 72 20 2b 20 31 32 20 2d 20 34   == hdr + 12 - 4
c790: 2a 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a  *pPage->leaf );.
c7a0: 20 20 67 61 70 20 3d 20 70 50 61 67 65 2d 3e 63    gap = pPage->c
c7b0: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50  ellOffset + 2*pP
c7c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73  age->nCell;.  as
c7d0: 73 65 72 74 28 20 67 61 70 3c 3d 36 35 35 33 36  sert( gap<=65536
c7e0: 20 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43   );.  /* EVIDENC
c7f0: 45 2d 4f 46 3a 20 52 2d 32 39 33 35 36 2d 30 32  E-OF: R-29356-02
c800: 33 39 31 20 49 66 20 74 68 65 20 64 61 74 61 62  391 If the datab
c810: 61 73 65 20 75 73 65 73 20 61 20 36 35 35 33 36  ase uses a 65536
c820: 2d 62 79 74 65 20 70 61 67 65 20 73 69 7a 65 0a  -byte page size.
c830: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 73    ** and the res
c840: 65 72 76 65 64 20 73 70 61 63 65 20 69 73 20 7a  erved space is z
c850: 65 72 6f 20 28 74 68 65 20 75 73 75 61 6c 20 76  ero (the usual v
c860: 61 6c 75 65 20 66 6f 72 20 72 65 73 65 72 76 65  alue for reserve
c870: 64 20 73 70 61 63 65 29 0a 20 20 2a 2a 20 74 68  d space).  ** th
c880: 65 6e 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  en the cell cont
c890: 65 6e 74 20 6f 66 66 73 65 74 20 6f 66 20 61 6e  ent offset of an
c8a0: 20 65 6d 70 74 79 20 70 61 67 65 20 77 61 6e 74   empty page want
c8b0: 73 20 74 6f 20 62 65 20 36 35 35 33 36 2e 0a 20  s to be 65536.. 
c8c0: 20 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61   ** However, tha
c8d0: 74 20 69 6e 74 65 67 65 72 20 69 73 20 74 6f 6f  t integer is too
c8e0: 20 6c 61 72 67 65 20 74 6f 20 62 65 20 73 74 6f   large to be sto
c8f0: 72 65 64 20 69 6e 20 61 20 32 2d 62 79 74 65 20  red in a 2-byte 
c900: 75 6e 73 69 67 6e 65 64 0a 20 20 2a 2a 20 69 6e  unsigned.  ** in
c910: 74 65 67 65 72 2c 20 73 6f 20 61 20 76 61 6c 75  teger, so a valu
c920: 65 20 6f 66 20 30 20 69 73 20 75 73 65 64 20 69  e of 0 is used i
c930: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 2a 2f 0a  n its place. */.
c940: 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
c950: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
c960: 20 20 61 73 73 65 72 74 28 20 74 6f 70 3c 3d 28    assert( top<=(
c970: 69 6e 74 29 70 50 61 67 65 2d 3e 70 42 74 2d 3e  int)pPage->pBt->
c980: 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 20 2f 2a  usableSize ); /*
c990: 20 50 72 65 76 65 6e 74 20 62 79 20 67 65 74 41   Prevent by getA
c9a0: 6e 64 49 6e 69 74 50 61 67 65 28 29 20 2a 2f 0a  ndInitPage() */.
c9b0: 20 20 69 66 28 20 67 61 70 3e 74 6f 70 20 29 7b    if( gap>top ){
c9c0: 0a 20 20 20 20 69 66 28 20 74 6f 70 3d 3d 30 20  .    if( top==0 
c9d0: 26 26 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  && pPage->pBt->u
c9e0: 73 61 62 6c 65 53 69 7a 65 3d 3d 36 35 35 33 36  sableSize==65536
c9f0: 20 29 7b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20   ){.      top = 
ca00: 36 35 35 33 36 3b 0a 20 20 20 20 7d 65 6c 73 65  65536;.    }else
ca10: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
ca20: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ca30: 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  PT;.    }.  }.. 
ca40: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
ca50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 62 65 74  enough space bet
ca60: 77 65 65 6e 20 67 61 70 20 61 6e 64 20 74 6f 70  ween gap and top
ca70: 20 66 6f 72 20 6f 6e 65 20 6d 6f 72 65 20 63 65   for one more ce
ca80: 6c 6c 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ll pointer.  ** 
ca90: 61 72 72 61 79 20 65 6e 74 72 79 20 6f 66 66 73  array entry offs
caa0: 65 74 2c 20 61 6e 64 20 69 66 20 74 68 65 20 66  et, and if the f
cab0: 72 65 65 6c 69 73 74 20 69 73 20 6e 6f 74 20 65  reelist is not e
cac0: 6d 70 74 79 2c 20 74 68 65 6e 20 73 65 61 72 63  mpty, then searc
cad0: 68 20 74 68 65 0a 20 20 2a 2a 20 66 72 65 65 6c  h the.  ** freel
cae0: 69 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ist looking for 
caf0: 61 20 66 72 65 65 20 73 6c 6f 74 20 62 69 67 20  a free slot big 
cb00: 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73 66  enough to satisf
cb10: 79 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 20  y the request.. 
cb20: 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
cb30: 67 61 70 2b 32 3d 3d 74 6f 70 20 29 3b 0a 20 20  gap+2==top );.  
cb40: 74 65 73 74 63 61 73 65 28 20 67 61 70 2b 31 3d  testcase( gap+1=
cb50: 3d 74 6f 70 20 29 3b 0a 20 20 74 65 73 74 63 61  =top );.  testca
cb60: 73 65 28 20 67 61 70 3d 3d 74 6f 70 20 29 3b 0a  se( gap==top );.
cb70: 20 20 69 66 28 20 28 64 61 74 61 5b 68 64 72 2b    if( (data[hdr+
cb80: 32 5d 20 7c 7c 20 64 61 74 61 5b 68 64 72 2b 31  2] || data[hdr+1
cb90: 5d 29 20 26 26 20 67 61 70 2b 32 3c 3d 74 6f 70  ]) && gap+2<=top
cba0: 20 29 7b 0a 20 20 20 20 75 38 20 2a 70 53 70 61   ){.    u8 *pSpa
cbb0: 63 65 20 3d 20 70 61 67 65 46 69 6e 64 53 6c 6f  ce = pageFindSlo
cbc0: 74 28 70 50 61 67 65 2c 20 6e 42 79 74 65 2c 20  t(pPage, nByte, 
cbd0: 26 72 63 29 3b 0a 20 20 20 20 69 66 28 20 70 53  &rc);.    if( pS
cbe0: 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 73  pace ){.      as
cbf0: 73 65 72 74 28 20 70 53 70 61 63 65 3e 3d 64 61  sert( pSpace>=da
cc00: 74 61 20 26 26 20 28 70 53 70 61 63 65 20 2d 20  ta && (pSpace - 
cc10: 64 61 74 61 29 3c 36 35 35 33 36 20 29 3b 0a 20  data)<65536 );. 
cc20: 20 20 20 20 20 2a 70 49 64 78 20 3d 20 28 69 6e       *pIdx = (in
cc30: 74 29 28 70 53 70 61 63 65 20 2d 20 64 61 74 61  t)(pSpace - data
cc40: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
cc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
cc60: 65 6c 73 65 20 69 66 28 20 72 63 20 29 7b 0a 20  else if( rc ){. 
cc70: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
cc80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
cc90: 54 68 65 20 72 65 71 75 65 73 74 20 63 6f 75 6c  The request coul
cca0: 64 20 6e 6f 74 20 62 65 20 66 75 6c 66 69 6c 6c  d not be fulfill
ccb0: 65 64 20 75 73 69 6e 67 20 61 20 66 72 65 65 6c  ed using a freel
ccc0: 69 73 74 20 73 6c 6f 74 2e 20 20 43 68 65 63 6b  ist slot.  Check
ccd0: 0a 20 20 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  .  ** to see if 
cce0: 64 65 66 72 61 67 6d 65 6e 74 61 74 69 6f 6e 20  defragmentation 
ccf0: 69 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  is necessary..  
cd00: 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 67  */.  testcase( g
cd10: 61 70 2b 32 2b 6e 42 79 74 65 3d 3d 74 6f 70 20  ap+2+nByte==top 
cd20: 29 3b 0a 20 20 69 66 28 20 67 61 70 2b 32 2b 6e  );.  if( gap+2+n
cd30: 42 79 74 65 3e 74 6f 70 20 29 7b 0a 20 20 20 20  Byte>top ){.    
cd40: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
cd50: 43 65 6c 6c 3e 30 20 7c 7c 20 43 4f 52 52 55 50  Cell>0 || CORRUP
cd60: 54 5f 44 42 20 29 3b 0a 20 20 20 20 72 63 20 3d  T_DB );.    rc =
cd70: 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28   defragmentPage(
cd80: 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
cd90: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
cda0: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
cdb0: 74 65 4e 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b  teNotZero(&data[
cdc0: 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 61 73 73  hdr+5]);.    ass
cdd0: 65 72 74 28 20 67 61 70 2b 6e 42 79 74 65 3c 3d  ert( gap+nByte<=
cde0: 74 6f 70 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  top );.  }...  /
cdf0: 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  * Allocate memor
ce00: 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20 69  y from the gap i
ce10: 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 65  n between the ce
ce20: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
ce30: 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63 65  .  ** and the ce
ce40: 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll content area.
ce50: 20 20 54 68 65 20 62 74 72 65 65 49 6e 69 74 50    The btreeInitP
ce60: 61 67 65 28 29 20 63 61 6c 6c 20 68 61 73 20 61  age() call has a
ce70: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 76 61 6c 69  lready.  ** vali
ce80: 64 61 74 65 64 20 74 68 65 20 66 72 65 65 6c 69  dated the freeli
ce90: 73 74 2e 20 20 47 69 76 65 6e 20 74 68 61 74 20  st.  Given that 
cea0: 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73 20  the freelist is 
ceb0: 76 61 6c 69 64 2c 20 74 68 65 72 65 0a 20 20 2a  valid, there.  *
cec0: 2a 20 69 73 20 6e 6f 20 77 61 79 20 74 68 61 74  * is no way that
ced0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
cee0: 63 61 6e 20 65 78 74 65 6e 64 20 6f 66 66 20 74  can extend off t
cef0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
cf00: 67 65 2e 0a 20 20 2a 2a 20 54 68 65 20 61 73 73  ge..  ** The ass
cf10: 65 72 74 28 29 20 62 65 6c 6f 77 20 76 65 72 69  ert() below veri
cf20: 66 69 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  fies the previou
cf30: 73 20 73 65 6e 74 65 6e 63 65 2e 0a 20 20 2a 2f  s sentence..  */
cf40: 0a 20 20 74 6f 70 20 2d 3d 20 6e 42 79 74 65 3b  .  top -= nByte;
cf50: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
cf60: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
cf70: 20 20 61 73 73 65 72 74 28 20 74 6f 70 2b 6e 42    assert( top+nB
cf80: 79 74 65 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  yte <= (int)pPag
cf90: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
cfa0: 7a 65 20 29 3b 0a 20 20 2a 70 49 64 78 20 3d 20  ze );.  *pIdx = 
cfb0: 74 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  top;.  return SQ
cfc0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
cfd0: 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63 74 69  * Return a secti
cfe0: 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67 65 2d  on of the pPage-
cff0: 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20 66 72  >aData to the fr
d000: 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 20 66  eelist..** The f
d010: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
d020: 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63 6b 20   new free block 
d030: 69 73 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  is pPage->aData[
d040: 69 53 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20 74  iStart].** and t
d050: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62  he size of the b
d060: 6c 6f 63 6b 20 69 73 20 69 53 69 7a 65 20 62 79  lock is iSize by
d070: 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 64 6a 61 63  tes..**.** Adjac
d080: 65 6e 74 20 66 72 65 65 62 6c 6f 63 6b 73 20 61  ent freeblocks a
d090: 72 65 20 63 6f 61 6c 65 73 63 65 64 2e 0a 2a 2a  re coalesced..**
d0a0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 65 76  .** Note that ev
d0b0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 20 66 72  en though the fr
d0c0: 65 65 62 6c 6f 63 6b 20 6c 69 73 74 20 77 61 73  eeblock list was
d0d0: 20 63 68 65 63 6b 65 64 20 62 79 20 62 74 72 65   checked by btre
d0e0: 65 49 6e 69 74 50 61 67 65 28 29 2c 0a 2a 2a 20  eInitPage(),.** 
d0f0: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 77 69 6c  that routine wil
d100: 6c 20 6e 6f 74 20 64 65 74 65 63 74 20 6f 76 65  l not detect ove
d110: 72 6c 61 70 20 62 65 74 77 65 65 6e 20 63 65 6c  rlap between cel
d120: 6c 73 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 73  ls or freeblocks
d130: 2e 20 20 4e 6f 72 0a 2a 2a 20 64 6f 65 73 20 69  .  Nor.** does i
d140: 74 20 64 65 74 65 63 74 20 63 65 6c 6c 73 20 6f  t detect cells o
d150: 72 20 66 72 65 65 62 6c 6f 63 6b 73 20 74 68 61  r freeblocks tha
d160: 74 20 65 6e 63 72 6f 75 63 68 20 69 6e 74 6f 20  t encrouch into 
d170: 74 68 65 20 72 65 73 65 72 76 65 64 20 62 79 74  the reserved byt
d180: 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e 64  es.** at the end
d190: 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20 53   of the page.  S
d1a0: 6f 20 64 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20  o do additional 
d1b0: 63 6f 72 72 75 70 74 69 6f 6e 20 63 68 65 63 6b  corruption check
d1c0: 73 20 69 6e 73 69 64 65 20 74 68 69 73 0a 2a 2a  s inside this.**
d1d0: 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 72 65 74   routine and ret
d1e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
d1f0: 50 54 20 69 66 20 61 6e 79 20 70 72 6f 62 6c 65  PT if any proble
d200: 6d 73 20 61 72 65 20 66 6f 75 6e 64 2e 0a 2a 2f  ms are found..*/
d210: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
d220: 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70  Space(MemPage *p
d230: 50 61 67 65 2c 20 75 31 36 20 69 53 74 61 72 74  Page, u16 iStart
d240: 2c 20 75 31 36 20 69 53 69 7a 65 29 7b 0a 20 20  , u16 iSize){.  
d250: 75 31 36 20 69 50 74 72 3b 20 20 20 20 20 20 20  u16 iPtr;       
d260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d270: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
d280: 20 6f 66 20 70 74 72 20 74 6f 20 6e 65 78 74 20   of ptr to next 
d290: 66 72 65 65 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75  freeblock */.  u
d2a0: 31 36 20 69 46 72 65 65 42 6c 6b 3b 20 20 20 20  16 iFreeBlk;    
d2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2c0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
d2d0: 6f 66 20 74 68 65 20 6e 65 78 74 20 66 72 65 65  of the next free
d2e0: 62 6c 6f 63 6b 20 2a 2f 0a 20 20 75 38 20 68 64  block */.  u8 hd
d2f0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d310: 20 2f 2a 20 50 61 67 65 20 68 65 61 64 65 72 20   /* Page header 
d320: 73 69 7a 65 2e 20 20 30 20 6f 72 20 31 30 30 20  size.  0 or 100 
d330: 2a 2f 0a 20 20 75 38 20 6e 46 72 61 67 20 3d 20  */.  u8 nFrag = 
d340: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
d350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
d360: 64 75 63 74 69 6f 6e 20 69 6e 20 66 72 61 67 6d  duction in fragm
d370: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 31  entation */.  u1
d380: 36 20 69 4f 72 69 67 53 69 7a 65 20 3d 20 69 53  6 iOrigSize = iS
d390: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
d3a0: 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20      /* Original 
d3b0: 76 61 6c 75 65 20 6f 66 20 69 53 69 7a 65 20 2a  value of iSize *
d3c0: 2f 0a 20 20 75 33 32 20 69 4c 61 73 74 20 3d 20  /.  u32 iLast = 
d3d0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
d3e0: 6c 65 53 69 7a 65 2d 34 3b 20 2f 2a 20 4c 61 72  leSize-4; /* Lar
d3f0: 67 65 73 74 20 70 6f 73 73 69 62 6c 65 20 66 72  gest possible fr
d400: 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74 20 2a  eeblock offset *
d410: 2f 0a 20 20 75 33 32 20 69 45 6e 64 20 3d 20 69  /.  u32 iEnd = i
d420: 53 74 61 72 74 20 2b 20 69 53 69 7a 65 3b 20 20  Start + iSize;  
d430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
d440: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
d450: 20 69 53 74 61 72 74 20 62 75 66 66 65 72 20 2a   iStart buffer *
d460: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
d470: 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d  r *data = pPage-
d480: 3e 61 44 61 74 61 3b 20 20 20 2f 2a 20 50 61 67  >aData;   /* Pag
d490: 65 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20  e content */..  
d4a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
d4b0: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
d4c0: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
d4d0: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
d4e0: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
d4f0: 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
d500: 44 42 20 7c 7c 20 69 53 74 61 72 74 3e 3d 70 50  DB || iStart>=pP
d510: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36  age->hdrOffset+6
d520: 2b 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72  +pPage->childPtr
d530: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
d540: 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
d550: 69 45 6e 64 20 3c 3d 20 70 50 61 67 65 2d 3e 70  iEnd <= pPage->p
d560: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29  Bt->usableSize )
d570: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
d580: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
d590: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
d5a0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  ) );.  assert( i
d5b0: 53 69 7a 65 3e 3d 34 20 29 3b 20 20 20 2f 2a 20  Size>=4 );   /* 
d5c0: 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a  Minimum cell siz
d5d0: 65 20 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65  e is 4 */.  asse
d5e0: 72 74 28 20 69 53 74 61 72 74 3c 3d 69 4c 61 73  rt( iStart<=iLas
d5f0: 74 20 29 3b 0a 0a 20 20 2f 2a 20 4f 76 65 72 77  t );..  /* Overw
d600: 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
d610: 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
d620: 72 6f 73 20 77 68 65 6e 20 74 68 65 20 73 65 63  ros when the sec
d630: 75 72 65 5f 64 65 6c 65 74 65 0a 20 20 2a 2a 20  ure_delete.  ** 
d640: 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
d650: 64 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  d */.  if( pPage
d660: 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20  ->pBt->btsFlags 
d670: 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c  & BTS_SECURE_DEL
d680: 45 54 45 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  ETE ){.    memse
d690: 74 28 26 64 61 74 61 5b 69 53 74 61 72 74 5d 2c  t(&data[iStart],
d6a0: 20 30 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a   0, iSize);.  }.
d6b0: 0a 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 6f  .  /* The list o
d6c0: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 6d 75 73  f freeblocks mus
d6d0: 74 20 62 65 20 69 6e 20 61 73 63 65 6e 64 69 6e  t be in ascendin
d6e0: 67 20 6f 72 64 65 72 2e 20 20 46 69 6e 64 20 74  g order.  Find t
d6f0: 68 65 20 0a 20 20 2a 2a 20 73 70 6f 74 20 6f 6e  he .  ** spot on
d700: 20 74 68 65 20 6c 69 73 74 20 77 68 65 72 65 20   the list where 
d710: 69 53 74 61 72 74 20 73 68 6f 75 6c 64 20 62 65  iStart should be
d720: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
d730: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
d740: 64 72 4f 66 66 73 65 74 3b 0a 20 20 69 50 74 72  drOffset;.  iPtr
d750: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 69 66   = hdr + 1;.  if
d760: 28 20 64 61 74 61 5b 69 50 74 72 2b 31 5d 3d 3d  ( data[iPtr+1]==
d770: 30 20 26 26 20 64 61 74 61 5b 69 50 74 72 5d 3d  0 && data[iPtr]=
d780: 3d 30 20 29 7b 0a 20 20 20 20 69 46 72 65 65 42  =0 ){.    iFreeB
d790: 6c 6b 20 3d 20 30 3b 20 20 2f 2a 20 53 68 6f 72  lk = 0;  /* Shor
d7a0: 74 63 75 74 20 66 6f 72 20 74 68 65 20 63 61 73  tcut for the cas
d7b0: 65 20 77 68 65 6e 20 74 68 65 20 66 72 65 65 6c  e when the freel
d7c0: 69 73 74 20 69 73 20 65 6d 70 74 79 20 2a 2f 0a  ist is empty */.
d7d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69    }else{.    whi
d7e0: 6c 65 28 20 28 69 46 72 65 65 42 6c 6b 20 3d 20  le( (iFreeBlk = 
d7f0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
d800: 50 74 72 5d 29 29 3c 69 53 74 61 72 74 20 29 7b  Ptr]))<iStart ){
d810: 0a 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65  .      if( iFree
d820: 42 6c 6b 3c 69 50 74 72 2b 34 20 29 7b 0a 20 20  Blk<iPtr+4 ){.  
d830: 20 20 20 20 20 20 69 66 28 20 69 46 72 65 65 42        if( iFreeB
d840: 6c 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  lk==0 ) break;. 
d850: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
d860: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
d870: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
d880: 20 69 50 74 72 20 3d 20 69 46 72 65 65 42 6c 6b   iPtr = iFreeBlk
d890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d8a0: 69 46 72 65 65 42 6c 6b 3e 69 4c 61 73 74 20 29  iFreeBlk>iLast )
d8b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
d8c0: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
d8d0: 20 61 73 73 65 72 74 28 20 69 46 72 65 65 42 6c   assert( iFreeBl
d8e0: 6b 3e 69 50 74 72 20 7c 7c 20 69 46 72 65 65 42  k>iPtr || iFreeB
d8f0: 6c 6b 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 20 20  lk==0 );.  .    
d900: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
d910: 3a 0a 20 20 20 20 2a 2a 20 20 20 20 69 46 72 65  :.    **    iFre
d920: 65 42 6c 6b 3a 20 20 20 46 69 72 73 74 20 66 72  eBlk:   First fr
d930: 65 65 62 6c 6f 63 6b 20 61 66 74 65 72 20 69 53  eeblock after iS
d940: 74 61 72 74 2c 20 6f 72 20 7a 65 72 6f 20 69 66  tart, or zero if
d950: 20 6e 6f 6e 65 0a 20 20 20 20 2a 2a 20 20 20 20   none.    **    
d960: 69 50 74 72 3a 20 20 20 20 20 20 20 54 68 65 20  iPtr:       The 
d970: 61 64 64 72 65 73 73 20 6f 66 20 61 20 70 6f 69  address of a poi
d980: 6e 74 65 72 20 74 6f 20 69 46 72 65 65 42 6c 6b  nter to iFreeBlk
d990: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
d9a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
d9b0: 46 72 65 65 42 6c 6b 20 73 68 6f 75 6c 64 20 62  FreeBlk should b
d9c0: 65 20 63 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f  e coalesced onto
d9d0: 20 74 68 65 20 65 6e 64 20 6f 66 20 69 53 74 61   the end of iSta
d9e0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
d9f0: 66 28 20 69 46 72 65 65 42 6c 6b 20 26 26 20 69  f( iFreeBlk && i
da00: 45 6e 64 2b 33 3e 3d 69 46 72 65 65 42 6c 6b 20  End+3>=iFreeBlk 
da10: 29 7b 0a 20 20 20 20 20 20 6e 46 72 61 67 20 3d  ){.      nFrag =
da20: 20 69 46 72 65 65 42 6c 6b 20 2d 20 69 45 6e 64   iFreeBlk - iEnd
da30: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e 64  ;.      if( iEnd
da40: 3e 69 46 72 65 65 42 6c 6b 20 29 20 72 65 74 75  >iFreeBlk ) retu
da50: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
da60: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 69 45  T_BKPT;.      iE
da70: 6e 64 20 3d 20 69 46 72 65 65 42 6c 6b 20 2b 20  nd = iFreeBlk + 
da80: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 69  get2byte(&data[i
da90: 46 72 65 65 42 6c 6b 2b 32 5d 29 3b 0a 20 20 20  FreeBlk+2]);.   
daa0: 20 20 20 69 66 28 20 69 45 6e 64 20 3e 20 70 50     if( iEnd > pP
dab0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
dac0: 53 69 7a 65 20 29 20 72 65 74 75 72 6e 20 53 51  Size ) return SQ
dad0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
dae0: 54 3b 0a 20 20 20 20 20 20 69 53 69 7a 65 20 3d  T;.      iSize =
daf0: 20 69 45 6e 64 20 2d 20 69 53 74 61 72 74 3b 0a   iEnd - iStart;.
db00: 20 20 20 20 20 20 69 46 72 65 65 42 6c 6b 20 3d        iFreeBlk =
db10: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
db20: 69 46 72 65 65 42 6c 6b 5d 29 3b 0a 20 20 20 20  iFreeBlk]);.    
db30: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 69  }.  .    /* If i
db40: 50 74 72 20 69 73 20 61 6e 6f 74 68 65 72 20 66  Ptr is another f
db50: 72 65 65 62 6c 6f 63 6b 20 28 74 68 61 74 20 69  reeblock (that i
db60: 73 2c 20 69 66 20 69 50 74 72 20 69 73 20 6e 6f  s, if iPtr is no
db70: 74 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  t the freelist. 
db80: 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e     ** pointer in
db90: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
dba0: 29 20 74 68 65 6e 20 63 68 65 63 6b 20 74 6f 20  ) then check to 
dbb0: 73 65 65 20 69 66 20 69 53 74 61 72 74 20 73 68  see if iStart sh
dbc0: 6f 75 6c 64 20 62 65 0a 20 20 20 20 2a 2a 20 63  ould be.    ** c
dbd0: 6f 61 6c 65 73 63 65 64 20 6f 6e 74 6f 20 74 68  oalesced onto th
dbe0: 65 20 65 6e 64 20 6f 66 20 69 50 74 72 2e 0a 20  e end of iPtr.. 
dbf0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50     */.    if( iP
dc00: 74 72 3e 68 64 72 2b 31 20 29 7b 0a 20 20 20 20  tr>hdr+1 ){.    
dc10: 20 20 69 6e 74 20 69 50 74 72 45 6e 64 20 3d 20    int iPtrEnd = 
dc20: 69 50 74 72 20 2b 20 67 65 74 32 62 79 74 65 28  iPtr + get2byte(
dc30: 26 64 61 74 61 5b 69 50 74 72 2b 32 5d 29 3b 0a  &data[iPtr+2]);.
dc40: 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45 6e        if( iPtrEn
dc50: 64 2b 33 3e 3d 69 53 74 61 72 74 20 29 7b 0a 20  d+3>=iStart ){. 
dc60: 20 20 20 20 20 20 20 69 66 28 20 69 50 74 72 45         if( iPtrE
dc70: 6e 64 3e 69 53 74 61 72 74 20 29 20 72 65 74 75  nd>iStart ) retu
dc80: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
dc90: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
dca0: 6e 46 72 61 67 20 2b 3d 20 69 53 74 61 72 74 20  nFrag += iStart 
dcb0: 2d 20 69 50 74 72 45 6e 64 3b 0a 20 20 20 20 20  - iPtrEnd;.     
dcc0: 20 20 20 69 53 69 7a 65 20 3d 20 69 45 6e 64 20     iSize = iEnd 
dcd0: 2d 20 69 50 74 72 3b 0a 20 20 20 20 20 20 20 20  - iPtr;.        
dce0: 69 53 74 61 72 74 20 3d 20 69 50 74 72 3b 0a 20  iStart = iPtr;. 
dcf0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
dd00: 20 69 66 28 20 6e 46 72 61 67 3e 64 61 74 61 5b   if( nFrag>data[
dd10: 68 64 72 2b 37 5d 20 29 20 72 65 74 75 72 6e 20  hdr+7] ) return 
dd20: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
dd30: 4b 50 54 3b 0a 20 20 20 20 64 61 74 61 5b 68 64  KPT;.    data[hd
dd40: 72 2b 37 5d 20 2d 3d 20 6e 46 72 61 67 3b 0a 20  r+7] -= nFrag;. 
dd50: 20 7d 0a 20 20 69 66 28 20 69 53 74 61 72 74 3d   }.  if( iStart=
dd60: 3d 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b  =get2byte(&data[
dd70: 68 64 72 2b 35 5d 29 20 29 7b 0a 20 20 20 20 2f  hdr+5]) ){.    /
dd80: 2a 20 54 68 65 20 6e 65 77 20 66 72 65 65 62 6c  * The new freebl
dd90: 6f 63 6b 20 69 73 20 61 74 20 74 68 65 20 62 65  ock is at the be
dda0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
ddb0: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
ddc0: 2c 0a 20 20 20 20 2a 2a 20 73 6f 20 6a 75 73 74  ,.    ** so just
ddd0: 20 65 78 74 65 6e 64 20 74 68 65 20 63 65 6c 6c   extend the cell
dde0: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 72 61   content area ra
ddf0: 74 68 65 72 20 74 68 61 6e 20 63 72 65 61 74 65  ther than create
de00: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20   another.    ** 
de10: 66 72 65 65 6c 69 73 74 20 65 6e 74 72 79 20 2a  freelist entry *
de20: 2f 0a 20 20 20 20 69 66 28 20 69 50 74 72 21 3d  /.    if( iPtr!=
de30: 68 64 72 2b 31 20 29 20 72 65 74 75 72 6e 20 53  hdr+1 ) return S
de40: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
de50: 50 54 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  PT;.    put2byte
de60: 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 69  (&data[hdr+1], i
de70: 46 72 65 65 42 6c 6b 29 3b 0a 20 20 20 20 70 75  FreeBlk);.    pu
de80: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
de90: 2b 35 5d 2c 20 69 45 6e 64 29 3b 0a 20 20 7d 65  +5], iEnd);.  }e
dea0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 73 65  lse{.    /* Inse
deb0: 72 74 20 74 68 65 20 6e 65 77 20 66 72 65 65 62  rt the new freeb
dec0: 6c 6f 63 6b 20 69 6e 74 6f 20 74 68 65 20 66 72  lock into the fr
ded0: 65 65 6c 69 73 74 20 2a 2f 0a 20 20 20 20 70 75  eelist */.    pu
dee0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 50 74  t2byte(&data[iPt
def0: 72 5d 2c 20 69 53 74 61 72 74 29 3b 0a 20 20 20  r], iStart);.   
df00: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
df10: 69 53 74 61 72 74 5d 2c 20 69 46 72 65 65 42 6c  iStart], iFreeBl
df20: 6b 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  k);.    put2byte
df30: 28 26 64 61 74 61 5b 69 53 74 61 72 74 2b 32 5d  (&data[iStart+2]
df40: 2c 20 69 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  , iSize);.  }.  
df50: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
df60: 69 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72 65 74  iOrigSize;.  ret
df70: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
df80: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 74  ../*.** Decode t
df90: 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28 74  he flags byte (t
dfa0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
dfb0: 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f 72   the header) for
dfc0: 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20 69   a page.** and i
dfd0: 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64 73  nitialize fields
dfe0: 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65 20   of the MemPage 
dff0: 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72 64  structure accord
e000: 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c  ingly..**.** Onl
e010: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
e020: 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65  combinations are
e030: 20 73 75 70 70 6f 72 74 65 64 2e 20 20 41 6e 79   supported.  Any
e040: 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  thing different.
e050: 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 61 20 63  ** indicates a c
e060: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20  orrupt database 
e070: 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  files:.**.**    
e080: 20 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54       PTF_ZERODAT
e090: 41 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46  A.**         PTF
e0a0: 5f 5a 45 52 4f 44 41 54 41 20 7c 20 50 54 46 5f  _ZERODATA | PTF_
e0b0: 4c 45 41 46 0a 2a 2a 20 20 20 20 20 20 20 20 20  LEAF.**         
e0c0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50  PTF_LEAFDATA | P
e0d0: 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a 20 20 20 20  TF_INTKEY.**    
e0e0: 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54       PTF_LEAFDAT
e0f0: 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 20 7c  A | PTF_INTKEY |
e100: 20 50 54 46 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61   PTF_LEAF.*/.sta
e110: 74 69 63 20 69 6e 74 20 64 65 63 6f 64 65 46 6c  tic int decodeFl
e120: 61 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ags(MemPage *pPa
e130: 67 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65  ge, int flagByte
e140: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
e150: 42 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70  Bt;     /* A cop
e160: 79 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20  y of pPage->pBt 
e170: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
e180: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d  age->hdrOffset==
e190: 28 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20  (pPage->pgno==1 
e1a0: 3f 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20  ? 100 : 0) );.  
e1b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e1c0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
e1d0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
e1e0: 0a 20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d  .  pPage->leaf =
e1f0: 20 28 75 38 29 28 66 6c 61 67 42 79 74 65 3e 3e   (u8)(flagByte>>
e200: 33 29 3b 20 20 61 73 73 65 72 74 28 20 50 54 46  3);  assert( PTF
e210: 5f 4c 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b  _LEAF == 1<<3 );
e220: 0a 20 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e  .  flagByte &= ~
e230: 50 54 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67  PTF_LEAF;.  pPag
e240: 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20  e->childPtrSize 
e250: 3d 20 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61  = 4-4*pPage->lea
e260: 66 3b 0a 20 20 70 50 61 67 65 2d 3e 78 43 65 6c  f;.  pPage->xCel
e270: 6c 53 69 7a 65 20 3d 20 63 65 6c 6c 53 69 7a 65  lSize = cellSize
e280: 50 74 72 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  Ptr;.  pBt = pPa
e290: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
e2a0: 6c 61 67 42 79 74 65 3d 3d 28 50 54 46 5f 4c 45  lagByte==(PTF_LE
e2b0: 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54  AFDATA | PTF_INT
e2c0: 4b 45 59 29 20 29 7b 0a 20 20 20 20 2f 2a 20 45  KEY) ){.    /* E
e2d0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 37  VIDENCE-OF: R-07
e2e0: 32 39 31 2d 33 35 33 32 38 20 41 20 76 61 6c 75  291-35328 A valu
e2f0: 65 20 6f 66 20 35 20 28 30 78 30 35 29 20 6d 65  e of 5 (0x05) me
e300: 61 6e 73 20 74 68 65 20 70 61 67 65 20 69 73 20  ans the page is 
e310: 61 6e 0a 20 20 20 20 2a 2a 20 69 6e 74 65 72 69  an.    ** interi
e320: 6f 72 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20  or table b-tree 
e330: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
e340: 65 72 74 28 20 28 50 54 46 5f 4c 45 41 46 44 41  ert( (PTF_LEAFDA
e350: 54 41 7c 50 54 46 5f 49 4e 54 4b 45 59 29 3d 3d  TA|PTF_INTKEY)==
e360: 35 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  5 );.    /* EVID
e370: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 36 39 30 30  ENCE-OF: R-26900
e380: 2d 30 39 31 37 36 20 41 20 76 61 6c 75 65 20 6f  -09176 A value o
e390: 66 20 31 33 20 28 30 78 30 64 29 20 6d 65 61 6e  f 13 (0x0d) mean
e3a0: 73 20 74 68 65 20 70 61 67 65 20 69 73 20 61 0a  s the page is a.
e3b0: 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 61 62 6c      ** leaf tabl
e3c0: 65 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  e b-tree page. *
e3d0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e3e0: 54 46 5f 4c 45 41 46 44 41 54 41 7c 50 54 46 5f  TF_LEAFDATA|PTF_
e3f0: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 29  INTKEY|PTF_LEAF)
e400: 3d 3d 31 33 20 29 3b 0a 20 20 20 20 70 50 61 67  ==13 );.    pPag
e410: 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 31 3b 0a 20  e->intKey = 1;. 
e420: 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65     if( pPage->le
e430: 61 66 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  af ){.      pPag
e440: 65 2d 3e 69 6e 74 4b 65 79 4c 65 61 66 20 3d 20  e->intKeyLeaf = 
e450: 31 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  1;.      pPage->
e460: 78 50 61 72 73 65 43 65 6c 6c 20 3d 20 62 74 72  xParseCell = btr
e470: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 3b 0a  eeParseCellPtr;.
e480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e490: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65   pPage->intKeyLe
e4a0: 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  af = 0;.      pP
e4b0: 61 67 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 20 3d  age->xCellSize =
e4c0: 20 63 65 6c 6c 53 69 7a 65 50 74 72 4e 6f 50 61   cellSizePtrNoPa
e4d0: 79 6c 6f 61 64 3b 0a 20 20 20 20 20 20 70 50 61  yload;.      pPa
e4e0: 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 20 3d  ge->xParseCell =
e4f0: 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
e500: 74 72 4e 6f 50 61 79 6c 6f 61 64 3b 0a 20 20 20  trNoPayload;.   
e510: 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61   }.    pPage->ma
e520: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
e530: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
e540: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
e550: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
e560: 73 65 20 69 66 28 20 66 6c 61 67 42 79 74 65 3d  se if( flagByte=
e570: 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 29 7b  =PTF_ZERODATA ){
e580: 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
e590: 2d 4f 46 3a 20 52 2d 34 33 33 31 36 2d 33 37 33  -OF: R-43316-373
e5a0: 30 38 20 41 20 76 61 6c 75 65 20 6f 66 20 32 20  08 A value of 2 
e5b0: 28 30 78 30 32 29 20 6d 65 61 6e 73 20 74 68 65  (0x02) means the
e5c0: 20 70 61 67 65 20 69 73 20 61 6e 0a 20 20 20 20   page is an.    
e5d0: 2a 2a 20 69 6e 74 65 72 69 6f 72 20 69 6e 64 65  ** interior inde
e5e0: 78 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a  x b-tree page. *
e5f0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 50  /.    assert( (P
e600: 54 46 5f 5a 45 52 4f 44 41 54 41 29 3d 3d 32 20  TF_ZERODATA)==2 
e610: 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  );.    /* EVIDEN
e620: 43 45 2d 4f 46 3a 20 52 2d 35 39 36 31 35 2d 34  CE-OF: R-59615-4
e630: 32 38 32 38 20 41 20 76 61 6c 75 65 20 6f 66 20  2828 A value of 
e640: 31 30 20 28 30 78 30 61 29 20 6d 65 61 6e 73 20  10 (0x0a) means 
e650: 74 68 65 20 70 61 67 65 20 69 73 20 61 0a 20 20  the page is a.  
e660: 20 20 2a 2a 20 6c 65 61 66 20 69 6e 64 65 78 20    ** leaf index 
e670: 62 2d 74 72 65 65 20 70 61 67 65 2e 20 2a 2f 0a  b-tree page. */.
e680: 20 20 20 20 61 73 73 65 72 74 28 20 28 50 54 46      assert( (PTF
e690: 5f 5a 45 52 4f 44 41 54 41 7c 50 54 46 5f 4c 45  _ZERODATA|PTF_LE
e6a0: 41 46 29 3d 3d 31 30 20 29 3b 0a 20 20 20 20 70  AF)==10 );.    p
e6b0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
e6c0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74  ;.    pPage->int
e6d0: 4b 65 79 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  KeyLeaf = 0;.   
e6e0: 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65   pPage->xParseCe
e6f0: 6c 6c 20 3d 20 62 74 72 65 65 50 61 72 73 65 43  ll = btreeParseC
e700: 65 6c 6c 50 74 72 49 6e 64 65 78 3b 0a 20 20 20  ellPtrIndex;.   
e710: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
e720: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
e730: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
e740: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
e750: 4c 6f 63 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Local;.  }else{.
e760: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
e770: 4f 46 3a 20 52 2d 34 37 36 30 38 2d 35 36 34 36  OF: R-47608-5646
e780: 39 20 41 6e 79 20 6f 74 68 65 72 20 76 61 6c 75  9 Any other valu
e790: 65 20 66 6f 72 20 74 68 65 20 62 2d 74 72 65 65  e for the b-tree
e7a0: 20 70 61 67 65 20 74 79 70 65 20 69 73 0a 20 20   page type is.  
e7b0: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 2a    ** an error. *
e7c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
e7d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
e7e0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6d  ;.  }.  pPage->m
e7f0: 61 78 31 62 79 74 65 50 61 79 6c 6f 61 64 20 3d  ax1bytePayload =
e800: 20 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61   pBt->max1bytePa
e810: 79 6c 6f 61 64 3b 0a 20 20 72 65 74 75 72 6e 20  yload;.  return 
e820: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
e830: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
e840: 68 65 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66  he auxiliary inf
e850: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 64  ormation for a d
e860: 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  isk block..**.**
e870: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
e880: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  K on success.  I
e890: 66 20 77 65 20 73 65 65 20 74 68 61 74 20 74 68  f we see that th
e8a0: 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a 20 6e  e page does.** n
e8b0: 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77 65 6c  ot contain a wel
e8c0: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
e8d0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72 65 74  e page, then ret
e8e0: 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43  urn .** SQLITE_C
e8f0: 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20 74 68  ORRUPT.  Note th
e900: 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66 20 53  at a return of S
e910: 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20 6e 6f  QLITE_OK does no
e920: 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65 20 74  t.** guarantee t
e930: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
e940: 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20 49 74  well-formed.  It
e950: 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68 61 74   only shows that
e960: 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20 74 6f  .** we failed to
e970: 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f 72 72   detect any corr
e980: 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
e990: 63 20 69 6e 74 20 62 74 72 65 65 49 6e 69 74 50  c int btreeInitP
e9a0: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
e9b0: 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge){..  assert( 
e9c0: 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b  pPage->pBt!=0 );
e9d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
e9e0: 2d 3e 70 42 74 2d 3e 64 62 21 3d 30 20 29 3b 0a  ->pBt->db!=0 );.
e9f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ea00: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
ea10: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
ea20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
ea30: 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c 69 74 65  ge->pgno==sqlite
ea40: 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
ea50: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
ea60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
ea70: 61 67 65 20 3d 3d 20 73 71 6c 69 74 65 33 50 61  age == sqlite3Pa
ea80: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ea90: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
eaa0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
eab0: 61 44 61 74 61 20 3d 3d 20 73 71 6c 69 74 65 33  aData == sqlite3
eac0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ead0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
eae0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69  .  if( !pPage->i
eaf0: 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 75 31 36  sInit ){.    u16
eb00: 20 70 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   pc;            
eb10: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20  /* Address of a 
eb20: 66 72 65 65 62 6c 6f 63 6b 20 77 69 74 68 69 6e  freeblock within
eb30: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 20   pPage->aData[] 
eb40: 2a 2f 0a 20 20 20 20 75 38 20 68 64 72 3b 20 20  */.    u8 hdr;  
eb50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
eb60: 73 65 74 20 74 6f 20 62 65 67 69 6e 6e 69 6e 67  set to beginning
eb70: 20 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20   of page header 
eb80: 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61 74 61 3b  */.    u8 *data;
eb90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 71 75            /* Equ
eba0: 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e 61 44 61  al to pPage->aDa
ebb0: 74 61 20 2a 2f 0a 20 20 20 20 42 74 53 68 61 72  ta */.    BtShar
ebc0: 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
ebd0: 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62 74 72 65  /* The main btre
ebe0: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
ebf0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
ec00: 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74 20  e;    /* Amount 
ec10: 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65 20  of usable space 
ec20: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f 0a  on each page */.
ec30: 20 20 20 20 75 31 36 20 63 65 6c 6c 4f 66 66 73      u16 cellOffs
ec40: 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  et;    /* Offset
ec50: 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70   from start of p
ec60: 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c  age to first cel
ec70: 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 20  l pointer */.   
ec80: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ec90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
eca0: 20 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e   unused bytes on
ecb0: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20   the page */.   
ecc0: 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
ecd0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
ece0: 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  e of the cell co
ecf0: 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20  ntent area */.  
ed00: 20 20 69 6e 74 20 69 43 65 6c 6c 46 69 72 73 74    int iCellFirst
ed10: 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 6c  ;    /* First al
ed20: 6c 6f 77 61 62 6c 65 20 63 65 6c 6c 20 6f 72 20  lowable cell or 
ed30: 66 72 65 65 62 6c 6f 63 6b 20 6f 66 66 73 65 74  freeblock offset
ed40: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 65 6c   */.    int iCel
ed50: 6c 4c 61 73 74 3b 20 20 20 20 20 2f 2a 20 4c 61  lLast;     /* La
ed60: 73 74 20 70 6f 73 73 69 62 6c 65 20 63 65 6c 6c  st possible cell
ed70: 20 6f 72 20 66 72 65 65 62 6c 6f 63 6b 20 6f 66   or freeblock of
ed80: 66 73 65 74 20 2a 2f 0a 0a 20 20 20 20 70 42 74  fset */..    pBt
ed90: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 0a   = pPage->pBt;..
eda0: 20 20 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d      hdr = pPage-
edb0: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 20 20  >hdrOffset;.    
edc0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
edd0: 61 74 61 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ata;.    /* EVID
ede0: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 35 39 34  ENCE-OF: R-28594
edf0: 2d 30 32 38 39 30 20 54 68 65 20 6f 6e 65 2d 62  -02890 The one-b
ee00: 79 74 65 20 66 6c 61 67 20 61 74 20 6f 66 66 73  yte flag at offs
ee10: 65 74 20 30 20 69 6e 64 69 63 61 74 69 6e 67 0a  et 0 indicating.
ee20: 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65      ** the b-tre
ee30: 65 20 70 61 67 65 20 74 79 70 65 2e 20 2a 2f 0a  e page type. */.
ee40: 20 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c      if( decodeFl
ee50: 61 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b  ags(pPage, data[
ee60: 68 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53  hdr]) ) return S
ee70: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
ee80: 50 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  PT;.    assert( 
ee90: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
eea0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
eeb0: 69 7a 65 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20  ize<=65536 );.  
eec0: 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67    pPage->maskPag
eed0: 65 20 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 70  e = (u16)(pBt->p
eee0: 61 67 65 53 69 7a 65 20 2d 20 31 29 3b 0a 20 20  ageSize - 1);.  
eef0: 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
ef00: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 75 73 61 62  ow = 0;.    usab
ef10: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
ef20: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 70 50  ableSize;.    pP
ef30: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20  age->cellOffset 
ef40: 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68  = cellOffset = h
ef50: 64 72 20 2b 20 38 20 2b 20 70 50 61 67 65 2d 3e  dr + 8 + pPage->
ef60: 63 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20  childPtrSize;.  
ef70: 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 45 6e    pPage->aDataEn
ef80: 64 20 3d 20 26 64 61 74 61 5b 75 73 61 62 6c 65  d = &data[usable
ef90: 53 69 7a 65 5d 3b 0a 20 20 20 20 70 50 61 67 65  Size];.    pPage
efa0: 2d 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61  ->aCellIdx = &da
efb0: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 0a  ta[cellOffset];.
efc0: 20 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61      pPage->aData
efd0: 4f 66 73 74 20 3d 20 26 64 61 74 61 5b 70 50 61  Ofst = &data[pPa
efe0: 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65  ge->childPtrSize
eff0: 5d 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ];.    /* EVIDEN
f000: 43 45 2d 4f 46 3a 20 52 2d 35 38 30 31 35 2d 34  CE-OF: R-58015-4
f010: 38 31 37 35 20 54 68 65 20 74 77 6f 2d 62 79 74  8175 The two-byt
f020: 65 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  e integer at off
f030: 73 65 74 20 35 20 64 65 73 69 67 6e 61 74 65 73  set 5 designates
f040: 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 72  .    ** the star
f050: 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  t of the cell co
f060: 6e 74 65 6e 74 20 61 72 65 61 2e 20 41 20 7a 65  ntent area. A ze
f070: 72 6f 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ro value for thi
f080: 73 20 69 6e 74 65 67 65 72 20 69 73 0a 20 20 20  s integer is.   
f090: 20 2a 2a 20 69 6e 74 65 72 70 72 65 74 65 64 20   ** interpreted 
f0a0: 61 73 20 36 35 35 33 36 2e 20 2a 2f 0a 20 20 20  as 65536. */.   
f0b0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 4e   top = get2byteN
f0c0: 6f 74 5a 65 72 6f 28 26 64 61 74 61 5b 68 64 72  otZero(&data[hdr
f0d0: 2b 35 5d 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49  +5]);.    /* EVI
f0e0: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 30 30  DENCE-OF: R-3700
f0f0: 32 2d 33 32 37 37 34 20 54 68 65 20 74 77 6f 2d  2-32774 The two-
f100: 62 79 74 65 20 69 6e 74 65 67 65 72 20 61 74 20  byte integer at 
f110: 6f 66 66 73 65 74 20 33 20 67 69 76 65 73 20 74  offset 3 gives t
f120: 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
f130: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
f140: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 70 50   page. */.    pP
f150: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 67 65 74  age->nCell = get
f160: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
f170: 33 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  3]);.    if( pPa
f180: 67 65 2d 3e 6e 43 65 6c 6c 3e 4d 58 5f 43 45 4c  ge->nCell>MX_CEL
f190: 4c 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  L(pBt) ){.      
f1a0: 2f 2a 20 54 6f 20 6d 61 6e 79 20 63 65 6c 6c 73  /* To many cells
f1b0: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 70 61   for a single pa
f1c0: 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 6d 75  ge.  The page mu
f1d0: 73 74 20 62 65 20 63 6f 72 72 75 70 74 20 2a 2f  st be corrupt */
f1e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
f1f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
f200: 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  T;.    }.    tes
f210: 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 43  tcase( pPage->nC
f220: 65 6c 6c 3d 3d 4d 58 5f 43 45 4c 4c 28 70 42 74  ell==MX_CELL(pBt
f230: 29 20 29 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44  ) );.    /* EVID
f240: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 38 39  ENCE-OF: R-24089
f250: 2d 35 37 39 37 39 20 49 66 20 61 20 70 61 67 65  -57979 If a page
f260: 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c   contains no cel
f270: 6c 73 20 28 77 68 69 63 68 20 69 73 20 6f 6e 6c  ls (which is onl
f280: 79 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  y.    ** possibl
f290: 65 20 66 6f 72 20 61 20 72 6f 6f 74 20 70 61 67  e for a root pag
f2a0: 65 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61  e of a table tha
f2b0: 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f  t contains no ro
f2c0: 77 73 29 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ws) then the.   
f2d0: 20 2a 2a 20 6f 66 66 73 65 74 20 74 6f 20 74 68   ** offset to th
f2e0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
f2f0: 72 65 61 20 77 69 6c 6c 20 65 71 75 61 6c 20 74  rea will equal t
f300: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 69 6e  he page size min
f310: 75 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 62 79  us the.    ** by
f320: 74 65 73 20 6f 66 20 72 65 73 65 72 76 65 64 20  tes of reserved 
f330: 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 73  space. */.    as
f340: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
f350: 6c 6c 3e 30 20 7c 7c 20 74 6f 70 3d 3d 75 73 61  ll>0 || top==usa
f360: 62 6c 65 53 69 7a 65 20 7c 7c 20 43 4f 52 52 55  bleSize || CORRU
f370: 50 54 5f 44 42 20 29 3b 0a 0a 20 20 20 20 2f 2a  PT_DB );..    /*
f380: 20 41 20 6d 61 6c 66 6f 72 6d 65 64 20 64 61 74   A malformed dat
f390: 61 62 61 73 65 20 70 61 67 65 20 6d 69 67 68 74  abase page might
f3a0: 20 63 61 75 73 65 20 75 73 20 74 6f 20 72 65 61   cause us to rea
f3b0: 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 0a 20  d past the end. 
f3c0: 20 20 20 2a 2a 20 6f 66 20 70 61 67 65 20 77 68     ** of page wh
f3d0: 65 6e 20 70 61 72 73 69 6e 67 20 61 20 63 65 6c  en parsing a cel
f3e0: 6c 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  l.  .    **.    
f3f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
f400: 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 63   block of code c
f410: 68 65 63 6b 73 20 65 61 72 6c 79 20 74 6f 20 73  hecks early to s
f420: 65 65 20 69 66 20 61 20 63 65 6c 6c 20 65 78 74  ee if a cell ext
f430: 65 6e 64 73 0a 20 20 20 20 2a 2a 20 70 61 73 74  ends.    ** past
f440: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 70 61   the end of a pa
f450: 67 65 20 62 6f 75 6e 64 61 72 79 20 61 6e 64 20  ge boundary and 
f460: 63 61 75 73 65 73 20 53 51 4c 49 54 45 5f 43 4f  causes SQLITE_CO
f470: 52 52 55 50 54 20 74 6f 20 62 65 20 0a 20 20 20  RRUPT to be .   
f480: 20 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 66 20   ** returned if 
f490: 69 74 20 64 6f 65 73 2e 0a 20 20 20 20 2a 2f 0a  it does..    */.
f4a0: 20 20 20 20 69 43 65 6c 6c 46 69 72 73 74 20 3d      iCellFirst =
f4b0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
f4c0: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20  pPage->nCell;.  
f4d0: 20 20 69 43 65 6c 6c 4c 61 73 74 20 3d 20 75 73    iCellLast = us
f4e0: 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
f4f0: 20 20 69 66 28 20 70 42 74 2d 3e 64 62 2d 3e 66    if( pBt->db->f
f500: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 43 65  lags & SQLITE_Ce
f510: 6c 6c 53 69 7a 65 43 6b 20 29 7b 0a 20 20 20 20  llSizeCk ){.    
f520: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f530: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74      /* Index int
f540: 6f 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74  o the cell point
f550: 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  er array */.    
f560: 20 20 69 6e 74 20 73 7a 3b 20 20 20 20 20 20 20    int sz;       
f570: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
f580: 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 20 20 20 20   cell */..      
f590: 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
f5a0: 20 29 20 69 43 65 6c 6c 4c 61 73 74 2d 2d 3b 0a   ) iCellLast--;.
f5b0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f5c0: 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
f5d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 63 20  ++){.        pc 
f5e0: 3d 20 67 65 74 32 62 79 74 65 41 6c 69 67 6e 65  = get2byteAligne
f5f0: 64 28 26 64 61 74 61 5b 63 65 6c 6c 4f 66 66 73  d(&data[cellOffs
f600: 65 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  et+i*2]);.      
f610: 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
f620: 69 43 65 6c 6c 46 69 72 73 74 20 29 3b 0a 20 20  iCellFirst );.  
f630: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
f640: 70 63 3d 3d 69 43 65 6c 6c 4c 61 73 74 20 29 3b  pc==iCellLast );
f650: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3c  .        if( pc<
f660: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
f670: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
f680: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
f690: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
f6a0: 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  PT;.        }.  
f6b0: 20 20 20 20 20 20 73 7a 20 3d 20 70 50 61 67 65        sz = pPage
f6c0: 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61 67  ->xCellSize(pPag
f6d0: 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  e, &data[pc]);. 
f6e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
f6f0: 20 70 63 2b 73 7a 3d 3d 75 73 61 62 6c 65 53 69   pc+sz==usableSi
f700: 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
f710: 28 20 70 63 2b 73 7a 3e 75 73 61 62 6c 65 53 69  ( pc+sz>usableSi
f720: 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
f730: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
f740: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
f750: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f760: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
f770: 6c 65 61 66 20 29 20 69 43 65 6c 6c 4c 61 73 74  leaf ) iCellLast
f780: 2b 2b 3b 0a 20 20 20 20 7d 20 20 0a 0a 20 20 20  ++;.    }  ..   
f790: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
f7a0: 74 6f 74 61 6c 20 66 72 65 65 20 73 70 61 63 65  total free space
f7b0: 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 20   on the page.   
f7c0: 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
f7d0: 20 52 2d 32 33 35 38 38 2d 33 34 34 35 30 20 54   R-23588-34450 T
f7e0: 68 65 20 74 77 6f 2d 62 79 74 65 20 69 6e 74 65  he two-byte inte
f7f0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 31 20  ger at offset 1 
f800: 67 69 76 65 73 20 74 68 65 0a 20 20 20 20 2a 2a  gives the.    **
f810: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 66 69   start of the fi
f820: 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 20 6f 6e  rst freeblock on
f830: 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 69 73   the page, or is
f840: 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20 61   zero if there a
f850: 72 65 20 6e 6f 0a 20 20 20 20 2a 2a 20 66 72 65  re no.    ** fre
f860: 65 62 6c 6f 63 6b 73 2e 20 2a 2f 0a 20 20 20 20  eblocks. */.    
f870: 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  pc = get2byte(&d
f880: 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20  ata[hdr+1]);.   
f890: 20 6e 46 72 65 65 20 3d 20 64 61 74 61 5b 68 64   nFree = data[hd
f8a0: 72 2b 37 5d 20 2b 20 74 6f 70 3b 20 20 2f 2a 20  r+7] + top;  /* 
f8b0: 49 6e 69 74 20 6e 46 72 65 65 20 74 6f 20 6e 6f  Init nFree to no
f8c0: 6e 2d 66 72 65 65 62 6c 6f 63 6b 20 66 72 65 65  n-freeblock free
f8d0: 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 77 68   space */.    wh
f8e0: 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20  ile( pc>0 ){.   
f8f0: 20 20 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a     u16 next, siz
f900: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63 3c  e;.      if( pc<
f910: 69 43 65 6c 6c 46 69 72 73 74 20 7c 7c 20 70 63  iCellFirst || pc
f920: 3e 69 43 65 6c 6c 4c 61 73 74 20 29 7b 0a 20 20  >iCellLast ){.  
f930: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
f940: 45 2d 4f 46 3a 20 52 2d 35 35 35 33 30 2d 35 32  E-OF: R-55530-52
f950: 39 33 30 20 49 6e 20 61 20 77 65 6c 6c 2d 66 6f  930 In a well-fo
f960: 72 6d 65 64 20 62 2d 74 72 65 65 20 70 61 67 65  rmed b-tree page
f970: 2c 20 74 68 65 72 65 20 77 69 6c 6c 0a 20 20 20  , there will.   
f980: 20 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62       ** always b
f990: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63  e at least one c
f9a0: 65 6c 6c 20 62 65 66 6f 72 65 20 74 68 65 20 66  ell before the f
f9b0: 69 72 73 74 20 66 72 65 65 62 6c 6f 63 6b 2e 0a  irst freeblock..
f9c0: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
f9d0: 20 20 20 2a 2a 20 4f 72 2c 20 74 68 65 20 66 72     ** Or, the fr
f9e0: 65 65 62 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74  eeblock is off t
f9f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 61  he end of the pa
fa00: 67 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  ge.        */.  
fa10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
fa20: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
fa30: 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ; .      }.     
fa40: 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79 74 65   next = get2byte
fa50: 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20  (&data[pc]);.   
fa60: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
fa70: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
fa80: 0a 20 20 20 20 20 20 69 66 28 20 28 6e 65 78 74  .      if( (next
fa90: 3e 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73  >0 && next<=pc+s
faa0: 69 7a 65 2b 33 29 20 7c 7c 20 70 63 2b 73 69 7a  ize+3) || pc+siz
fab0: 65 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  e>usableSize ){.
fac0: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
fad0: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
fae0: 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
faf0: 72 2e 20 41 6e 64 20 74 68 65 20 6c 61 73 74 20  r. And the last 
fb00: 62 79 74 65 20 6f 66 0a 20 20 20 20 20 20 20 20  byte of.        
fb10: 2a 2a 20 74 68 65 20 66 72 65 65 2d 62 6c 6f 63  ** the free-bloc
fb20: 6b 20 6d 75 73 74 20 6c 69 65 20 6f 6e 20 74 68  k must lie on th
fb30: 65 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e  e database page.
fb40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74    */.        ret
fb50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fb60: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
fb70: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
fb80: 6e 46 72 65 65 20 2b 20 73 69 7a 65 3b 0a 20 20  nFree + size;.  
fb90: 20 20 20 20 70 63 20 3d 20 6e 65 78 74 3b 0a 20      pc = next;. 
fba0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
fbb0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6e 46 72 65  this point, nFre
fbc0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73  e contains the s
fbd0: 75 6d 20 6f 66 20 74 68 65 20 6f 66 66 73 65 74  um of the offset
fbe0: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
fbf0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 63 65 6c 6c    ** of the cell
fc00: 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 70 6c  -content area pl
fc10: 75 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  us the number of
fc20: 20 66 72 65 65 20 62 79 74 65 73 20 77 69 74 68   free bytes with
fc30: 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 65  in.    ** the ce
fc40: 6c 6c 2d 63 6f 6e 74 65 6e 74 20 61 72 65 61 2e  ll-content area.
fc50: 20 49 66 20 74 68 69 73 20 69 73 20 67 72 65 61   If this is grea
fc60: 74 65 72 20 74 68 61 6e 20 74 68 65 20 75 73 61  ter than the usa
fc70: 62 6c 65 2d 73 69 7a 65 0a 20 20 20 20 2a 2a 20  ble-size.    ** 
fc80: 6f 66 20 74 68 65 20 70 61 67 65 2c 20 74 68 65  of the page, the
fc90: 6e 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20  n the page must 
fca0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  be corrupted. Th
fcb0: 69 73 20 63 68 65 63 6b 20 61 6c 73 6f 0a 20 20  is check also.  
fcc0: 20 20 2a 2a 20 73 65 72 76 65 73 20 74 6f 20 76    ** serves to v
fcd0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f  erify that the o
fce0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
fcf0: 72 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2d 63  rt of the cell-c
fd00: 6f 6e 74 65 6e 74 0a 20 20 20 20 2a 2a 20 61 72  ontent.    ** ar
fd10: 65 61 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ea, according to
fd20: 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65 72   the page header
fd30: 2c 20 6c 69 65 73 20 77 69 74 68 69 6e 20 74 68  , lies within th
fd40: 65 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  e page..    */. 
fd50: 20 20 20 69 66 28 20 6e 46 72 65 65 3e 75 73 61     if( nFree>usa
fd60: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
fd70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fd80: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
fd90: 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e    }.    pPage->n
fda0: 46 72 65 65 20 3d 20 28 75 31 36 29 28 6e 46 72  Free = (u16)(nFr
fdb0: 65 65 20 2d 20 69 43 65 6c 6c 46 69 72 73 74 29  ee - iCellFirst)
fdc0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ;.    pPage->isI
fdd0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
fde0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
fdf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
fe00: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
fe10: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
fe20: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
fe30: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
fe40: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
fe50: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
fe60: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
fe70: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
fe80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
fe90: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
fea0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
feb0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
fec0: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
fed0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
fee0: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
fef0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
ff00: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
ff10: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
ff20: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
ff30: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
ff40: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
ff50: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
ff60: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
ff70: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ff80: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
ff90: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
ffa0: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
ffb0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
ffc0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
ffd0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
ffe0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
fff0: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10000 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
10010 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42  Bt->btsFlags & B
10020 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TS_SECURE_DELETE
10030 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
10040 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
10050 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
10060 68 64 72 29 3b 0a 20 20 7d 0a 20 20 64 61 74 61  hdr);.  }.  data
10070 5b 68 64 72 5d 20 3d 20 28 63 68 61 72 29 66 6c  [hdr] = (char)fl
10080 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d 20 68  ags;.  first = h
10090 64 72 20 2b 20 28 28 66 6c 61 67 73 26 50 54 46  dr + ((flags&PTF
100a0 5f 4c 45 41 46 29 3d 3d 30 20 3f 20 31 32 20 3a  _LEAF)==0 ? 12 :
100b0 20 38 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64   8);.  memset(&d
100c0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34  ata[hdr+1], 0, 4
100d0 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d  );.  data[hdr+7]
100e0 20 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65   = 0;.  put2byte
100f0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70  (&data[hdr+5], p
10100 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
10110 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  .  pPage->nFree 
10120 3d 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61  = (u16)(pBt->usa
10130 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 29  bleSize - first)
10140 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28  ;.  decodeFlags(
10150 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
10160 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
10170 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20 70 50  et = first;.  pP
10180 61 67 65 2d 3e 61 44 61 74 61 45 6e 64 20 3d 20  age->aDataEnd = 
10190 26 64 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c  &data[pBt->usabl
101a0 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 2d  eSize];.  pPage-
101b0 3e 61 43 65 6c 6c 49 64 78 20 3d 20 26 64 61 74  >aCellIdx = &dat
101c0 61 5b 66 69 72 73 74 5d 3b 0a 20 20 70 50 61 67  a[first];.  pPag
101d0 65 2d 3e 61 44 61 74 61 4f 66 73 74 20 3d 20 26  e->aDataOfst = &
101e0 64 61 74 61 5b 70 50 61 67 65 2d 3e 63 68 69 6c  data[pPage->chil
101f0 64 50 74 72 53 69 7a 65 5d 3b 0a 20 20 70 50 61  dPtrSize];.  pPa
10200 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
10210 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  0;.  assert( pBt
10220 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20  ->pageSize>=512 
10230 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  && pBt->pageSize
10240 3c 3d 36 35 35 33 36 20 29 3b 0a 20 20 70 50 61  <=65536 );.  pPa
10250 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 3d 20 28  ge->maskPage = (
10260 75 31 36 29 28 70 42 74 2d 3e 70 61 67 65 53 69  u16)(pBt->pageSi
10270 7a 65 20 2d 20 31 29 3b 0a 20 20 70 50 61 67 65  ze - 1);.  pPage
10280 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70  ->nCell = 0;.  p
10290 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31  Page->isInit = 1
102a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  ;.}.../*.** Conv
102b0 65 72 74 20 61 20 44 62 50 61 67 65 20 6f 62 74  ert a DbPage obt
102c0 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 70  ained from the p
102d0 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65 6d 50  ager into a MemP
102e0 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a 20 74  age used by.** t
102f0 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 2e 0a  he btree layer..
10300 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67  */.static MemPag
10310 65 20 2a 62 74 72 65 65 50 61 67 65 46 72 6f 6d  e *btreePageFrom
10320 44 62 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  DbPage(DbPage *p
10330 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70 67 6e  DbPage, Pgno pgn
10340 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  o, BtShared *pBt
10350 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
10360 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29  age = (MemPage*)
10370 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
10380 78 74 72 61 28 70 44 62 50 61 67 65 29 3b 0a 20  xtra(pDbPage);. 
10390 20 69 66 28 20 70 67 6e 6f 21 3d 70 50 61 67 65   if( pgno!=pPage
103a0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
103b0 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c  age->aData = sql
103c0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
103d0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 70  (pDbPage);.    p
103e0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 20 3d 20  Page->pDbPage = 
103f0 70 44 62 50 61 67 65 3b 0a 20 20 20 20 70 50 61  pDbPage;.    pPa
10400 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20  ge->pBt = pBt;. 
10410 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
10420 20 70 67 6e 6f 3b 0a 20 20 20 20 70 50 61 67 65   pgno;.    pPage
10430 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 67  ->hdrOffset = pg
10440 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b  no==1 ? 100 : 0;
10450 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
10460 50 61 67 65 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  Page->aData==sql
10470 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
10480 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 72  (pDbPage) );.  r
10490 65 74 75 72 6e 20 70 50 61 67 65 3b 20 0a 7d 0a  eturn pPage; .}.
104a0 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61 67  ./*.** Get a pag
104b0 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72  e from the pager
104c0 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .  Initialize th
104d0 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61 6e  e MemPage.pBt an
104e0 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44 61  d.** MemPage.aDa
104f0 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20 6e  ta elements if n
10500 65 65 64 65 64 2e 20 20 53 65 65 20 61 6c 73 6f  eeded.  See also
10510 3a 20 62 74 72 65 65 47 65 74 55 6e 75 73 65 64  : btreeGetUnused
10520 50 61 67 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Page()..**.** If
10530 20 74 68 65 20 50 41 47 45 52 5f 47 45 54 5f 4e   the PAGER_GET_N
10540 4f 43 4f 4e 54 45 4e 54 20 66 6c 61 67 20 69 73  OCONTENT flag is
10550 20 73 65 74 2c 20 69 74 20 6d 65 61 6e 73 20 74   set, it means t
10560 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  hat we do not ca
10570 72 65 0a 2a 2a 20 61 62 6f 75 74 20 74 68 65 20  re.** about the 
10580 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
10590 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
105a0 2e 20 20 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20  .  So do not go 
105b0 74 6f 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74  to the disk.** t
105c0 6f 20 66 65 74 63 68 20 74 68 65 20 63 6f 6e 74  o fetch the cont
105d0 65 6e 74 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ent.  Just fill 
105e0 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77  in the content w
105f0 69 74 68 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f  ith zeros for no
10600 77 2e 0a 2a 2a 20 49 66 20 69 6e 20 74 68 65 20  w..** If in the 
10610 66 75 74 75 72 65 20 77 65 20 63 61 6c 6c 20 73  future we call s
10620 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
10630 28 29 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2c  () on this page,
10640 20 74 68 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77   that.** means w
10650 65 20 68 61 76 65 20 73 74 61 72 74 65 64 20 74  e have started t
10660 6f 20 62 65 20 63 6f 6e 63 65 72 6e 65 64 20 61  o be concerned a
10670 62 6f 75 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64  bout content and
10680 20 74 68 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61   the disk.** rea
10690 64 20 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61  d should occur a
106a0 74 20 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f  t that point..*/
106b0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
106c0 65 47 65 74 50 61 67 65 28 0a 20 20 42 74 53 68  eGetPage(.  BtSh
106d0 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
106e0 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f   /* The btree */
106f0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
10700 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
10710 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f  r of the page to
10720 20 66 65 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50   fetch */.  MemP
10730 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
10740 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70   /* Return the p
10750 61 67 65 20 69 6e 20 74 68 69 73 20 70 61 72 61  age in this para
10760 6d 65 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 66  meter */.  int f
10770 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
10780 2f 2a 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f 43  /* PAGER_GET_NOC
10790 4f 4e 54 45 4e 54 20 6f 72 20 50 41 47 45 52 5f  ONTENT or PAGER_
107a0 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a  GET_READONLY */.
107b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44  ){.  int rc;.  D
107c0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a  bPage *pDbPage;.
107d0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
107e0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41  ==0 || flags==PA
107f0 47 45 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e  GER_GET_NOCONTEN
10800 54 20 7c 7c 20 66 6c 61 67 73 3d 3d 50 41 47 45  T || flags==PAGE
10810 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 29  R_GET_READONLY )
10820 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
10830 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
10840 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
10850 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
10860 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
10870 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67 65 2a  , pgno, (DbPage*
10880 2a 29 26 70 44 62 50 61 67 65 2c 20 66 6c 61 67  *)&pDbPage, flag
10890 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
108a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 70 50  eturn rc;.  *ppP
108b0 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 46  age = btreePageF
108c0 72 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67  romDbPage(pDbPag
108d0 65 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20  e, pgno, pBt);. 
108e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
108f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  K;.}../*.** Retr
10900 69 65 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  ieve a page from
10910 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
10920 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  . If the request
10930 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 0a 2a  ed page is not.*
10940 2a 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  * already in the
10950 20 70 61 67 65 72 20 63 61 63 68 65 20 72 65 74   pager cache ret
10960 75 72 6e 20 4e 55 4c 4c 2e 20 49 6e 69 74 69 61  urn NULL. Initia
10970 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
10980 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
10990 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
109a0 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2f  ts if needed..*/
109b0 0a 73 74 61 74 69 63 20 4d 65 6d 50 61 67 65 20  .static MemPage 
109c0 2a 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70  *btreePageLookup
109d0 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20  (BtShared *pBt, 
109e0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 44 62  Pgno pgno){.  Db
109f0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
10a00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10a10 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10a20 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 44 62  >mutex) );.  pDb
10a30 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61  Page = sqlite3Pa
10a40 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70  gerLookup(pBt->p
10a50 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
10a60 69 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20  if( pDbPage ){. 
10a70 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65 50     return btreeP
10a80 61 67 65 46 72 6f 6d 44 62 50 61 67 65 28 70 44  ageFromDbPage(pD
10a90 62 50 61 67 65 2c 20 70 67 6e 6f 2c 20 70 42 74  bPage, pgno, pBt
10aa0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10ab0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
10ac0 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
10ad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10ae0 20 69 6e 20 70 61 67 65 73 2e 20 49 66 20 74 68   in pages. If th
10af0 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64 20  ere is any kind 
10b00 6f 66 0a 2a 2a 20 65 72 72 6f 72 2c 20 72 65 74  of.** error, ret
10b10 75 72 6e 20 28 28 75 6e 73 69 67 6e 65 64 20 69  urn ((unsigned i
10b20 6e 74 29 2d 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  nt)-1)..*/.stati
10b30 63 20 50 67 6e 6f 20 62 74 72 65 65 50 61 67 65  c Pgno btreePage
10b40 63 6f 75 6e 74 28 42 74 53 68 61 72 65 64 20 2a  count(BtShared *
10b50 70 42 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pBt){.  return p
10b60 42 74 2d 3e 6e 50 61 67 65 3b 0a 7d 0a 75 33 32  Bt->nPage;.}.u32
10b70 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73   sqlite3BtreeLas
10b80 74 50 61 67 65 28 42 74 72 65 65 20 2a 70 29 7b  tPage(Btree *p){
10b90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
10ba0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
10bb0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
10bc0 28 20 28 28 70 2d 3e 70 42 74 2d 3e 6e 50 61 67  ( ((p->pBt->nPag
10bd0 65 29 26 30 78 38 30 30 30 30 30 30 29 3d 3d 30  e)&0x8000000)==0
10be0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 62 74 72   );.  return btr
10bf0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 2d 3e 70  eePagecount(p->p
10c00 42 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  Bt);.}../*.** Ge
10c10 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
10c20 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
10c30 69 61 6c 69 7a 65 20 69 74 2e 0a 2a 2a 0a 2a 2a  ialize it..**.**
10c40 20 49 66 20 70 43 75 72 21 3d 30 20 74 68 65 6e   If pCur!=0 then
10c50 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
10c60 6e 67 20 66 65 74 63 68 65 64 20 61 73 20 70 61  ng fetched as pa
10c70 72 74 20 6f 66 20 61 20 6d 6f 76 65 54 6f 43 68  rt of a moveToCh
10c80 69 6c 64 28 29 0a 2a 2a 20 63 61 6c 6c 2e 20 20  ild().** call.  
10c90 44 6f 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  Do additional sa
10ca0 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
10cb0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
10cc0 73 20 63 61 73 65 2e 0a 2a 2a 20 41 6e 64 20 69  s case..** And i
10cd0 66 20 74 68 65 20 66 65 74 63 68 20 66 61 69 6c  f the fetch fail
10ce0 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
10cf0 6d 75 73 74 20 64 65 63 72 65 6d 65 6e 74 20 70  must decrement p
10d00 43 75 72 2d 3e 69 50 61 67 65 2e 0a 2a 2a 0a 2a  Cur->iPage..**.*
10d10 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 66 65  * The page is fe
10d20 74 63 68 65 64 20 61 73 20 72 65 61 64 2d 77 72  tched as read-wr
10d30 69 74 65 20 75 6e 6c 65 73 73 20 70 43 75 72 20  ite unless pCur 
10d40 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 61 6e 64 20  is not NULL and 
10d50 69 73 0a 2a 2a 20 61 20 72 65 61 64 2d 6f 6e 6c  is.** a read-onl
10d60 79 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  y cursor..**.** 
10d70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
10d80 72 73 2c 20 74 68 65 6e 20 2a 70 70 50 61 67 65  rs, then *ppPage
10d90 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 20 49   is undefined. I
10da0 74 0a 2a 2a 20 6d 61 79 20 72 65 6d 61 69 6e 20  t.** may remain 
10db0 75 6e 63 68 61 6e 67 65 64 2c 20 6f 72 20 69 74  unchanged, or it
10dc0 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 61   may be set to a
10dd0 6e 20 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 2e  n invalid value.
10de0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
10df0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a 20  etAndInitPage(. 
10e00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
10e30 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   file */.  Pgno 
10e40 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20  pgno,           
10e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
10e60 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65  mber of the page
10e70 20 74 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d   to get */.  Mem
10e80 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10ea0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70  Write the page p
10eb0 6f 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 20  ointer here */. 
10ec0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ee0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 72 65   /* Cursor to re
10ef0 63 65 69 76 65 20 74 68 65 20 70 61 67 65 2c 20  ceive the page, 
10f00 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
10f10 20 62 52 65 61 64 4f 6e 6c 79 20 20 20 20 20 20   bReadOnly      
10f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10f30 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
10f40 6f 6e 6c 79 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  only page */.){.
10f50 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50 61    int rc;.  DbPa
10f60 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 61  ge *pDbPage;.  a
10f70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10f80 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
10f90 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
10fa0 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20 70 70  t( pCur==0 || pp
10fb0 50 61 67 65 3d 3d 26 70 43 75 72 2d 3e 61 70 50  Page==&pCur->apP
10fc0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
10fd0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
10fe0 75 72 3d 3d 30 20 7c 7c 20 62 52 65 61 64 4f 6e  ur==0 || bReadOn
10ff0 6c 79 3d 3d 70 43 75 72 2d 3e 63 75 72 50 61 67  ly==pCur->curPag
11000 65 72 46 6c 61 67 73 20 29 3b 0a 20 20 61 73 73  erFlags );.  ass
11010 65 72 74 28 20 70 43 75 72 3d 3d 30 20 7c 7c 20  ert( pCur==0 || 
11020 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
11030 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3e 62 74 72  ..  if( pgno>btr
11040 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
11050 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11060 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11070 3b 0a 20 20 20 20 67 6f 74 6f 20 67 65 74 41 6e  ;.    goto getAn
11080 64 49 6e 69 74 50 61 67 65 5f 65 72 72 6f 72 3b  dInitPage_error;
11090 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
110a0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
110b0 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
110c0 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
110d0 65 2c 20 62 52 65 61 64 4f 6e 6c 79 29 3b 0a 20  e, bReadOnly);. 
110e0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 67   if( rc ){.    g
110f0 6f 74 6f 20 67 65 74 41 6e 64 49 6e 69 74 50 61  oto getAndInitPa
11100 67 65 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20 20  ge_error;.  }.  
11110 2a 70 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61  *ppPage = (MemPa
11120 67 65 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  ge*)sqlite3Pager
11130 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65  GetExtra(pDbPage
11140 29 3b 0a 20 20 69 66 28 20 28 2a 70 70 50 61 67  );.  if( (*ppPag
11150 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 7b  e)->isInit==0 ){
11160 0a 20 20 20 20 62 74 72 65 65 50 61 67 65 46 72  .    btreePageFr
11170 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
11180 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
11190 20 20 72 63 20 3d 20 62 74 72 65 65 49 6e 69 74    rc = btreeInit
111a0 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20  Page(*ppPage);. 
111b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
111c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
111d0 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
111e0 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 67  e);.      goto g
111f0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
11200 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ror;.    }.  }. 
11210 20 61 73 73 65 72 74 28 20 28 2a 70 70 50 61 67   assert( (*ppPag
11220 65 29 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  e)->pgno==pgno )
11230 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 70 70  ;.  assert( (*pp
11240 50 61 67 65 29 2d 3e 61 44 61 74 61 3d 3d 73 71  Page)->aData==sq
11250 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
11260 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  a(pDbPage) );.. 
11270 20 2f 2a 20 49 66 20 6f 62 74 61 69 6e 69 6e 67   /* If obtaining
11280 20 61 20 63 68 69 6c 64 20 70 61 67 65 20 66 6f   a child page fo
11290 72 20 61 20 63 75 72 73 6f 72 2c 20 77 65 20 6d  r a cursor, we m
112a0 75 73 74 20 76 65 72 69 66 79 20 74 68 61 74 20  ust verify that 
112b0 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 2a 2a  the page is.  **
112c0 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
112d0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2e 20   the root page. 
112e0 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 20 26 26  */.  if( pCur &&
112f0 20 28 28 2a 70 70 50 61 67 65 29 2d 3e 6e 43 65   ((*ppPage)->nCe
11300 6c 6c 3c 31 20 7c 7c 20 28 2a 70 70 50 61 67 65  ll<1 || (*ppPage
11310 29 2d 3e 69 6e 74 4b 65 79 21 3d 70 43 75 72 2d  )->intKey!=pCur-
11320 3e 63 75 72 49 6e 74 4b 65 79 29 20 29 7b 0a 20  >curIntKey) ){. 
11330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
11340 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
11350 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
11360 50 61 67 65 29 3b 0a 20 20 20 20 67 6f 74 6f 20  Page);.    goto 
11370 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65  getAndInitPage_e
11380 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rror;.  }.  retu
11390 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 67  rn SQLITE_OK;..g
113a0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 5f 65 72  etAndInitPage_er
113b0 72 6f 72 3a 0a 20 20 69 66 28 20 70 43 75 72 20  ror:.  if( pCur 
113c0 29 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b  ) pCur->iPage--;
113d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 67 6e  .  testcase( pgn
113e0 6f 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  o==0 );.  assert
113f0 28 20 70 67 6e 6f 21 3d 30 20 7c 7c 20 72 63 3d  ( pgno!=0 || rc=
11400 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
11410 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
11420 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
11430 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
11440 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
11450 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
11460 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
11470 6f 20 62 74 72 65 65 47 65 74 50 61 67 65 2e 0a  o btreeGetPage..
11480 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
11490 65 6c 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c  eleasePageNotNul
114a0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
114b0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ){.  assert( pPa
114c0 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 61  ge->aData );.  a
114d0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42  ssert( pPage->pB
114e0 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t );.  assert( p
114f0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 21 3d 30  Page->pDbPage!=0
11500 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
11510 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
11520 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ra(pPage->pDbPag
11530 65 29 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61  e) == (void*)pPa
11540 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ge );.  assert( 
11550 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
11560 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
11570 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
11580 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  a );.  assert( s
11590 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
115a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
115b0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
115c0 33 50 61 67 65 72 55 6e 72 65 66 4e 6f 74 4e 75  3PagerUnrefNotNu
115d0 6c 6c 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ll(pPage->pDbPag
115e0 65 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  e);.}.static voi
115f0 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
11600 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
11610 20 69 66 28 20 70 50 61 67 65 20 29 20 72 65 6c   if( pPage ) rel
11620 65 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28  easePageNotNull(
11630 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
11640 20 47 65 74 20 61 6e 20 75 6e 75 73 65 64 20 70   Get an unused p
11650 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  age..**.** This 
11660 77 6f 72 6b 73 20 6a 75 73 74 20 6c 69 6b 65 20  works just like 
11670 62 74 72 65 65 47 65 74 50 61 67 65 28 29 20 77  btreeGetPage() w
11680 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
11690 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 49 66 20  :.**.**   *  If 
116a0 74 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65  the page is alre
116b0 61 64 79 20 69 6e 20 75 73 65 20 66 6f 72 20 73  ady in use for s
116c0 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73  ome other purpos
116d0 65 2c 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a  e, immediately.*
116e0 2a 20 20 20 20 20 20 72 65 6c 65 61 73 65 20 69  *      release i
116f0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20  t and return an 
11700 53 51 4c 49 54 45 5f 43 55 52 52 55 50 54 20 65  SQLITE_CURRUPT e
11710 72 72 6f 72 2e 0a 2a 2a 20 20 20 2a 20 20 4d 61  rror..**   *  Ma
11720 6b 65 20 73 75 72 65 20 74 68 65 20 69 73 49 6e  ke sure the isIn
11730 69 74 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  it flag is clear
11740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
11750 74 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67  treeGetUnusedPag
11760 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
11770 42 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  Bt,       /* The
11780 20 62 74 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f   btree */.  Pgno
11790 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
117a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
117b0 65 20 70 61 67 65 20 74 6f 20 66 65 74 63 68 20  e page to fetch 
117c0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70  */.  MemPage **p
117d0 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 52 65 74  pPage,    /* Ret
117e0 75 72 6e 20 74 68 65 20 70 61 67 65 20 69 6e 20  urn the page in 
117f0 74 68 69 73 20 70 61 72 61 6d 65 74 65 72 20 2a  this parameter *
11800 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
11810 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45           /* PAGE
11820 52 5f 47 45 54 5f 4e 4f 43 4f 4e 54 45 4e 54 20  R_GET_NOCONTENT 
11830 6f 72 20 50 41 47 45 52 5f 47 45 54 5f 52 45 41  or PAGER_GET_REA
11840 44 4f 4e 4c 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  DONLY */.){.  in
11850 74 20 72 63 20 3d 20 62 74 72 65 65 47 65 74 50  t rc = btreeGetP
11860 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70  age(pBt, pgno, p
11870 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20  pPage, flags);. 
11880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11890 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  OK ){.    if( sq
118a0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52 65  lite3PagerPageRe
118b0 66 63 6f 75 6e 74 28 28 2a 70 70 50 61 67 65 29  fcount((*ppPage)
118c0 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 7b 0a  ->pDbPage)>1 ){.
118d0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
118e0 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
118f0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
11900 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
11910 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
11920 0a 20 20 20 20 7d 0a 20 20 20 20 28 2a 70 70 50  .    }.    (*ppP
11930 61 67 65 29 2d 3e 69 73 49 6e 69 74 20 3d 20 30  age)->isInit = 0
11940 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
11950 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
11960 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11970 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
11980 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
11990 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
119a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
119b0 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
119c0 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
119d0 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
119e0 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
119f0 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
11a00 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
11a10 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
11a20 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
11a30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
11a40 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
11a50 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
11a60 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
11a70 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
11a80 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
11a90 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
11aa0 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
11ab0 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
11ac0 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
11ad0 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
11ae0 61 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  a){.  MemPage *p
11af0 50 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20  Page;.  pPage = 
11b00 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
11b10 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
11b20 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74  pData);.  assert
11b30 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11b40 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
11b50 29 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  )>0 );.  if( pPa
11b60 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
11b70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
11b80 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
11b90 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
11ba0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
11bb0 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
11bc0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
11bd0 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
11be0 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  )>1 ){.      /* 
11bf0 70 50 61 67 65 20 6d 69 67 68 74 20 6e 6f 74 20  pPage might not 
11c00 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65 3b  be a btree page;
11c10 20 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 6e    it might be an
11c20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20   overflow page. 
11c30 20 20 20 20 20 2a 2a 20 6f 72 20 70 74 72 6d 61       ** or ptrma
11c40 70 20 70 61 67 65 20 6f 72 20 61 20 66 72 65 65  p page or a free
11c50 20 70 61 67 65 2e 20 20 49 6e 20 74 68 6f 73 65   page.  In those
11c60 20 63 61 73 65 73 2c 20 74 68 65 20 66 6f 6c 6c   cases, the foll
11c70 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63  owing.      ** c
11c80 61 6c 6c 20 74 6f 20 62 74 72 65 65 49 6e 69 74  all to btreeInit
11c90 50 61 67 65 28 29 20 77 69 6c 6c 20 6c 69 6b 65  Page() will like
11ca0 6c 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ly return SQLITE
11cb0 5f 43 4f 52 52 55 50 54 2e 0a 20 20 20 20 20 20  _CORRUPT..      
11cc0 2a 2a 20 42 75 74 20 6e 6f 20 68 61 72 6d 20 69  ** But no harm i
11cd0 73 20 64 6f 6e 65 20 62 79 20 74 68 69 73 2e 20  s done by this. 
11ce0 20 41 6e 64 20 69 74 20 69 73 20 76 65 72 79 20   And it is very 
11cf0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 0a 20  important that. 
11d00 20 20 20 20 20 2a 2a 20 62 74 72 65 65 49 6e 69       ** btreeIni
11d10 74 50 61 67 65 28 29 20 62 65 20 63 61 6c 6c 65  tPage() be calle
11d20 64 20 6f 6e 20 65 76 65 72 79 20 62 74 72 65 65  d on every btree
11d30 20 70 61 67 65 20 73 6f 20 77 65 20 6d 61 6b 65   page so we make
11d40 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 61  .      ** the ca
11d50 6c 6c 20 66 6f 72 20 65 76 65 72 79 20 70 61 67  ll for every pag
11d60 65 20 74 68 61 74 20 63 6f 6d 65 73 20 69 6e 20  e that comes in 
11d70 66 6f 72 20 72 65 2d 69 6e 69 74 69 6e 67 2e 20  for re-initing. 
11d80 2a 2f 0a 20 20 20 20 20 20 62 74 72 65 65 49 6e  */.      btreeIn
11d90 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
11da0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11db0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  * Invoke the bus
11dc0 79 20 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20  y handler for a 
11dd0 62 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  btree..*/.static
11de0 20 69 6e 74 20 62 74 72 65 65 49 6e 76 6f 6b 65   int btreeInvoke
11df0 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
11e00 20 2a 70 41 72 67 29 7b 0a 20 20 42 74 53 68 61   *pArg){.  BtSha
11e10 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74 53 68  red *pBt = (BtSh
11e20 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20 61 73  ared*)pArg;.  as
11e30 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20 29 3b  sert( pBt->db );
11e40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11e50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11e60 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  t->db->mutex) );
11e70 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
11e80 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
11e90 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62 75 73  er(&pBt->db->bus
11ea0 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a  yHandler);.}../*
11eb0 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74 61 62  .** Open a datab
11ec0 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a  ase file..** .**
11ed0 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68   zFilename is th
11ee0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
11ef0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66  tabase file.  If
11f00 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
11f10 4c 4c 0a 2a 2a 20 74 68 65 6e 20 61 6e 20 65 70  LL.** then an ep
11f20 68 65 6d 65 72 61 6c 20 64 61 74 61 62 61 73 65  hemeral database
11f30 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
11f40 65 20 65 70 68 65 6d 65 72 61 6c 20 64 61 74 61  e ephemeral data
11f50 62 61 73 65 20 6d 69 67 68 74 0a 2a 2a 20 62 65  base might.** be
11f60 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
11f70 6d 65 6d 6f 72 79 2c 20 6f 72 20 69 74 20 6d 69  memory, or it mi
11f80 67 68 74 20 75 73 65 20 61 20 64 69 73 6b 2d 62  ght use a disk-b
11f90 61 73 65 64 20 6d 65 6d 6f 72 79 20 63 61 63 68  ased memory cach
11fa0 65 2e 0a 2a 2a 20 45 69 74 68 65 72 20 77 61 79  e..** Either way
11fb0 2c 20 74 68 65 20 65 70 68 65 6d 65 72 61 6c 20  , the ephemeral 
11fc0 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 62 65  database will be
11fd0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
11fe0 65 6c 65 74 65 64 20 0a 2a 2a 20 77 68 65 6e 20  eleted .** when 
11ff0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
12000 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
12010 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
12020 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
12030 74 68 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  then an in-memor
12040 79 20 64 61 74 61 62 61 73 65 20 69 73 20 63 72  y database is cr
12050 65 61 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73  eated.** that is
12060 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
12070 65 73 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74  estroyed when it
12080 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a   is closed..**.*
12090 2a 20 54 68 65 20 22 66 6c 61 67 73 22 20 70 61  * The "flags" pa
120a0 72 61 6d 65 74 65 72 20 69 73 20 61 20 62 69 74  rameter is a bit
120b0 6d 61 73 6b 20 74 68 61 74 20 6d 69 67 68 74 20  mask that might 
120c0 63 6f 6e 74 61 69 6e 20 62 69 74 73 20 6c 69 6b  contain bits lik
120d0 65 0a 2a 2a 20 42 54 52 45 45 5f 4f 4d 49 54 5f  e.** BTREE_OMIT_
120e0 4a 4f 55 52 4e 41 4c 20 61 6e 64 2f 6f 72 20 42  JOURNAL and/or B
120f0 54 52 45 45 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a  TREE_MEMORY..**.
12100 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
12110 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  se is already op
12120 65 6e 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65  ened in the same
12130 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
12140 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 77 65 20 61  tion.** and we a
12150 72 65 20 69 6e 20 73 68 61 72 65 64 20 63 61 63  re in shared cac
12160 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68  he mode, then th
12170 65 20 6f 70 65 6e 20 77 69 6c 6c 20 66 61 69 6c  e open will fail
12180 20 77 69 74 68 20 61 6e 0a 2a 2a 20 53 51 4c 49   with an.** SQLI
12190 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 65 72  TE_CONSTRAINT er
121a0 72 6f 72 2e 20 20 57 65 20 63 61 6e 6e 6f 74 20  ror.  We cannot 
121b0 61 6c 6c 6f 77 20 74 77 6f 20 6f 72 20 6d 6f 72  allow two or mor
121c0 65 20 42 74 53 68 61 72 65 64 0a 2a 2a 20 6f 62  e BtShared.** ob
121d0 6a 65 63 74 73 20 69 6e 20 74 68 65 20 73 61 6d  jects in the sam
121e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
121f0 63 74 69 6f 6e 20 73 69 6e 63 65 20 64 6f 69 6e  ction since doin
12200 67 20 73 6f 20 77 69 6c 6c 20 6c 65 61 64 0a 2a  g so will lead.*
12210 2a 20 74 6f 20 70 72 6f 62 6c 65 6d 73 20 77 69  * to problems wi
12220 74 68 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69  th locking..*/.i
12230 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f  nt sqlite3BtreeO
12240 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  pen(.  sqlite3_v
12250 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f  fs *pVfs,      /
12260 2a 20 56 46 53 20 74 6f 20 75 73 65 20 66 6f 72  * VFS to use for
12270 20 74 68 69 73 20 62 2d 74 72 65 65 20 2a 2f 0a   this b-tree */.
12280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
12290 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d  ilename,  /* Nam
122a0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
122b0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54 72  ntaining the BTr
122c0 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ee database */. 
122d0 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
122e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f           /* Asso
122f0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
12300 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65  handle */.  Btre
12310 65 20 2a 2a 70 70 42 74 72 65 65 2c 20 20 20 20  e **ppBtree,    
12320 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
12330 6f 20 6e 65 77 20 42 74 72 65 65 20 6f 62 6a 65  o new Btree obje
12340 63 74 20 77 72 69 74 74 65 6e 20 68 65 72 65 20  ct written here 
12350 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12370 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  Options */.  int
12380 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
12390 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61       /* Flags pa
123a0 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20  ssed through to 
123b0 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65  sqlite3_vfs.xOpe
123c0 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 42 74 53 68  n() */.){.  BtSh
123d0 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20 20  ared *pBt = 0;  
123e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
123f0 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74 72  ared part of btr
12400 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
12410 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20 20    Btree *p;     
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f 20 72 65   /* Handle to re
12440 74 75 72 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  turn */.  sqlite
12450 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 4f 70  3_mutex *mutexOp
12460 65 6e 20 3d 20 30 3b 20 20 2f 2a 20 50 72 65 76  en = 0;  /* Prev
12470 65 6e 74 73 20 61 20 72 61 63 65 20 63 6f 6e 64  ents a race cond
12480 69 74 69 6f 6e 2e 20 54 69 63 6b 65 74 20 23 33  ition. Ticket #3
12490 35 33 37 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  537 */.  int rc 
124a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
124b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
124c0 74 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 69 73  t code from this
124d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 75   function */.  u
124e0 38 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20 20  8 nReserve;     
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12500 20 42 79 74 65 20 6f 66 20 75 6e 75 73 65 64 20   Byte of unused 
12510 73 70 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61  space on each pa
12520 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
12530 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72 5b   char zDbHeader[
12540 31 30 30 5d 3b 20 20 2f 2a 20 44 61 74 61 62 61  100];  /* Databa
12550 73 65 20 68 65 61 64 65 72 20 63 6f 6e 74 65 6e  se header conten
12560 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 72 75 65 20  t */..  /* True 
12570 69 66 20 6f 70 65 6e 69 6e 67 20 61 6e 20 65 70  if opening an ep
12580 68 65 6d 65 72 61 6c 2c 20 74 65 6d 70 6f 72 61  hemeral, tempora
12590 72 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ry database */. 
125a0 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 54 65 6d   const int isTem
125b0 70 44 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3d  pDb = zFilename=
125c0 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
125d0 30 5d 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  0]==0;..  /* Set
125e0 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
125f0 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
12600 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
12610 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
12620 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
12630 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
12640 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
12650 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
12660 59 44 42 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  YDB.  const int 
12670 69 73 4d 65 6d 64 62 20 3d 20 30 3b 0a 23 65 6c  isMemdb = 0;.#el
12680 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  se.  const int i
12690 73 4d 65 6d 64 62 20 3d 20 28 7a 46 69 6c 65 6e  sMemdb = (zFilen
126a0 61 6d 65 20 26 26 20 73 74 72 63 6d 70 28 7a 46  ame && strcmp(zF
126b0 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72  ilename, ":memor
126c0 79 3a 22 29 3d 3d 30 29 0a 20 20 20 20 20 20 20  y:")==0).       
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 7c 7c 20 28 69 73 54 65 6d 70 44 62 20 26 26 20  || (isTempDb && 
126f0 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
12700 6f 72 79 28 64 62 29 29 0a 20 20 20 20 20 20 20  ory(db)).       
12710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12720 7c 7c 20 28 76 66 73 46 6c 61 67 73 20 26 20 53  || (vfsFlags & S
12730 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
12740 59 29 21 3d 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  Y)!=0;.#endif.. 
12750 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
12760 3b 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73  ;.  assert( pVfs
12770 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
12780 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
12790 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
127a0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61  ;.  assert( (fla
127b0 67 73 26 30 78 66 66 29 3d 3d 66 6c 61 67 73 20  gs&0xff)==flags 
127c0 29 3b 20 20 20 2f 2a 20 66 6c 61 67 73 20 66 69  );   /* flags fi
127d0 74 20 69 6e 20 38 20 62 69 74 73 20 2a 2f 0a 0a  t in 8 bits */..
127e0 20 20 2f 2a 20 4f 6e 6c 79 20 61 20 42 54 52 45    /* Only a BTRE
127f0 45 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73  E_SINGLE databas
12800 65 20 63 61 6e 20 62 65 20 42 54 52 45 45 5f 55  e can be BTREE_U
12810 4e 4f 52 44 45 52 45 44 20 2a 2f 0a 20 20 61 73  NORDERED */.  as
12820 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42  sert( (flags & B
12830 54 52 45 45 5f 55 4e 4f 52 44 45 52 45 44 29 3d  TREE_UNORDERED)=
12840 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 42  =0 || (flags & B
12850 54 52 45 45 5f 53 49 4e 47 4c 45 29 21 3d 30 20  TREE_SINGLE)!=0 
12860 29 3b 0a 0a 20 20 2f 2a 20 41 20 42 54 52 45 45  );..  /* A BTREE
12870 5f 53 49 4e 47 4c 45 20 64 61 74 61 62 61 73 65  _SINGLE database
12880 20 69 73 20 61 6c 77 61 79 73 20 61 20 74 65 6d   is always a tem
12890 70 6f 72 61 72 79 20 61 6e 64 2f 6f 72 20 65 70  porary and/or ep
128a0 68 65 6d 65 72 61 6c 20 2a 2f 0a 20 20 61 73 73  hemeral */.  ass
128b0 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 42 54  ert( (flags & BT
128c0 52 45 45 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 7c  REE_SINGLE)==0 |
128d0 7c 20 69 73 54 65 6d 70 44 62 20 29 3b 0a 0a 20  | isTempDb );.. 
128e0 20 69 66 28 20 69 73 4d 65 6d 64 62 20 29 7b 0a   if( isMemdb ){.
128f0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 42 54 52      flags |= BTR
12900 45 45 5f 4d 45 4d 4f 52 59 3b 0a 20 20 7d 0a 20  EE_MEMORY;.  }. 
12910 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26   if( (vfsFlags &
12920 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
12930 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 69 73 4d  N_DB)!=0 && (isM
12940 65 6d 64 62 20 7c 7c 20 69 73 54 65 6d 70 44 62  emdb || isTempDb
12950 29 20 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67  ) ){.    vfsFlag
12960 73 20 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20  s = (vfsFlags & 
12970 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  ~SQLITE_OPEN_MAI
12980 4e 5f 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f  N_DB) | SQLITE_O
12990 50 45 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d  PEN_TEMP_DB;.  }
129a0 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
129b0 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
129c0 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
129d0 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
129e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
129f0 54 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54 72  T;.  }.  p->inTr
12a00 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12a10 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a  ;.  p->db = db;.
12a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
12a30 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
12a40 0a 20 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72 65  .  p->lock.pBtre
12a50 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6c 6f 63 6b  e = p;.  p->lock
12a60 2e 69 54 61 62 6c 65 20 3d 20 31 3b 0a 23 65 6e  .iTable = 1;.#en
12a70 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
12a80 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
12a90 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 21  ARED_CACHE) && !
12aa0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
12ab0 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a  MIT_DISKIO).  /*
12ac0 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74  .  ** If this Bt
12ad0 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64 61  ree is a candida
12ae0 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63 61  te for shared ca
12af0 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64  che, try to find
12b00 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e   an.  ** existin
12b10 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63  g BtShared objec
12b20 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 68  t that we can sh
12b30 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20  are with.  */.  
12b40 69 66 28 20 69 73 54 65 6d 70 44 62 3d 3d 30 20  if( isTempDb==0 
12b50 26 26 20 28 69 73 4d 65 6d 64 62 3d 3d 30 20 7c  && (isMemdb==0 |
12b60 7c 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  | (vfsFlags&SQLI
12b70 54 45 5f 4f 50 45 4e 5f 55 52 49 29 21 3d 30 29  TE_OPEN_URI)!=0)
12b80 20 29 7b 0a 20 20 20 20 69 66 28 20 76 66 73 46   ){.    if( vfsF
12b90 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
12ba0 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 29  EN_SHAREDCACHE )
12bb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 69 6c  {.      int nFil
12bc0 65 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  ename = sqlite3S
12bd0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
12be0 65 29 2b 31 3b 0a 20 20 20 20 20 20 69 6e 74 20  e)+1;.      int 
12bf0 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
12c00 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
12c10 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
12c20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
12c30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 4d 41  sqlite3Malloc(MA
12c40 58 28 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  X(nFullPathname,
12c50 6e 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 20  nFilename));.   
12c60 20 20 20 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20     MUTEX_LOGIC( 
12c70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
12c80 75 74 65 78 53 68 61 72 65 64 3b 20 29 0a 0a 20  utexShared; ).. 
12c90 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65       p->sharable
12ca0 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
12cb0 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29  !zFullPathname )
12cc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12cd0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
12ce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12cf0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
12d00 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
12d10 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20  sMemdb ){.      
12d20 20 20 6d 65 6d 63 70 79 28 7a 46 75 6c 6c 50 61    memcpy(zFullPa
12d30 74 68 6e 61 6d 65 2c 20 7a 46 69 6c 65 6e 61 6d  thname, zFilenam
12d40 65 2c 20 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e, nFilename);. 
12d50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12d60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12d70 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 70  OsFullPathname(p
12d80 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  Vfs, zFilename,.
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12db0 20 20 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65     nFullPathname
12dc0 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
12dd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
12df0 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
12e00 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
12e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12e20 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
12e30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12e40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66     }.      }.#if
12e50 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
12e60 46 45 0a 20 20 20 20 20 20 6d 75 74 65 78 4f 70  FE.      mutexOp
12e70 65 6e 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  en = sqlite3Mute
12e80 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
12e90 54 45 58 5f 53 54 41 54 49 43 5f 4f 50 45 4e 29  TEX_STATIC_OPEN)
12ea0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12eb0 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65  mutex_enter(mute
12ec0 78 4f 70 65 6e 29 3b 0a 20 20 20 20 20 20 6d 75  xOpen);.      mu
12ed0 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69  texShared = sqli
12ee0 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
12ef0 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
12f00 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20  C_MASTER);.     
12f10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
12f20 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
12f30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
12f40 66 6f 72 28 70 42 74 3d 47 4c 4f 42 41 4c 28 42  for(pBt=GLOBAL(B
12f50 74 53 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33  tShared*,sqlite3
12f60 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 29  SharedCacheList)
12f70 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
12f80 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
12f90 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
12fa0 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
12fb0 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
12fc0 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
12fd0 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
12fe0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 30 29  (pBt->pPager, 0)
12ff0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
13000 20 20 20 26 26 20 73 71 6c 69 74 65 33 50 61 67     && sqlite3Pag
13010 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61 67 65  erVfs(pBt->pPage
13020 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20 20 20  r)==pVfs ){.    
13030 20 20 20 20 20 20 69 6e 74 20 69 44 62 3b 0a 20        int iDb;. 
13040 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 44 62           for(iDb
13050 3d 64 62 2d 3e 6e 44 62 2d 31 3b 20 69 44 62 3e  =db->nDb-1; iDb>
13060 3d 30 3b 20 69 44 62 2d 2d 29 7b 0a 20 20 20 20  =0; iDb--){.    
13070 20 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70          Btree *p
13080 45 78 69 73 74 69 6e 67 20 3d 20 64 62 2d 3e 61  Existing = db->a
13090 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20  Db[iDb].pBt;.   
130a0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78           if( pEx
130b0 69 73 74 69 6e 67 20 26 26 20 70 45 78 69 73 74  isting && pExist
130c0 69 6e 67 2d 3e 70 42 74 3d 3d 70 42 74 20 29 7b  ing->pBt==pBt ){
130d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
130e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
130f0 76 65 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  ve(mutexShared);
13100 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
13110 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
13120 76 65 28 6d 75 74 65 78 4f 70 65 6e 29 3b 0a 20  ve(mutexOpen);. 
13130 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13140 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50  ite3_free(zFullP
13150 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  athname);.      
13160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
13170 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20  free(p);.       
13180 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
13190 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3b  LITE_CONSTRAINT;
131a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
131b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
131c0 20 20 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42       p->pBt = pB
131d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 74  t;.          pBt
131e0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
131f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13200 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13210 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
13220 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61 72  _leave(mutexShar
13230 65 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ed);.      sqlit
13240 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74  e3_free(zFullPat
13250 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69  hname);.    }.#i
13260 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
13270 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
13280 20 20 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f    /* In debug mo
13290 64 65 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20  de, we mark all 
132a0 70 65 72 73 69 73 74 65 6e 74 20 64 61 74 61 62  persistent datab
132b0 61 73 65 73 20 61 73 20 73 68 61 72 61 62 6c 65  ases as sharable
132c0 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77  .      ** even w
132d0 68 65 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74  hen they are not
132e0 2e 20 20 54 68 69 73 20 65 78 65 72 63 69 73 65  .  This exercise
132f0 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  s the locking co
13300 64 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  de and.      ** 
13310 67 69 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72  gives more oppor
13320 74 75 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72  tunity for asser
13330 74 73 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ts(sqlite3_mutex
13340 5f 68 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a  _held()).      *
13350 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  * statements to 
13360 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  find locking pro
13370 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  blems..      */.
13380 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
13390 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e  e = 1;.    }.#en
133a0 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  dif.  }.#endif. 
133b0 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20   if( pBt==0 ){. 
133c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65     /*.    ** The
133d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
133e0 74 73 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  ts make sure tha
133f0 74 20 73 74 72 75 63 74 75 72 65 73 20 75 73 65  t structures use
13400 64 20 62 79 20 74 68 65 20 62 74 72 65 65 20 61  d by the btree a
13410 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69  re.    ** the ri
13420 67 68 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20  ght size.  This 
13430 69 73 20 74 6f 20 67 75 61 72 64 20 61 67 61 69  is to guard agai
13440 6e 73 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73  nst size changes
13450 20 74 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20   that result.   
13460 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69   ** when compili
13470 6e 67 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e  ng on a differen
13480 74 20 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a  t architecture..
13490 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
134a0 74 28 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  t( sizeof(i64)==
134b0 38 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8 );.    assert(
134c0 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
134d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
134e0 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20 29 3b  izeof(u32)==4 );
134f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
13500 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b 0a 20  eof(u16)==2 );. 
13510 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
13520 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a 20 20  f(Pgno)==4 );.  
13530 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c 69 74  .    pBt = sqlit
13540 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
13550 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a 20 20  zeof(*pBt) );.  
13560 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a    if( pBt==0 ){.
13570 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
13580 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
13590 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
135a0 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  pen_out;.    }. 
135b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
135c0 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c 20 26  agerOpen(pVfs, &
135d0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 46 69  pBt->pPager, zFi
135e0 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
135f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13600 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20 66 6c    EXTRA_SIZE, fl
13610 61 67 73 2c 20 76 66 73 46 6c 61 67 73 2c 20 70  ags, vfsFlags, p
13620 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20 20 20  ageReinit);.    
13630 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13640 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
13650 65 33 50 61 67 65 72 53 65 74 4d 6d 61 70 4c 69  e3PagerSetMmapLi
13660 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  mit(pBt->pPager,
13670 20 64 62 2d 3e 73 7a 4d 6d 61 70 29 3b 0a 20 20   db->szMmap);.  
13680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13690 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61  PagerReadFilehea
136a0 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  der(pBt->pPager,
136b0 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64 65 72  sizeof(zDbHeader
136c0 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a 20 20  ),zDbHeader);.  
136d0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
136e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
136f0 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70     goto btree_op
13700 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  en_out;.    }.  
13710 20 20 70 42 74 2d 3e 6f 70 65 6e 46 6c 61 67 73    pBt->openFlags
13720 20 3d 20 28 75 38 29 66 6c 61 67 73 3b 0a 20 20   = (u8)flags;.  
13730 20 20 70 42 74 2d 3e 64 62 20 3d 20 64 62 3b 0a    pBt->db = db;.
13740 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
13750 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
13760 42 74 2d 3e 70 50 61 67 65 72 2c 20 62 74 72 65  Bt->pPager, btre
13770 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
13780 65 72 2c 20 70 42 74 29 3b 0a 20 20 20 20 70 2d  er, pBt);.    p-
13790 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20  >pBt = pBt;.  . 
137a0 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20     pBt->pCursor 
137b0 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50  = 0;.    pBt->pP
137c0 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 69 66  age1 = 0;.    if
137d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
137e0 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
137f0 61 67 65 72 29 20 29 20 70 42 74 2d 3e 62 74 73  ager) ) pBt->bts
13800 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 52 45 41  Flags |= BTS_REA
13810 44 5f 4f 4e 4c 59 3b 0a 23 69 66 64 65 66 20 53  D_ONLY;.#ifdef S
13820 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
13830 45 54 45 0a 20 20 20 20 70 42 74 2d 3e 62 74 73  ETE.    pBt->bts
13840 46 6c 61 67 73 20 7c 3d 20 42 54 53 5f 53 45 43  Flags |= BTS_SEC
13850 55 52 45 5f 44 45 4c 45 54 45 3b 0a 23 65 6e 64  URE_DELETE;.#end
13860 69 66 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  if.    /* EVIDEN
13870 43 45 2d 4f 46 3a 20 52 2d 35 31 38 37 33 2d 33  CE-OF: R-51873-3
13880 39 36 31 38 20 54 68 65 20 70 61 67 65 20 73 69  9618 The page si
13890 7a 65 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ze for a databas
138a0 65 20 66 69 6c 65 20 69 73 0a 20 20 20 20 2a 2a  e file is.    **
138b0 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
138c0 68 65 20 32 2d 62 79 74 65 20 69 6e 74 65 67 65  he 2-byte intege
138d0 72 20 6c 6f 63 61 74 65 64 20 61 74 20 61 6e 20  r located at an 
138e0 6f 66 66 73 65 74 20 6f 66 20 31 36 20 62 79 74  offset of 16 byt
138f0 65 73 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  es from.    ** t
13900 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
13910 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13920 65 2e 20 2a 2f 0a 20 20 20 20 70 42 74 2d 3e 70  e. */.    pBt->p
13930 61 67 65 53 69 7a 65 20 3d 20 28 7a 44 62 48 65  ageSize = (zDbHe
13940 61 64 65 72 5b 31 36 5d 3c 3c 38 29 20 7c 20 28  ader[16]<<8) | (
13950 7a 44 62 48 65 61 64 65 72 5b 31 37 5d 3c 3c 31  zDbHeader[17]<<1
13960 36 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d  6);.    if( pBt-
13970 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c  >pageSize<512 ||
13980 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53   pBt->pageSize>S
13990 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
139a0 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  IZE.         || 
139b0 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d  ((pBt->pageSize-
139c0 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  1)&pBt->pageSize
139d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42  )!=0 ){.      pB
139e0 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b  t->pageSize = 0;
139f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13a00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13a10 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
13a20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d  magic name ":mem
13a30 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65 61 74  ory:" will creat
13a40 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
13a50 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 20 20  atabase, then.  
13a60 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74 68 65      ** leave the
13a70 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65   autoVacuum mode
13a80 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20 61 75   at 0 (do not au
13a90 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76 65 6e  to-vacuum), even
13aa0 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c   if.      ** SQL
13ab0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
13ac0 56 41 43 55 55 4d 20 69 73 20 74 72 75 65 2e 20  VACUUM is true. 
13ad0 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
13ae0 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  d, if.      ** S
13af0 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
13b00 59 44 42 20 68 61 73 20 62 65 65 6e 20 64 65 66  YDB has been def
13b10 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d  ined, then ":mem
13b20 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20 61 0a  ory:" is just a.
13b30 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c 61 72        ** regular
13b40 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74   file-name. In t
13b50 68 69 73 20 63 61 73 65 20 74 68 65 20 61 75 74  his case the aut
13b60 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69 65 73  o-vacuum applies
13b70 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a   as per normal..
13b80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13b90 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
13ba0 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20  !isMemdb ){.    
13bb0 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
13bc0 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45  uum = (SQLITE_DE
13bd0 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
13be0 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20   ? 1 : 0);.     
13bf0 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
13c00 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46  um = (SQLITE_DEF
13c10 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d  AULT_AUTOVACUUM=
13c20 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  =2 ? 1 : 0);.   
13c30 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
13c40 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30 3b 0a    nReserve = 0;.
13c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c60 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
13c70 20 52 2d 33 37 34 39 37 2d 34 32 34 31 32 20 54   R-37497-42412 T
13c80 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 72  he size of the r
13c90 65 73 65 72 76 65 64 20 72 65 67 69 6f 6e 20 69  eserved region i
13ca0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65 72  s.      ** deter
13cb0 6d 69 6e 65 64 20 62 79 20 74 68 65 20 6f 6e 65  mined by the one
13cc0 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 69  -byte unsigned i
13cd0 6e 74 65 67 65 72 20 66 6f 75 6e 64 20 61 74 20  nteger found at 
13ce0 61 6e 20 6f 66 66 73 65 74 20 6f 66 20 32 30 0a  an offset of 20.
13cf0 20 20 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68        ** into th
13d00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13d10 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20  header. */.     
13d20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44 62 48   nReserve = zDbH
13d30 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20  eader[20];.     
13d40 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c   pBt->btsFlags |
13d50 3d 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46  = BTS_PAGESIZE_F
13d60 49 58 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51  IXED;.#ifndef SQ
13d70 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13d80 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
13d90 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
13da0 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
13db0 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
13dc0 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
13dd0 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
13de0 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
13df0 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
13e00 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
13e10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
13e20 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
13e30 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
13e40 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73  ->pageSize, nRes
13e50 65 72 76 65 29 3b 0a 20 20 20 20 69 66 28 20 72  erve);.    if( r
13e60 63 20 29 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f  c ) goto btree_o
13e70 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 70 42 74  pen_out;.    pBt
13e80 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
13e90 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
13ea0 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
13eb0 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
13ec0 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
13ed0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
13ee0 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
13ef0 2a 2f 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69  */.   .#if !defi
13f00 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
13f10 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
13f20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13f30 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20  _OMIT_DISKIO).  
13f40 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
13f50 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
13f60 20 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   to the linked l
13f70 69 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53  ist sharable BtS
13f80 68 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20  hareds..    */. 
13f90 20 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31     pBt->nRef = 1
13fa0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68 61  ;.    if( p->sha
13fb0 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 4d  rable ){.      M
13fc0 55 54 45 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69  UTEX_LOGIC( sqli
13fd0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
13fe0 53 68 61 72 65 64 3b 20 29 0a 20 20 20 20 20 20  Shared; ).      
13ff0 4d 55 54 45 58 5f 4c 4f 47 49 43 28 20 6d 75 74  MUTEX_LOGIC( mut
14000 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
14010 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14020 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
14030 5f 4d 41 53 54 45 52 29 3b 29 0a 20 20 20 20 20  _MASTER);).     
14040 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45   if( SQLITE_THRE
14050 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65  ADSAFE && sqlite
14060 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
14070 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
14080 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d      pBt->mutex =
14090 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
140a0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
140b0 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69  FAST);.        i
140c0 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30  f( pBt->mutex==0
140d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
140e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
140f0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
14100 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
14110 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
14120 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14130 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14140 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
14150 20 20 20 20 20 70 42 74 2d 3e 70 4e 65 78 74 20       pBt->pNext 
14160 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14170 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14180 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14190 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
141a0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
141b0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
141c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
141d0 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
141e0 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
141f0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
14200 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14210 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
14220 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
14230 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
14240 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
14250 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
14260 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
14270 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
14280 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
14290 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
142a0 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
142b0 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
142c0 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
142d0 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
142e0 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
142f0 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
14300 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
14310 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
14320 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
14330 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
14340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
14350 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
14360 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
14370 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
14380 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
14390 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
143a0 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
143b0 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
143c0 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
143d0 20 20 69 66 28 20 28 75 70 74 72 29 70 2d 3e 70    if( (uptr)p->p
143e0 42 74 3c 28 75 70 74 72 29 70 53 69 62 2d 3e 70  Bt<(uptr)pSib->p
143f0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
14400 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
14410 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
14420 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
14430 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
14440 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
14450 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
14460 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
14470 26 26 20 28 75 70 74 72 29 70 53 69 62 2d 3e 70  && (uptr)pSib->p
14480 4e 65 78 74 2d 3e 70 42 74 3c 28 75 70 74 72 29  Next->pBt<(uptr)
14490 70 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  p->pBt ){.      
144a0 20 20 20 20 20 20 70 53 69 62 20 3d 20 70 53 69        pSib = pSi
144b0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  b->pNext;.      
144c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
144d0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 2d  p->pNext = pSib-
144e0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
144f0 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 70 53 69    p->pPrev = pSi
14500 62 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  b;.          if(
14510 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20   p->pNext ){.   
14520 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
14530 74 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20  t->pPrev = p;.  
14540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14550 20 20 20 20 70 53 69 62 2d 3e 70 4e 65 78 74 20      pSib->pNext 
14560 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = p;.        }. 
14570 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
14580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
14590 23 65 6e 64 69 66 0a 20 20 2a 70 70 42 74 72 65  #endif.  *ppBtre
145a0 65 20 3d 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70  e = p;..btree_op
145b0 65 6e 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  en_out:.  if( rc
145c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
145d0 20 20 20 69 66 28 20 70 42 74 20 26 26 20 70 42     if( pBt && pB
145e0 74 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20  t->pPager ){.   
145f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 43     sqlite3PagerC
14600 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72  lose(pBt->pPager
14610 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
14620 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
14630 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14640 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 42  ree(p);.    *ppB
14650 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tree = 0;.  }els
14660 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  e{.    sqlite3_f
14670 69 6c 65 20 2a 70 46 69 6c 65 3b 0a 0a 20 20 20  ile *pFile;..   
14680 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
14690 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
146a0 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
146b0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
146c0 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 20 20 2a  ize to the.    *
146d0 2a 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  * default value.
146e0 20 45 78 63 65 70 74 2c 20 77 68 65 6e 20 6f 70   Except, when op
146f0 65 6e 69 6e 67 20 6f 6e 20 61 6e 20 65 78 69 73  ening on an exis
14700 74 69 6e 67 20 73 68 61 72 65 64 20 70 61 67 65  ting shared page
14710 72 2d 63 61 63 68 65 2c 0a 20 20 20 20 2a 2a 20  r-cache,.    ** 
14720 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68  do not change th
14730 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73 69  e pager-cache si
14740 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
14750 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  f( sqlite3BtreeS
14760 63 68 65 6d 61 28 70 2c 20 30 2c 20 30 29 3d 3d  chema(p, 0, 0)==
14770 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
14780 65 33 50 61 67 65 72 53 65 74 43 61 63 68 65 73  e3PagerSetCaches
14790 69 7a 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ize(p->pBt->pPag
147a0 65 72 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  er, SQLITE_DEFAU
147b0 4c 54 5f 43 41 43 48 45 5f 53 49 5a 45 29 3b 0a  LT_CACHE_SIZE);.
147c0 20 20 20 20 7d 0a 0a 20 20 20 20 70 46 69 6c 65      }..    pFile
147d0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46   = sqlite3PagerF
147e0 69 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ile(pBt->pPager)
147f0 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
14800 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
14810 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
14820 43 6f 6e 74 72 6f 6c 48 69 6e 74 28 70 46 69 6c  ControlHint(pFil
14830 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
14840 50 44 42 2c 20 28 76 6f 69 64 2a 29 26 70 42 74  PDB, (void*)&pBt
14850 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->db);.    }.  }
14860 0a 20 20 69 66 28 20 6d 75 74 65 78 4f 70 65 6e  .  if( mutexOpen
14870 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
14880 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14890 6c 64 28 6d 75 74 65 78 4f 70 65 6e 29 20 29 3b  ld(mutexOpen) );
148a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
148b0 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 4f 70  ex_leave(mutexOp
148c0 65 6e 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  en);.  }.  asser
148d0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
148e0 20 7c 7c 20 73 71 6c 69 74 65 33 42 74 72 65 65   || sqlite3Btree
148f0 43 6f 6e 6e 65 63 74 69 6f 6e 43 6f 75 6e 74 28  ConnectionCount(
14900 2a 70 70 42 74 72 65 65 29 3e 30 20 29 3b 0a 20  *ppBtree)>0 );. 
14910 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14920 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
14930 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
14940 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
14950 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
14960 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
14970 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
14980 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
14990 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
149a0 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
149b0 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
149c0 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
149d0 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
149e0 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
149f0 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
14a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
14a10 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
14a20 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
14a30 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
14a40 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
14a50 41 43 48 45 0a 20 20 4d 55 54 45 58 5f 4c 4f 47  ACHE.  MUTEX_LOG
14a60 49 43 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  IC( sqlite3_mute
14a70 78 20 2a 70 4d 61 73 74 65 72 3b 20 29 0a 20 20  x *pMaster; ).  
14a80 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74 3b  BtShared *pList;
14a90 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20 3d  .  int removed =
14aa0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   0;..  assert( s
14ab0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
14ac0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
14ad0 20 29 3b 0a 20 20 4d 55 54 45 58 5f 4c 4f 47 49   );.  MUTEX_LOGI
14ae0 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c  C( pMaster = sql
14af0 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
14b00 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
14b10 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20 20  IC_MASTER); ).  
14b20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
14b30 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ter(pMaster);.  
14b40 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  pBt->nRef--;.  i
14b50 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d 30 20  f( pBt->nRef<=0 
14b60 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f 42 41  ){.    if( GLOBA
14b70 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c 69  L(BtShared*,sqli
14b80 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69  te3SharedCacheLi
14b90 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20 20 20  st)==pBt ){.    
14ba0 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65    GLOBAL(BtShare
14bb0 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14bc0 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70 42 74  CacheList) = pBt
14bd0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c  ->pNext;.    }el
14be0 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  se{.      pList 
14bf0 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61 72 65  = GLOBAL(BtShare
14c00 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72 65 64  d*,sqlite3Shared
14c10 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20 20 20  CacheList);.    
14c20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
14c30 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
14c40 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
14c50 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
14c60 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
14c70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
14c80 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
14c90 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
14ca0 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
14cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14cc0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
14cd0 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
14ce0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
14cf0 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
14d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
14d10 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
14d20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14d30 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
14d40 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
14d50 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
14d60 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14d70 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
14d80 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
14d90 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
14da0 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
14db0 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
14dc0 20 77 69 74 68 20 61 20 34 2d 62 79 74 65 20 70   with a 4-byte p
14dd0 72 65 66 69 78 20 66 6f 72 20 61 20 6c 65 66 74  refix for a left
14de0 2d 63 68 69 6c 64 0a 2a 2a 20 70 6f 69 6e 74 65  -child.** pointe
14df0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
14e00 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70  d allocateTempSp
14e10 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
14e20 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e  t){.  if( !pBt->
14e30 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20  pTmpSpace ){.   
14e40 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14e50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
14e60 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69  loc( pBt->pageSi
14e70 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 6e  ze );..    /* On
14e80 65 20 6f 66 20 74 68 65 20 75 73 65 73 20 6f 66  e of the uses of
14e90 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20   pBt->pTmpSpace 
14ea0 69 73 20 74 6f 20 66 6f 72 6d 61 74 20 63 65 6c  is to format cel
14eb0 6c 73 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  ls before.    **
14ec0 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 6d 20   inserting them 
14ed0 69 6e 74 6f 20 61 20 6c 65 61 66 20 70 61 67 65  into a leaf page
14ee0 20 28 66 75 6e 63 74 69 6f 6e 20 66 69 6c 6c 49   (function fillI
14ef0 6e 43 65 6c 6c 28 29 29 2e 20 49 66 0a 20 20 20  nCell()). If.   
14f00 20 2a 2a 20 61 20 63 65 6c 6c 20 69 73 20 6c 65   ** a cell is le
14f10 73 73 20 74 68 61 6e 20 34 20 62 79 74 65 73 20  ss than 4 bytes 
14f20 69 6e 20 73 69 7a 65 2c 20 69 74 20 69 73 20 72  in size, it is r
14f30 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34 20 62  ounded up to 4 b
14f40 79 74 65 73 0a 20 20 20 20 2a 2a 20 62 79 20 74  ytes.    ** by t
14f50 68 65 20 76 61 72 69 6f 75 73 20 72 6f 75 74 69  he various routi
14f60 6e 65 73 20 74 68 61 74 20 6d 61 6e 69 70 75 6c  nes that manipul
14f70 61 74 65 20 62 69 6e 61 72 79 20 63 65 6c 6c 73  ate binary cells
14f80 2e 20 57 68 69 63 68 0a 20 20 20 20 2a 2a 20 63  . Which.    ** c
14f90 61 6e 20 6d 65 61 6e 20 74 68 61 74 20 66 69 6c  an mean that fil
14fa0 6c 49 6e 43 65 6c 6c 28 29 20 6f 6e 6c 79 20 69  lInCell() only i
14fb0 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 66  nitializes the f
14fc0 69 72 73 74 20 32 20 6f 72 20 33 0a 20 20 20 20  irst 2 or 3.    
14fd0 2a 2a 20 62 79 74 65 73 20 6f 66 20 70 54 6d 70  ** bytes of pTmp
14fe0 53 70 61 63 65 2c 20 62 75 74 20 74 68 61 74 20  Space, but that 
14ff0 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
15000 73 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  s are copied fro
15010 6d 0a 20 20 20 20 2a 2a 20 69 74 20 69 6e 74 6f  m.    ** it into
15020 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
15030 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 63  . This is not ac
15040 74 75 61 6c 6c 79 20 61 20 70 72 6f 62 6c 65 6d  tually a problem
15050 2c 20 62 75 74 20 69 74 0a 20 20 20 20 2a 2a 20  , but it.    ** 
15060 64 6f 65 73 20 63 61 75 73 65 20 61 20 76 61 6c  does cause a val
15070 67 72 69 6e 64 20 65 72 72 6f 72 20 77 68 65 6e  grind error when
15080 20 74 68 65 20 31 20 6f 72 20 32 20 62 79 74 65   the 1 or 2 byte
15090 73 20 6f 66 20 75 6e 69 74 69 61 6c 69 7a 65 64  s of unitialized
150a0 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73   .    ** data is
150b0 20 70 61 73 73 65 64 20 74 6f 20 73 79 73 74 65   passed to syste
150c0 6d 20 63 61 6c 6c 20 77 72 69 74 65 28 29 2e 20  m call write(). 
150d0 53 6f 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  So to avoid this
150e0 20 65 72 72 6f 72 2c 0a 20 20 20 20 2a 2a 20 7a   error,.    ** z
150f0 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 34 20  ero the first 4 
15100 62 79 74 65 73 20 6f 66 20 74 65 6d 70 20 73 70  bytes of temp sp
15110 61 63 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2a  ace here..    **
15120 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 3a 20 20 50  .    ** Also:  P
15130 72 6f 76 69 64 65 20 66 6f 75 72 20 62 79 74 65  rovide four byte
15140 73 20 6f 66 20 69 6e 69 74 69 61 6c 69 7a 65 64  s of initialized
15150 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 74 68   space before th
15160 65 0a 20 20 20 20 2a 2a 20 62 65 67 69 6e 6e 69  e.    ** beginni
15170 6e 67 20 6f 66 20 70 54 6d 70 53 70 61 63 65 20  ng of pTmpSpace 
15180 61 73 20 61 6e 20 61 72 65 61 20 61 76 61 69 6c  as an area avail
15190 61 62 6c 65 20 74 6f 20 70 72 65 70 65 6e 64 20  able to prepend 
151a0 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74 2d  the.    ** left-
151b0 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 20 74 6f  child pointer to
151c0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
151d0 66 20 61 20 63 65 6c 6c 2e 0a 20 20 20 20 2a 2f  f a cell..    */
151e0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54  .    if( pBt->pT
151f0 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  mpSpace ){.     
15200 20 6d 65 6d 73 65 74 28 70 42 74 2d 3e 70 54 6d   memset(pBt->pTm
15210 70 53 70 61 63 65 2c 20 30 2c 20 38 29 3b 0a 20  pSpace, 0, 8);. 
15220 20 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70       pBt->pTmpSp
15230 61 63 65 20 2b 3d 20 34 3b 0a 20 20 20 20 7d 0a  ace += 4;.    }.
15240 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
15250 65 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53  e the pBt->pTmpS
15260 70 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  pace allocation.
15270 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15280 72 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  reeTempSpace(BtS
15290 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
152a0 66 28 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  f( pBt->pTmpSpac
152b0 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54  e ){.    pBt->pT
152c0 6d 70 53 70 61 63 65 20 2d 3d 20 34 3b 0a 20 20  mpSpace -= 4;.  
152d0 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65    sqlite3PageFre
152e0 65 28 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  e(pBt->pTmpSpace
152f0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70  );.    pBt->pTmp
15300 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d  Space = 0;.  }.}
15310 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
15320 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61   open database a
15330 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c  nd invalidate al
15340 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e  l cursors..*/.in
15350 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  t sqlite3BtreeCl
15360 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ose(Btree *p){. 
15370 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15380 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72   p->pBt;.  BtCur
15390 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a  sor *pCur;..  /*
153a0 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f   Close all curso
153b0 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68  rs opened via th
153c0 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20  is handle.  */. 
153d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
153e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
153f0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
15400 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15410 28 70 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  (p);.  pCur = pB
15420 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
15430 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
15440 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
15450 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
15460 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15470 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
15480 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
15490 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
154a0 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
154b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
154c0 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
154d0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
154e0 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
154f0 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
15500 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
15510 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
15520 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
15530 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
15540 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
15550 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
15560 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
15570 63 6b 28 70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c  ck(p, SQLITE_OK,
15580 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   0);.  sqlite3Bt
15590 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a 20 20  reeLeave(p);..  
155a0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
155b0 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75 74 73  still other outs
155c0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
155d0 65 73 20 74 6f 20 74 68 65 20 73 68 61 72 65 64  es to the shared
155e0 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74 72 75  -btree.  ** stru
155f0 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20 6e 6f  cture, return no
15600 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64 65 72  w. The remainder
15610 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65 64 75   of this procedu
15620 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a 2a 20  re cleans .  ** 
15630 75 70 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  up the shared-bt
15640 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ree..  */.  asse
15650 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63  rt( p->wantToLoc
15660 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63 6b 65  k==0 && p->locke
15670 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 70  d==0 );.  if( !p
15680 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 72 65  ->sharable || re
15690 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
156a0 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ist(pBt) ){.    
156b0 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20 6e 6f  /* The pBt is no
156c0 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65 20 73   longer on the s
156d0 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73 6f 20  haring list, so 
156e0 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a 20 20  we can access.  
156f0 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75 74 20    ** it without 
15700 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64 20 74  having to hold t
15710 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20 2a 2a  he mutex..    **
15720 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20 6f 75  .    ** Clean ou
15730 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  t and delete the
15740 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74   BtShared object
15750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
15760 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75 72 73  ert( !pBt->pCurs
15770 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  or );.    sqlite
15780 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74 2d  3PagerClose(pBt-
15790 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 29 3b  >pPager, p->db);
157a0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
157b0 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
157c0 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
157d0 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
157e0 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
157f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
15800 69 74 65 33 44 62 46 72 65 65 28 30 2c 20 70 42  ite3DbFree(0, pB
15810 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  t->pSchema);.   
15820 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
15830 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
15840 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d 0a  _free(pBt);.  }.
15850 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15860 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
15870 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77  E.  assert( p->w
15880 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  antToLock==0 );.
15890 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
158a0 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
158b0 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70 50  p->pPrev ) p->pP
158c0 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e  rev->pNext = p->
158d0 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d 3e  pNext;.  if( p->
158e0 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78 74  pNext ) p->pNext
158f0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
15900 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71  ev;.#endif..  sq
15910 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
15920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15930 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
15940 67 65 20 74 68 65 20 22 73 6f 66 74 22 20 6c 69  ge the "soft" li
15950 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
15960 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
15970 65 20 63 61 63 68 65 2e 0a 2a 2a 20 55 6e 75 73  e cache..** Unus
15980 65 64 20 61 6e 64 20 75 6e 6d 6f 64 69 66 69 65  ed and unmodifie
15990 64 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  d pages will be 
159a0 72 65 63 79 63 6c 65 64 20 77 68 65 6e 20 74 68  recycled when th
159b0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
159c0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
159d0 65 20 65 78 63 65 65 64 73 20 74 68 69 73 20 73  e exceeds this s
159e0 6f 66 74 20 6c 69 6d 69 74 2e 20 20 42 75 74 20  oft limit.  But 
159f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
15a00 2a 2a 20 63 61 63 68 65 20 69 73 20 61 6c 6c 6f  ** cache is allo
15a10 77 65 64 20 74 6f 20 67 72 6f 77 20 6c 61 72 67  wed to grow larg
15a20 65 72 20 74 68 61 6e 20 74 68 69 73 20 6c 69 6d  er than this lim
15a30 69 74 20 69 66 20 69 74 20 63 6f 6e 74 61 69 6e  it if it contain
15a40 73 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 73  s.** dirty pages
15a50 20 6f 72 20 70 61 67 65 73 20 73 74 69 6c 6c 20   or pages still 
15a60 69 6e 20 61 63 74 69 76 65 20 75 73 65 2e 0a 2a  in active use..*
15a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
15a80 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
15a90 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
15aa0 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
15ab0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
15ac0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
15ad0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
15ae0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
15af0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
15b00 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
15b10 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
15b20 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
15b30 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
15b40 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15b60 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
15b70 67 65 20 74 68 65 20 22 73 70 69 6c 6c 22 20 6c  ge the "spill" l
15b80 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62  imit on the numb
15b90 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
15ba0 68 65 20 63 61 63 68 65 2e 0a 2a 2a 20 49 66 20  he cache..** If 
15bb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
15bc0 67 65 73 20 65 78 63 65 65 64 73 20 74 68 69 73  ges exceeds this
15bd0 20 6c 69 6d 69 74 20 64 75 72 69 6e 67 20 61 20   limit during a 
15be0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
15bf0 6e 2c 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  n,.** the pager 
15c00 6d 69 67 68 74 20 61 74 74 65 6d 70 74 20 74 6f  might attempt to
15c10 20 22 73 70 69 6c 6c 22 20 70 61 67 65 73 20 74   "spill" pages t
15c20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 61  o the journal ea
15c30 72 6c 79 20 69 6e 0a 2a 2a 20 6f 72 64 65 72 20  rly in.** order 
15c40 74 6f 20 66 72 65 65 20 75 70 20 6d 65 6d 6f 72  to free up memor
15c50 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c  y..**.** The val
15c60 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
15c70 68 65 20 63 75 72 72 65 6e 74 20 73 70 69 6c 6c  he current spill
15c80 20 73 69 7a 65 2e 20 20 49 66 20 7a 65 72 6f 20   size.  If zero 
15c90 69 73 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  is passed.** as 
15ca0 61 6e 20 61 72 67 75 6d 65 6e 74 2c 20 6e 6f 20  an argument, no 
15cb0 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
15cc0 20 74 6f 20 74 68 65 20 73 70 69 6c 6c 20 73 69   to the spill si
15cd0 7a 65 20 73 65 74 74 69 6e 67 2c 20 73 6f 0a 2a  ze setting, so.*
15ce0 2a 20 75 73 69 6e 67 20 6d 78 50 61 67 65 20 6f  * using mxPage o
15cf0 66 20 30 20 69 73 20 61 20 77 61 79 20 74 6f 20  f 0 is a way to 
15d00 71 75 65 72 79 20 74 68 65 20 63 75 72 72 65 6e  query the curren
15d10 74 20 73 70 69 6c 6c 20 73 69 7a 65 2e 0a 2a 2f  t spill size..*/
15d20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
15d30 65 53 65 74 53 70 69 6c 6c 53 69 7a 65 28 42 74  eSetSpillSize(Bt
15d40 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
15d50 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
15d60 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15d70 20 69 6e 74 20 72 65 73 3b 0a 20 20 61 73 73 65   int res;.  asse
15d80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
15d90 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
15da0 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
15db0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15dc0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 50    res = sqlite3P
15dd0 61 67 65 72 53 65 74 53 70 69 6c 6c 73 69 7a 65  agerSetSpillsize
15de0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
15df0 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
15e00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15e10 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
15e20 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
15e30 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
15e40 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69 6d 69   Change the limi
15e50 74 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20  t on the amount 
15e60 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
15e70 66 69 6c 65 20 74 68 61 74 20 6d 61 79 20 62 65  file that may be
15e80 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  .** memory mappe
15e90 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15ea0 33 42 74 72 65 65 53 65 74 4d 6d 61 70 4c 69 6d  3BtreeSetMmapLim
15eb0 69 74 28 42 74 72 65 65 20 2a 70 2c 20 73 71 6c  it(Btree *p, sql
15ec0 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61  ite3_int64 szMma
15ed0 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  p){.  BtShared *
15ee0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
15ef0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
15f00 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
15f10 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
15f20 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
15f30 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  p);.  sqlite3Pag
15f40 65 72 53 65 74 4d 6d 61 70 4c 69 6d 69 74 28 70  erSetMmapLimit(p
15f50 42 74 2d 3e 70 50 61 67 65 72 2c 20 73 7a 4d 6d  Bt->pPager, szMm
15f60 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ap);.  sqlite3Bt
15f70 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
15f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15f90 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15fa0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
15fb0 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68  E>0 */../*.** Ch
15fc0 61 6e 67 65 20 74 68 65 20 77 61 79 20 64 61 74  ange the way dat
15fd0 61 20 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64  a is synced to d
15fe0 69 73 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  isk in order to 
15ff0 69 6e 63 72 65 61 73 65 20 6f 72 20 64 65 63 72  increase or decr
16000 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c  ease.** how well
16010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72 65   the database re
16020 73 69 73 74 73 20 64 61 6d 61 67 65 20 64 75 65  sists damage due
16030 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61   to OS crashes a
16040 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c  nd power.** fail
16050 75 72 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69  ures.  Level 1 i
16060 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 61 73  s the same as as
16070 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73  ynchronous (no s
16080 79 6e 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64  yncs() occur and
16090 0a 2a 2a 20 74 68 65 72 65 20 69 73 20 61 20 68  .** there is a h
160a0 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20  igh probability 
160b0 6f 66 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65  of damage)  Leve
160c0 6c 20 32 20 69 73 20 74 68 65 20 64 65 66 61 75  l 2 is the defau
160d0 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73  lt.  There.** is
160e0 20 61 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20   a very low but 
160f0 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69  non-zero probabi
16100 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20  lity of damage. 
16110 20 4c 65 76 65 6c 20 33 20 72 65 64 75 63 65 73   Level 3 reduces
16120 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c   the.** probabil
16130 69 74 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f  ity of damage to
16140 20 6e 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77   near zero but w
16150 69 74 68 20 61 20 77 72 69 74 65 20 70 65 72 66  ith a write perf
16160 6f 72 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f  ormance reductio
16170 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  n..*/.#ifndef SQ
16180 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
16190 50 52 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69  PRAGMAS.int sqli
161a0 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 72  te3BtreeSetPager
161b0 46 6c 61 67 73 28 0a 20 20 42 74 72 65 65 20 2a  Flags(.  Btree *
161c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
161d0 2f 2a 20 54 68 65 20 62 74 72 65 65 20 74 6f 20  /* The btree to 
161e0 73 65 74 20 74 68 65 20 73 61 66 65 74 79 20 6c  set the safety l
161f0 65 76 65 6c 20 6f 6e 20 2a 2f 0a 20 20 75 6e 73  evel on */.  uns
16200 69 67 6e 65 64 20 70 67 46 6c 61 67 73 20 20 20  igned pgFlags   
16210 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 50      /* Various P
16220 41 47 45 52 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  AGER_* flags */.
16230 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
16240 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
16250 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16260 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
16270 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
16280 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
16290 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
162a0 72 53 65 74 46 6c 61 67 73 28 70 42 74 2d 3e 70  rSetFlags(pBt->p
162b0 50 61 67 65 72 2c 20 70 67 46 6c 61 67 73 29 3b  Pager, pgFlags);
162c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
162d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
162e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
162f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
16300 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
16310 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
16320 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
16330 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
16340 70 61 67 65 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  page..** Or, if 
16350 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 68 61  the page size ha
16360 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 66  s already been f
16370 69 78 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  ixed, return SQL
16380 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 0a 2a 2a  ITE_READONLY .**
16390 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e   without changin
163a0 67 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2a 0a 2a  g anything..**.*
163b0 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
163c0 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  must be a power 
163d0 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35 31 32  of 2 between 512
163e0 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49 66 20   and 65536.  If 
163f0 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65  the page.** size
16400 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73 20 6e   supplied does n
16410 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63 6f 6e  ot meet this con
16420 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74 68 65  straint then the
16430 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f   page size is no
16440 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a  t.** changed..**
16450 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73 20 61  .** Page sizes a
16460 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 74  re constrained t
16470 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  o be a power of 
16480 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68 65 20  two so that the 
16490 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65  region.** of the
164a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
164b0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20  sed for locking 
164c0 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 50 45  (beginning at PE
164d0 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74  NDING_BYTE,.** t
164e0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 70 61  he first byte pa
164f0 73 74 20 74 68 65 20 31 47 42 20 62 6f 75 6e 64  st the 1GB bound
16500 61 72 79 2c 20 30 78 34 30 30 30 30 30 30 30 29  ary, 0x40000000)
16510 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75 72 0a   needs to occur.
16520 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ** at the beginn
16530 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a  ing of a page..*
16540 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
16550 72 20 6e 52 65 73 65 72 76 65 20 69 73 20 6c 65  r nReserve is le
16560 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  ss than zero, th
16570 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
16580 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62 79 74   reserved.** byt
16590 65 73 20 70 65 72 20 70 61 67 65 20 69 73 20 6c  es per page is l
165a0 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
165b0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 46 69 78  *.** If the iFix
165c0 21 3d 30 20 74 68 65 6e 20 74 68 65 20 42 54 53  !=0 then the BTS
165d0 5f 50 41 47 45 53 49 5a 45 5f 46 49 58 45 44 20  _PAGESIZE_FIXED 
165e0 66 6c 61 67 20 69 73 20 73 65 74 20 73 6f 20 74  flag is set so t
165f0 68 61 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  hat the page siz
16600 65 0a 2a 2a 20 61 6e 64 20 61 75 74 6f 76 61 63  e.** and autovac
16610 75 75 6d 20 6d 6f 64 65 20 63 61 6e 20 6e 6f 20  uum mode can no 
16620 6c 6f 6e 67 65 72 20 62 65 20 63 68 61 6e 67 65  longer be change
16630 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16640 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a  3BtreeSetPageSiz
16650 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  e(Btree *p, int 
16660 70 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52  pageSize, int nR
16670 65 73 65 72 76 65 2c 20 69 6e 74 20 69 46 69 78  eserve, int iFix
16680 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
16690 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61  LITE_OK;.  BtSha
166a0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
166b0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65  t;.  assert( nRe
166c0 73 65 72 76 65 3e 3d 2d 31 20 26 26 20 6e 52 65  serve>=-1 && nRe
166d0 73 65 72 76 65 3c 3d 32 35 35 20 29 3b 0a 20 20  serve<=255 );.  
166e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
166f0 72 28 70 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  r(p);.#if SQLITE
16700 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 69 66 28  _HAS_CODEC.  if(
16710 20 6e 52 65 73 65 72 76 65 3e 70 42 74 2d 3e 6f   nReserve>pBt->o
16720 70 74 69 6d 61 6c 52 65 73 65 72 76 65 20 29 20  ptimalReserve ) 
16730 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65  pBt->optimalRese
16740 72 76 65 20 3d 20 28 75 38 29 6e 52 65 73 65 72  rve = (u8)nReser
16750 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ve;.#endif.  if(
16760 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 26   pBt->btsFlags &
16770 20 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49   BTS_PAGESIZE_FI
16780 58 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  XED ){.    sqlit
16790 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
167a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
167b0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
167c0 0a 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c  .  if( nReserve<
167d0 30 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76  0 ){.    nReserv
167e0 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
167f0 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
16800 69 7a 65 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ize;.  }.  asser
16810 74 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26  t( nReserve>=0 &
16820 26 20 6e 52 65 73 65 72 76 65 3c 3d 32 35 35 20  & nReserve<=255 
16830 29 3b 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a  );.  if( pageSiz
16840 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
16850 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
16860 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
16870 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
16880 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
16890 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
168a0 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
168b0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
168c0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
168d0 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
168e0 65 20 3d 20 28 75 33 32 29 70 61 67 65 53 69 7a  e = (u32)pageSiz
168f0 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
16900 70 61 63 65 28 70 42 74 29 3b 0a 20 20 7d 0a 20  pace(pBt);.  }. 
16910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
16920 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
16930 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
16940 3e 70 61 67 65 53 69 7a 65 2c 20 6e 52 65 73 65  >pageSize, nRese
16950 72 76 65 29 3b 0a 20 20 70 42 74 2d 3e 75 73 61  rve);.  pBt->usa
16960 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
16970 61 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e  ageSize - (u16)n
16980 52 65 73 65 72 76 65 3b 0a 20 20 69 66 28 20 69  Reserve;.  if( i
16990 46 69 78 20 29 20 70 42 74 2d 3e 62 74 73 46 6c  Fix ) pBt->btsFl
169a0 61 67 73 20 7c 3d 20 42 54 53 5f 50 41 47 45 53  ags |= BTS_PAGES
169b0 49 5a 45 5f 46 49 58 45 44 3b 0a 20 20 73 71 6c  IZE_FIXED;.  sql
169c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
169d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
169e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
169f0 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64 65  the currently de
16a00 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65 0a  fined page size.
16a10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
16a20 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28 42  reeGetPageSize(B
16a30 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  tree *p){.  retu
16a40 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53  rn p->pBt->pageS
16a50 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
16a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
16a70 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74 65  imilar to sqlite
16a80 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76 65  3BtreeGetReserve
16a90 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74 20  (), except that 
16aa0 69 74 0a 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 62  it.** may only b
16ab0 65 20 63 61 6c 6c 65 64 20 69 66 20 69 74 20 69  e called if it i
16ac0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
16ad0 74 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  t the b-tree mut
16ae0 65 78 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a  ex is already.**
16af0 20 68 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   held..**.** Thi
16b00 73 20 69 73 20 75 73 65 66 75 6c 20 69 6e 20 6f  s is useful in o
16b10 6e 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  ne special case 
16b20 69 6e 20 74 68 65 20 62 61 63 6b 75 70 20 41 50  in the backup AP
16b30 49 20 63 6f 64 65 20 77 68 65 72 65 20 69 74 20  I code where it 
16b40 69 73 0a 2a 2a 20 6b 6e 6f 77 6e 20 74 68 61 74  is.** known that
16b50 20 74 68 65 20 73 68 61 72 65 64 20 62 2d 74 72   the shared b-tr
16b60 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64  ee mutex is held
16b70 2c 20 62 75 74 20 74 68 65 20 6d 75 74 65 78 20  , but the mutex 
16b80 6f 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  on the .** datab
16b90 61 73 65 20 68 61 6e 64 6c 65 20 74 68 61 74 20  ase handle that 
16ba0 6f 77 6e 73 20 2a 70 20 69 73 20 6e 6f 74 2e 20  owns *p is not. 
16bb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 66 20  In this case if 
16bc0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
16bd0 72 28 29 0a 2a 2a 20 77 65 72 65 20 74 6f 20 62  r().** were to b
16be0 65 20 63 61 6c 6c 65 64 2c 20 69 74 20 6d 69 67  e called, it mig
16bf0 68 74 20 63 6f 6c 6c 69 64 65 20 77 69 74 68 20  ht collide with 
16c00 73 6f 6d 65 20 6f 74 68 65 72 20 6f 70 65 72 61  some other opera
16c10 74 69 6f 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  tion 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 2c 20 63 61 75  hat owns *p, cau
16c40 73 69 6e 67 20 75 6e 64 65 66 69 6e 65 64 20 62  sing undefined b
16c50 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
16c60 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 52  sqlite3BtreeGetR
16c70 65 73 65 72 76 65 4e 6f 4d 75 74 65 78 28 42 74  eserveNoMutex(Bt
16c80 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
16c90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
16ca0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
16cb0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
16cc0 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70  .  n = p->pBt->p
16cd0 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74  ageSize - p->pBt
16ce0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  ->usableSize;.  
16cf0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
16d00 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
16d10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
16d20 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
16d30 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
16d40 74 68 61 74 0a 2a 2a 20 61 72 65 20 69 6e 74 65  that.** are inte
16d50 6e 74 75 61 6c 6c 79 20 6c 65 66 74 20 75 6e 75  ntually left unu
16d60 73 65 64 2e 20 20 54 68 69 73 20 69 73 20 74 68  sed.  This is th
16d70 65 20 22 72 65 73 65 72 76 65 64 22 20 73 70 61  e "reserved" spa
16d80 63 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 73 6f  ce that is.** so
16d90 6d 65 74 69 6d 65 73 20 75 73 65 64 20 62 79 20  metimes used by 
16da0 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a  extensions..**.*
16db0 2a 20 49 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  * If SQLITE_HAS_
16dc0 4d 55 54 45 58 20 69 73 20 64 65 66 69 6e 65 64  MUTEX is defined
16dd0 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
16de0 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65   returned is the
16df0 0a 2a 2a 20 67 72 65 61 74 65 72 20 6f 66 20 74  .** greater of t
16e00 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 65 72  he current reser
16e10 76 65 64 20 73 70 61 63 65 20 61 6e 64 20 74 68  ved space and th
16e20 65 20 6d 61 78 69 6d 75 6d 20 72 65 71 75 65 73  e maximum reques
16e30 74 65 64 0a 2a 2a 20 72 65 73 65 72 76 65 20 73  ted.** reserve s
16e40 70 61 63 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  pace..*/.int sql
16e50 69 74 65 33 42 74 72 65 65 47 65 74 4f 70 74 69  ite3BtreeGetOpti
16e60 6d 61 6c 52 65 73 65 72 76 65 28 42 74 72 65 65  malReserve(Btree
16e70 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
16e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
16e90 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c  er(p);.  n = sql
16ea0 69 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65  ite3BtreeGetRese
16eb0 72 76 65 4e 6f 4d 75 74 65 78 28 70 29 3b 0a 23  rveNoMutex(p);.#
16ec0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
16ed0 5f 43 4f 44 45 43 0a 20 20 69 66 28 20 6e 3c 70  _CODEC.  if( n<p
16ee0 2d 3e 70 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65  ->pBt->optimalRe
16ef0 73 65 72 76 65 20 29 20 6e 20 3d 20 70 2d 3e 70  serve ) n = p->p
16f00 42 74 2d 3e 6f 70 74 69 6d 61 6c 52 65 73 65 72  Bt->optimalReser
16f10 76 65 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  ve;.#endif.  sql
16f20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
16f30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
16f40 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  .../*.** Set the
16f50 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
16f60 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
16f70 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
16f80 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
16f90 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
16fa0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
16fb0 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
16fc0 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
16fd0 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
16fe0 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
16ff0 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17000 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17010 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
17020 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
17030 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
17040 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17050 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
17060 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
17070 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
17080 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
17090 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
170a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
170b0 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn n;.}../*.** S
170c0 65 74 20 74 68 65 20 42 54 53 5f 53 45 43 55 52  et the BTS_SECUR
170d0 45 5f 44 45 4c 45 54 45 20 66 6c 61 67 20 69 66  E_DELETE flag if
170e0 20 6e 65 77 46 6c 61 67 20 69 73 20 30 20 6f 72   newFlag is 0 or
170f0 20 31 2e 20 20 49 66 20 6e 65 77 46 6c 61 67 20   1.  If newFlag 
17100 69 73 20 2d 31 2c 0a 2a 2a 20 74 68 65 6e 20 6d  is -1,.** then m
17110 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 2e 20  ake no changes. 
17120 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 74   Always return t
17130 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
17140 42 54 53 5f 53 45 43 55 52 45 5f 44 45 4c 45 54  BTS_SECURE_DELET
17150 45 0a 2a 2a 20 73 65 74 74 69 6e 67 20 61 66 74  E.** setting aft
17160 65 72 20 74 68 65 20 63 68 61 6e 67 65 2e 0a 2a  er the change..*
17170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
17180 65 65 53 65 63 75 72 65 44 65 6c 65 74 65 28 42  eeSecureDelete(B
17190 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 65 77  tree *p, int new
171a0 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 62 3b 0a  Flag){.  int b;.
171b0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
171c0 75 72 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  urn 0;.  sqlite3
171d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
171e0 20 69 66 28 20 6e 65 77 46 6c 61 67 3e 3d 30 20   if( newFlag>=0 
171f0 29 7b 0a 20 20 20 20 70 2d 3e 70 42 74 2d 3e 62  ){.    p->pBt->b
17200 74 73 46 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f  tsFlags &= ~BTS_
17210 53 45 43 55 52 45 5f 44 45 4c 45 54 45 3b 0a 20  SECURE_DELETE;. 
17220 20 20 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29     if( newFlag )
17230 20 70 2d 3e 70 42 74 2d 3e 62 74 73 46 6c 61 67   p->pBt->btsFlag
17240 73 20 7c 3d 20 42 54 53 5f 53 45 43 55 52 45 5f  s |= BTS_SECURE_
17250 44 45 4c 45 54 45 3b 0a 20 20 7d 20 0a 20 20 62  DELETE;.  } .  b
17260 20 3d 20 28 70 2d 3e 70 42 74 2d 3e 62 74 73 46   = (p->pBt->btsF
17270 6c 61 67 73 20 26 20 42 54 53 5f 53 45 43 55 52  lags & BTS_SECUR
17280 45 5f 44 45 4c 45 54 45 29 21 3d 30 3b 0a 20 20  E_DELETE)!=0;.  
17290 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
172a0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  e(p);.  return b
172b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
172c0 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
172d0 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
172e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
172f0 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
17300 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
17310 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
17320 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
17330 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
17340 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
17350 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
17360 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
17370 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
17380 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
17390 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
173a0 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
173b0 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
173c0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
173d0 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
173e0 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
173f0 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
17400 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
17410 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
17420 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
17430 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
17440 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
17450 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
17460 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
17470 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f 56  8 av = (u8)autoV
17480 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74 65  acuum;..  sqlite
17490 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
174a0 20 20 69 66 28 20 28 70 42 74 2d 3e 62 74 73 46    if( (pBt->btsF
174b0 6c 61 67 73 20 26 20 42 54 53 5f 50 41 47 45 53  lags & BTS_PAGES
174c0 49 5a 45 5f 46 49 58 45 44 29 21 3d 30 20 26 26  IZE_FIXED)!=0 &&
174d0 20 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d   (av ?1:0)!=pBt-
174e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
174f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
17500 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65  EADONLY;.  }else
17510 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56  {.    pBt->autoV
17520 61 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b  acuum = av ?1:0;
17530 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61  .    pBt->incrVa
17540 63 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a  cuum = av==2 ?1:
17550 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
17560 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
17570 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
17580 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
17590 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
175a0 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
175b0 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
175c0 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
175d0 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
175e0 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
175f0 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
17600 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
17610 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
17620 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
17630 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
17640 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
17650 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
17660 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
17670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17680 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
17690 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
176a0 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
176b0 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
176c0 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
176d0 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
176e0 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
176f0 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
17700 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
17710 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
17720 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
17730 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
17740 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
17750 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
17760 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
17770 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
17780 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
17790 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
177a0 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
177b0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
177c0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
177d0 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
177e0 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
177f0 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
17800 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
17810 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
17820 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
17830 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
17840 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
17850 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
17860 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
17870 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
17880 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
17890 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
178a0 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
178b0 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
178c0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
178d0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
178e0 6f 64 65 20 66 72 6f 6d 20 73 75 62 66 75 6e 63  ode from subfunc
178f0 74 69 6f 6e 73 20 2a 2f 0a 20 20 4d 65 6d 50 61  tions */.  MemPa
17900 67 65 20 2a 70 50 61 67 65 31 3b 20 20 20 20 20  ge *pPage1;     
17910 2f 2a 20 50 61 67 65 20 31 20 6f 66 20 74 68 65  /* Page 1 of the
17920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
17930 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
17940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17950 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
17960 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
17970 20 69 6e 74 20 6e 50 61 67 65 46 69 6c 65 20 3d   int nPageFile =
17980 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
17990 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
179a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
179b0 0a 20 20 69 6e 74 20 6e 50 61 67 65 48 65 61 64  .  int nPageHead
179c0 65 72 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  er;     /* Numbe
179d0 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
179e0 65 20 64 61 74 61 62 61 73 65 20 61 63 63 6f 72  e database accor
179f0 64 69 6e 67 20 74 6f 20 68 64 72 20 2a 2f 0a 0a  ding to hdr */..
17a00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
17a10 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
17a20 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
17a30 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
17a40 31 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  1==0 );.  rc = s
17a50 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
17a60 64 4c 6f 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  dLock(pBt->pPage
17a70 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17a80 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
17a90 20 72 63 3b 0a 20 20 72 63 20 3d 20 62 74 72 65   rc;.  rc = btre
17aa0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
17ab0 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20   &pPage1, 0);.  
17ac0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17ad0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
17ae0 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65    /* Do some che
17af0 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e  cking to help in
17b00 73 75 72 65 20 74 68 65 20 66 69 6c 65 20 77 65  sure the file we
17b10 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79 20 69   opened really i
17b20 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 64  s.  ** a valid d
17b30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 20  atabase file. . 
17b40 20 2a 2f 0a 20 20 6e 50 61 67 65 20 3d 20 6e 50   */.  nPage = nP
17b50 61 67 65 48 65 61 64 65 72 20 3d 20 67 65 74 34  ageHeader = get4
17b60 62 79 74 65 28 32 38 2b 28 75 38 2a 29 70 50 61  byte(28+(u8*)pPa
17b70 67 65 31 2d 3e 61 44 61 74 61 29 3b 0a 20 20 73  ge1->aData);.  s
17b80 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
17b90 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
17ba0 2c 20 26 6e 50 61 67 65 46 69 6c 65 29 3b 0a 20  , &nPageFile);. 
17bb0 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 7c 7c   if( nPage==0 ||
17bc0 20 6d 65 6d 63 6d 70 28 32 34 2b 28 75 38 2a 29   memcmp(24+(u8*)
17bd0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 2c 20 39  pPage1->aData, 9
17be0 32 2b 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61  2+(u8*)pPage1->a
17bf0 44 61 74 61 2c 34 29 21 3d 30 20 29 7b 0a 20 20  Data,4)!=0 ){.  
17c00 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 46    nPage = nPageF
17c10 69 6c 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ile;.  }.  if( n
17c20 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
17c30 32 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  2 pageSize;.    
17c40 75 33 32 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  u32 usableSize;.
17c50 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
17c60 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
17c70 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17c80 4f 54 41 44 42 3b 0a 20 20 20 20 2f 2a 20 45 56  OTADB;.    /* EV
17c90 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 33 37  IDENCE-OF: R-437
17ca0 33 37 2d 33 39 39 39 39 20 45 76 65 72 79 20 76  37-39999 Every v
17cb0 61 6c 69 64 20 53 51 4c 69 74 65 20 64 61 74 61  alid SQLite data
17cc0 62 61 73 65 20 66 69 6c 65 20 62 65 67 69 6e 73  base file begins
17cd0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
17ce0 20 66 6f 6c 6c 6f 77 69 6e 67 20 31 36 20 62 79   following 16 by
17cf0 74 65 73 20 28 69 6e 20 68 65 78 29 3a 20 35 33  tes (in hex): 53
17d00 20 35 31 20 34 63 20 36 39 20 37 34 20 36 35 20   51 4c 69 74 65 
17d10 32 30 20 36 36 20 36 66 20 37 32 20 36 64 0a 20  20 66 6f 72 6d. 
17d20 20 20 20 2a 2a 20 36 31 20 37 34 20 32 30 20 33     ** 61 74 20 3
17d30 33 20 30 30 2e 20 2a 2f 0a 20 20 20 20 69 66 28  3 00. */.    if(
17d40 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a   memcmp(page1, z
17d50 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29  MagicHeader, 16)
17d60 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
17d70 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
17d80 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64  led;.    }..#ifd
17d90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
17da0 41 4c 0a 20 20 20 20 69 66 28 20 70 61 67 65 31  AL.    if( page1
17db0 5b 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [18]>1 ){.      
17dc0 70 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d  pBt->btsFlags |=
17dd0 20 42 54 53 5f 52 45 41 44 5f 4f 4e 4c 59 3b 0a   BTS_READ_ONLY;.
17de0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 61      }.    if( pa
17df0 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20  ge1[19]>1 ){.   
17e00 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
17e10 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
17e20 0a 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70  .#else.    if( p
17e30 61 67 65 31 5b 31 38 5d 3e 32 20 29 7b 0a 20 20  age1[18]>2 ){.  
17e40 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c 61 67      pBt->btsFlag
17e50 73 20 7c 3d 20 42 54 53 5f 52 45 41 44 5f 4f 4e  s |= BTS_READ_ON
17e60 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LY;.    }.    if
17e70 28 20 70 61 67 65 31 5b 31 39 5d 3e 32 20 29 7b  ( page1[19]>2 ){
17e80 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
17e90 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
17ea0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
17eb0 74 68 65 20 77 72 69 74 65 20 76 65 72 73 69 6f  the write versio
17ec0 6e 20 69 73 20 73 65 74 20 74 6f 20 32 2c 20 74  n is set to 2, t
17ed0 68 69 73 20 64 61 74 61 62 61 73 65 20 73 68 6f  his database sho
17ee0 75 6c 64 20 62 65 20 61 63 63 65 73 73 65 64 0a  uld be accessed.
17ef0 20 20 20 20 2a 2a 20 69 6e 20 57 41 4c 20 6d 6f      ** in WAL mo
17f00 64 65 2e 20 49 66 20 74 68 65 20 6c 6f 67 20 69  de. If the log i
17f10 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
17f20 65 6e 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  en, open it now.
17f30 20 54 68 65 6e 20 0a 20 20 20 20 2a 2a 20 72 65   Then .    ** re
17f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
17f50 6e 64 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  nd return withou
17f60 74 20 70 6f 70 75 6c 61 74 69 6e 67 20 42 74 53  t populating BtS
17f70 68 61 72 65 64 2e 70 50 61 67 65 31 2e 0a 20 20  hared.pPage1..  
17f80 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20    ** The caller 
17f90 64 65 74 65 63 74 73 20 74 68 69 73 20 61 6e 64  detects this and
17fa0 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63   calls this func
17fb0 74 69 6f 6e 20 61 67 61 69 6e 2e 20 54 68 69 73  tion again. This
17fc0 20 69 73 0a 20 20 20 20 2a 2a 20 72 65 71 75 69   is.    ** requi
17fd0 72 65 64 20 61 73 20 74 68 65 20 76 65 72 73 69  red as the versi
17fe0 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 63 75 72  on of page 1 cur
17ff0 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61  rently in the pa
18000 67 65 31 20 62 75 66 66 65 72 0a 20 20 20 20 2a  ge1 buffer.    *
18010 2a 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 68 65  * may not be the
18020 20 6c 61 74 65 73 74 20 76 65 72 73 69 6f 6e 20   latest version 
18030 2d 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 61  - there may be a
18040 20 6e 65 77 65 72 20 6f 6e 65 20 69 6e 20 74 68   newer one in th
18050 65 20 6c 6f 67 0a 20 20 20 20 2a 2a 20 66 69 6c  e log.    ** fil
18060 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
18070 28 20 70 61 67 65 31 5b 31 39 5d 3d 3d 32 20 26  ( page1[19]==2 &
18080 26 20 28 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  & (pBt->btsFlags
18090 20 26 20 42 54 53 5f 4e 4f 5f 57 41 4c 29 3d 3d   & BTS_NO_WAL)==
180a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
180b0 73 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  sOpen = 0;.     
180c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
180d0 65 72 4f 70 65 6e 57 61 6c 28 70 42 74 2d 3e 70  erOpenWal(pBt->p
180e0 50 61 67 65 72 2c 20 26 69 73 4f 70 65 6e 29 3b  Pager, &isOpen);
180f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
18100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18110 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
18120 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
18130 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 53 51 4c    }else{.#if SQL
18140 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 59 4e 43  ITE_DEFAULT_SYNC
18150 48 52 4f 4e 4f 55 53 21 3d 53 51 4c 49 54 45 5f  HRONOUS!=SQLITE_
18160 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e 43  DEFAULT_WAL_SYNC
18170 48 52 4f 4e 4f 55 53 0a 20 20 20 20 20 20 20 20  HRONOUS.        
18180 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20  sqlite3 *db;.   
18190 20 20 20 20 20 44 62 20 2a 70 44 62 3b 0a 20 20       Db *pDb;.  
181a0 20 20 20 20 20 20 69 66 28 20 28 64 62 3d 70 42        if( (db=pB
181b0 74 2d 3e 64 62 29 21 3d 30 20 26 26 20 28 70 44  t->db)!=0 && (pD
181c0 62 3d 64 62 2d 3e 61 44 62 29 21 3d 30 20 29 7b  b=db->aDb)!=0 ){
181d0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
181e0 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 7c 7c  ( pDb->pBt==0 ||
181f0 20 70 44 62 2d 3e 70 42 74 2d 3e 70 42 74 21 3d   pDb->pBt->pBt!=
18200 70 42 74 20 29 7b 20 70 44 62 2b 2b 3b 20 7d 0a  pBt ){ pDb++; }.
18210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 44            if( pD
18220 62 2d 3e 62 53 79 6e 63 53 65 74 3d 3d 30 0a 20  b->bSyncSet==0. 
18230 20 20 20 20 20 20 20 20 20 20 26 26 20 70 44 62            && pDb
18240 2d 3e 73 61 66 65 74 79 5f 6c 65 76 65 6c 3d 3d  ->safety_level==
18250 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
18260 59 4e 43 48 52 4f 4e 4f 55 53 2b 31 0a 20 20 20  YNCHRONOUS+1.   
18270 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
18280 20 20 20 20 20 20 70 44 62 2d 3e 73 61 66 65 74        pDb->safet
18290 79 5f 6c 65 76 65 6c 20 3d 20 53 51 4c 49 54 45  y_level = SQLITE
182a0 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 53 59 4e  _DEFAULT_WAL_SYN
182b0 43 48 52 4f 4e 4f 55 53 2b 31 3b 0a 20 20 20 20  CHRONOUS+1;.    
182c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
182d0 61 67 65 72 53 65 74 46 6c 61 67 73 28 70 42 74  agerSetFlags(pBt
182e0 2d 3e 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  ->pPager,.      
182f0 20 20 20 20 20 20 20 20 20 70 44 62 2d 3e 73 61           pDb->sa
18300 66 65 74 79 5f 6c 65 76 65 6c 20 7c 20 28 64 62  fety_level | (db
18310 2d 3e 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f  ->flags & PAGER_
18320 46 4c 41 47 53 5f 4d 41 53 4b 29 29 3b 0a 20 20  FLAGS_MASK));.  
18330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18340 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
18350 20 20 20 69 66 28 20 69 73 4f 70 65 6e 3d 3d 30     if( isOpen==0
18360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
18370 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31  leasePage(pPage1
18380 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
18390 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
183a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
183b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
183c0 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 7d  TE_NOTADB;.    }
183d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
183e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
183f0 35 34 36 35 2d 32 30 38 31 33 20 54 68 65 20 6d  5465-20813 The m
18400 61 78 69 6d 75 6d 20 61 6e 64 20 6d 69 6e 69 6d  aximum and minim
18410 75 6d 20 65 6d 62 65 64 64 65 64 20 70 61 79 6c  um embedded payl
18420 6f 61 64 0a 20 20 20 20 2a 2a 20 66 72 61 63 74  oad.    ** fract
18430 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 6c 65 61  ions and the lea
18440 66 20 70 61 79 6c 6f 61 64 20 66 72 61 63 74 69  f payload fracti
18450 6f 6e 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  on values must b
18460 65 20 36 34 2c 20 33 32 2c 20 61 6e 64 20 33 32  e 64, 32, and 32
18470 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
18480 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73  The original des
18490 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73  ign allowed thes
184a0 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72  e amounts to var
184b0 79 2c 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20  y, but as of.   
184c0 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e   ** version 3.6.
184d0 30 2c 20 77 65 20 72 65 71 75 69 72 65 20 74 68  0, we require th
184e0 65 6d 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a  em to be fixed..
184f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d      */.    if( m
18500 65 6d 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d  emcmp(&page1[21]
18510 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22  , "\100\040\040"
18520 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,3)!=0 ){.      
18530 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
18540 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
18550 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18560 3a 20 52 2d 35 31 38 37 33 2d 33 39 36 31 38 20  : R-51873-39618 
18570 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 66 6f  The page size fo
18580 72 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  r a database fil
18590 65 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 74 65  e is.    ** dete
185a0 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 32 2d  rmined by the 2-
185b0 62 79 74 65 20 69 6e 74 65 67 65 72 20 6c 6f 63  byte integer loc
185c0 61 74 65 64 20 61 74 20 61 6e 20 6f 66 66 73 65  ated at an offse
185d0 74 20 6f 66 20 31 36 20 62 79 74 65 73 20 66 72  t of 16 bytes fr
185e0 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 62 65  om.    ** the be
185f0 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  ginning of the d
18600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
18610 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
18620 28 70 61 67 65 31 5b 31 36 5d 3c 3c 38 29 20 7c  (page1[16]<<8) |
18630 20 28 70 61 67 65 31 5b 31 37 5d 3c 3c 31 36 29   (page1[17]<<16)
18640 3b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  ;.    /* EVIDENC
18650 45 2d 4f 46 3a 20 52 2d 32 35 30 30 38 2d 32 31  E-OF: R-25008-21
18660 36 38 38 20 54 68 65 20 73 69 7a 65 20 6f 66 20  688 The size of 
18670 61 20 70 61 67 65 20 69 73 20 61 20 70 6f 77 65  a page is a powe
18680 72 20 6f 66 20 74 77 6f 0a 20 20 20 20 2a 2a 20  r of two.    ** 
18690 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20  between 512 and 
186a0 36 35 35 33 36 20 69 6e 63 6c 75 73 69 76 65 2e  65536 inclusive.
186b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28 70 61   */.    if( ((pa
186c0 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69  geSize-1)&pageSi
186d0 7a 65 29 21 3d 30 0a 20 20 20 20 20 7c 7c 20 70  ze)!=0.     || p
186e0 61 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d  ageSize>SQLITE_M
186f0 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20 20  AX_PAGE_SIZE .  
18700 20 20 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 3d     || pageSize<=
18710 32 35 36 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  256 .    ){.    
18720 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69    goto page1_ini
18730 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a  t_failed;.    }.
18740 20 20 20 20 61 73 73 65 72 74 28 20 28 70 61 67      assert( (pag
18750 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
18760 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18770 2d 4f 46 3a 20 52 2d 35 39 33 31 30 2d 35 31 32  -OF: R-59310-512
18780 30 35 20 54 68 65 20 22 72 65 73 65 72 76 65 64  05 The "reserved
18790 20 73 70 61 63 65 22 20 73 69 7a 65 20 69 6e 20   space" size in 
187a0 74 68 65 20 31 2d 62 79 74 65 0a 20 20 20 20 2a  the 1-byte.    *
187b0 2a 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  * integer at off
187c0 73 65 74 20 32 30 20 69 73 20 74 68 65 20 6e 75  set 20 is the nu
187d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
187e0 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
187f0 64 20 6f 66 0a 20 20 20 20 2a 2a 20 65 61 63 68  d of.    ** each
18800 20 70 61 67 65 20 74 6f 20 72 65 73 65 72 76 65   page to reserve
18810 20 66 6f 72 20 65 78 74 65 6e 73 69 6f 6e 73 2e   for extensions.
18820 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
18830 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
18840 37 34 39 37 2d 34 32 34 31 32 20 54 68 65 20 73  7497-42412 The s
18850 69 7a 65 20 6f 66 20 74 68 65 20 72 65 73 65 72  ize of the reser
18860 76 65 64 20 72 65 67 69 6f 6e 20 69 73 0a 20 20  ved region is.  
18870 20 20 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20    ** determined 
18880 62 79 20 74 68 65 20 6f 6e 65 2d 62 79 74 65 20  by the one-byte 
18890 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
188a0 20 66 6f 75 6e 64 20 61 74 20 61 6e 20 6f 66 66   found at an off
188b0 73 65 74 20 6f 66 20 32 30 0a 20 20 20 20 2a 2a  set of 20.    **
188c0 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
188d0 73 65 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  se file header. 
188e0 2a 2f 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  */.    usableSiz
188f0 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
18900 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
18910 28 20 28 75 33 32 29 70 61 67 65 53 69 7a 65 21  ( (u32)pageSize!
18920 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
18930 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
18940 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
18950 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
18960 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
18970 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
18980 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
18990 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
189a0 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
189b0 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
189c0 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
189d0 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
189e0 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
189f0 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
18a00 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
18a10 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
18a20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
18a30 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
18a40 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
18a50 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
18a60 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
18a70 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
18a80 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
18a90 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
18aa0 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
18ab0 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53  leSize = usableS
18ac0 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  ize;.      pBt->
18ad0 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
18ae0 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65 54  ize;.      freeT
18af0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
18b00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
18b10 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a  3PagerSetPagesiz
18b20 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26  e(pBt->pPager, &
18b30 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  pBt->pageSize,. 
18b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b60 20 20 70 61 67 65 53 69 7a 65 2d 75 73 61 62 6c    pageSize-usabl
18b70 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65  eSize);.      re
18b80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18b90 20 20 20 69 66 28 20 28 70 42 74 2d 3e 64 62 2d     if( (pBt->db-
18ba0 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
18bb0 52 65 63 6f 76 65 72 79 4d 6f 64 65 29 3d 3d 30  RecoveryMode)==0
18bc0 20 26 26 20 6e 50 61 67 65 3e 6e 50 61 67 65 46   && nPage>nPageF
18bd0 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ile ){.      rc 
18be0 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
18bf0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
18c00 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
18c10 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  led;.    }.    /
18c20 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
18c30 2d 32 38 33 31 32 2d 36 34 37 30 34 20 48 6f 77  -28312-64704 How
18c40 65 76 65 72 2c 20 74 68 65 20 75 73 61 62 6c 65  ever, the usable
18c50 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 61 6c 6c   size is not all
18c60 6f 77 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 62  owed to.    ** b
18c70 65 20 6c 65 73 73 20 74 68 61 6e 20 34 38 30 2e  e less than 480.
18c80 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
18c90 20 69 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   if the page siz
18ca0 65 20 69 73 20 35 31 32 2c 20 74 68 65 6e 20 74  e is 512, then t
18cb0 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 65 72 76  he.    ** reserv
18cc0 65 64 20 73 70 61 63 65 20 73 69 7a 65 20 63 61  ed space size ca
18cd0 6e 6e 6f 74 20 65 78 63 65 65 64 20 33 32 2e 20  nnot exceed 32. 
18ce0 2a 2f 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c  */.    if( usabl
18cf0 65 53 69 7a 65 3c 34 38 30 20 29 7b 0a 20 20 20  eSize<480 ){.   
18d00 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
18d10 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
18d20 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
18d30 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
18d40 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69     pBt->usableSi
18d50 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b  ze = usableSize;
18d60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18d70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
18d80 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63      pBt->autoVac
18d90 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
18da0 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34 5d  &page1[36 + 4*4]
18db0 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74 2d  )?1:0);.    pBt-
18dc0 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 67  >incrVacuum = (g
18dd0 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
18de0 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 7*4])?1:0);.
18df0 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a  #endif.  }..  /*
18e00 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68 65   maxLocal is the
18e10 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74 20   maximum amount 
18e20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73 74  of payload to st
18e30 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a  ore locally for.
18e40 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d 61    ** a cell.  Ma
18e50 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73 6d  ke sure it is sm
18e60 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74 68  all enough so th
18e70 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e 46  at at least minF
18e80 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c 73  anout.  ** cells
18e90 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e   can will fit on
18ea0 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20 61   one page.  We a
18eb0 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65 20  ssume a 10-byte 
18ec0 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20 2a  page header..  *
18ed0 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70 61  * Besides the pa
18ee0 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c 20  yload, the cell 
18ef0 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a 2a  must store:.  **
18f00 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69 6e       2-byte poin
18f10 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 0a  ter to the cell.
18f20 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
18f30 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20 20  child pointer.  
18f40 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e 4b  **     9-byte nK
18f50 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20  ey value.  **   
18f60 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20 76    4-byte nData v
18f70 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
18f80 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70 61  byte overflow pa
18f90 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20  ge pointer.  ** 
18fa0 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69 73  So a cell consis
18fb0 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20 70  ts of a 2-byte p
18fc0 6f 69 6e 74 65 72 2c 20 61 20 68 65 61 64 65 72  ointer, a header
18fd0 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
18fe0 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
18ff0 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
19000 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
19010 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
19020 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
19030 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
19040 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
19050 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 75 31 36  >maxLocal = (u16
19060 29 28 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  )((pBt->usableSi
19070 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
19080 32 33 29 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c  23);.  pBt->minL
19090 6f 63 61 6c 20 3d 20 28 75 31 36 29 28 28 70 42  ocal = (u16)((pB
190a0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32  t->usableSize-12
190b0 29 2a 33 32 2f 32 35 35 20 2d 20 32 33 29 3b 0a  )*32/255 - 23);.
190c0 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d    pBt->maxLeaf =
190d0 20 28 75 31 36 29 28 70 42 74 2d 3e 75 73 61 62   (u16)(pBt->usab
190e0 6c 65 53 69 7a 65 20 2d 20 33 35 29 3b 0a 20 20  leSize - 35);.  
190f0 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20 28  pBt->minLeaf = (
19100 75 31 36 29 28 28 70 42 74 2d 3e 75 73 61 62 6c  u16)((pBt->usabl
19110 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
19120 20 2d 20 32 33 29 3b 0a 20 20 69 66 28 20 70 42   - 23);.  if( pB
19130 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3e 31 32 37 20  t->maxLocal>127 
19140 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6d 61 78 31  ){.    pBt->max1
19150 62 79 74 65 50 61 79 6c 6f 61 64 20 3d 20 31 32  bytePayload = 12
19160 37 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  7;.  }else{.    
19170 70 42 74 2d 3e 6d 61 78 31 62 79 74 65 50 61 79  pBt->max1bytePay
19180 6c 6f 61 64 20 3d 20 28 75 38 29 70 42 74 2d 3e  load = (u8)pBt->
19190 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20  maxLocal;.  }.  
191a0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78  assert( pBt->max
191b0 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f  Leaf + 23 <= MX_
191c0 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
191d0 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20  ;.  pBt->pPage1 
191e0 3d 20 70 50 61 67 65 31 3b 0a 20 20 70 42 74 2d  = pPage1;.  pBt-
191f0 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b 0a  >nPage = nPage;.
19200 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19210 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f  OK;..page1_init_
19220 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73  failed:.  releas
19230 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
19240 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30   pBt->pPage1 = 0
19250 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19260 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
19270 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19280 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 73  e number of curs
19290 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 70 42 74 2e  ors open on pBt.
192a0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
192b0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
192c0 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
192d0 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
192e0 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
192f0 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
19300 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 77 72 69 74  .**.** Only writ
19310 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 63 6f  e cursors are co
19320 75 6e 74 65 64 20 69 66 20 77 72 4f 6e 6c 79 20  unted if wrOnly 
19330 69 73 20 74 72 75 65 2e 20 20 49 66 20 77 72 4f  is true.  If wrO
19340 6e 6c 79 20 69 73 0a 2a 2a 20 66 61 6c 73 65 20  nly is.** false 
19350 74 68 65 6e 20 61 6c 6c 20 63 75 72 73 6f 72 73  then all cursors
19360 20 61 72 65 20 63 6f 75 6e 74 65 64 2e 0a 2a 2a   are counted..**
19370 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
19380 6f 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75  oses of this rou
19390 74 69 6e 65 2c 20 61 20 63 75 72 73 6f 72 20 69  tine, a cursor i
193a0 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61  s any cursor tha
193b0 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20  t.** is capable 
193c0 6f 66 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  of reading or wr
193d0 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
193e0 61 62 61 73 65 2e 20 20 43 75 72 73 6f 72 73 20  abase.  Cursors 
193f0 74 68 61 74 0a 2a 2a 20 68 61 76 65 20 62 65 65  that.** have bee
19400 6e 20 74 72 69 70 70 65 64 20 69 6e 74 6f 20 74  n tripped into t
19410 68 65 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  he CURSOR_FAULT 
19420 73 74 61 74 65 20 61 72 65 20 6e 6f 74 20 63 6f  state are not co
19430 75 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  unted..*/.static
19440 20 69 6e 74 20 63 6f 75 6e 74 56 61 6c 69 64 43   int countValidC
19450 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
19460 2a 70 42 74 2c 20 69 6e 74 20 77 72 4f 6e 6c 79  *pBt, int wrOnly
19470 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
19480 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
19490 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
194a0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
194b0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
194c0 74 29 7b 0a 20 20 20 20 69 66 28 20 28 77 72 4f  t){.    if( (wrO
194d0 6e 6c 79 3d 3d 30 20 7c 7c 20 28 70 43 75 72 2d  nly==0 || (pCur-
194e0 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
194f0 5f 57 72 69 74 65 46 6c 61 67 29 21 3d 30 29 0a  _WriteFlag)!=0).
19500 20 20 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53       && pCur->eS
19510 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
19520 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
19530 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
19540 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
19550 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74  ere are no outst
19560 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61  anding cursors a
19570 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e  nd we are not in
19580 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f   the middle.** o
19590 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
195a0 62 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72  but there is a r
195b0 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
195c0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a  database, then.*
195d0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * this routine u
195e0 6e 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20  nrefs the first 
195f0 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
19600 62 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20  base file which 
19610 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65  .** has the effe
19620 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20  ct of releasing 
19630 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a  the read lock..*
19640 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
19650 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19660 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73  n progress, this
19670 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19680 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
19690 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  oid unlockBtreeI
196a0 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65 64  fUnused(BtShared
196b0 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74   *pBt){.  assert
196c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
196d0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
196e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6f   );.  assert( co
196f0 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
19700 70 42 74 2c 30 29 3d 3d 30 20 7c 7c 20 70 42 74  pBt,0)==0 || pBt
19710 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  ->inTransaction>
19720 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 3b 0a 20 20  TRANS_NONE );.  
19730 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
19740 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f  action==TRANS_NO
19750 4e 45 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  NE && pBt->pPage
19760 31 21 3d 30 20 29 7b 0a 20 20 20 20 4d 65 6d 50  1!=0 ){.    MemP
19770 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42  age *pPage1 = pB
19780 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 61  t->pPage1;.    a
19790 73 73 65 72 74 28 20 70 50 61 67 65 31 2d 3e 61  ssert( pPage1->a
197a0 44 61 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65  Data );.    asse
197b0 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
197c0 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
197d0 61 67 65 72 29 3d 3d 31 20 29 3b 0a 20 20 20 20  ager)==1 );.    
197e0 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
197f0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
19800 4e 6f 74 4e 75 6c 6c 28 70 50 61 67 65 31 29 3b  NotNull(pPage1);
19810 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
19820 20 70 42 74 20 70 6f 69 6e 74 73 20 74 6f 20 61   pBt points to a
19830 6e 20 65 6d 70 74 79 20 66 69 6c 65 20 74 68 65  n empty file the
19840 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 65  n convert that e
19850 6d 70 74 79 20 66 69 6c 65 0a 2a 2a 20 69 6e 74  mpty file.** int
19860 6f 20 61 20 6e 65 77 20 65 6d 70 74 79 20 64 61  o a new empty da
19870 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
19880 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
19890 20 70 61 67 65 20 6f 66 0a 2a 2a 20 74 68 65 20   page of.** the 
198a0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
198b0 74 69 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62  tic int newDatab
198c0 61 73 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ase(BtShared *pB
198d0 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  t){.  MemPage *p
198e0 50 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  P1;.  unsigned c
198f0 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74  har *data;.  int
19900 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
19910 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
19920 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
19930 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61  ;.  if( pBt->nPa
19940 67 65 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  ge>0 ){.    retu
19950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19960 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
19970 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
19980 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
19990 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
199a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
199b0 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
199c0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
199d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
199e0 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
199f0 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
19a00 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
19a10 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
19a20 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
19a30 3d 3d 31 36 20 29 3b 0a 20 20 64 61 74 61 5b 31  ==16 );.  data[1
19a40 36 5d 20 3d 20 28 75 38 29 28 28 70 42 74 2d 3e  6] = (u8)((pBt->
19a50 70 61 67 65 53 69 7a 65 3e 3e 38 29 26 30 78 66  pageSize>>8)&0xf
19a60 66 29 3b 0a 20 20 64 61 74 61 5b 31 37 5d 20 3d  f);.  data[17] =
19a70 20 28 75 38 29 28 28 70 42 74 2d 3e 70 61 67 65   (u8)((pBt->page
19a80 53 69 7a 65 3e 3e 31 36 29 26 30 78 66 66 29 3b  Size>>16)&0xff);
19a90 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
19aa0 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
19ab0 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
19ac0 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
19ad0 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
19ae0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
19af0 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
19b00 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
19b10 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
19b20 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
19b30 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
19b40 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
19b50 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
19b60 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
19b70 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
19b80 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
19b90 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
19ba0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
19bb0 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
19bc0 42 74 2d 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20  Bt->btsFlags |= 
19bd0 42 54 53 5f 50 41 47 45 53 49 5a 45 5f 46 49 58  BTS_PAGESIZE_FIX
19be0 45 44 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ED;.#ifndef SQLI
19bf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
19c00 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42 74  UM.  assert( pBt
19c10 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31 20  ->autoVacuum==1 
19c20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  || pBt->autoVacu
19c30 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  um==0 );.  asser
19c40 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75  t( pBt->incrVacu
19c50 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69 6e  um==1 || pBt->in
19c60 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  crVacuum==0 );. 
19c70 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b   put4byte(&data[
19c80 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d 3e  36 + 4*4], pBt->
19c90 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20 70  autoVacuum);.  p
19ca0 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33 36  ut4byte(&data[36
19cb0 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e   + 7*4], pBt->in
19cc0 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64 69  crVacuum);.#endi
19cd0 66 0a 20 20 70 42 74 2d 3e 6e 50 61 67 65 20 3d  f.  pBt->nPage =
19ce0 20 31 3b 0a 20 20 64 61 74 61 5b 33 31 5d 20 3d   1;.  data[31] =
19cf0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
19d00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19d10 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
19d20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
19d30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
19d40 28 63 72 65 61 74 69 6e 67 20 61 20 64 61 74 61  (creating a data
19d50 62 61 73 65 0a 2a 2a 20 63 6f 6e 73 69 73 74 69  base.** consisti
19d60 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  ng of a single p
19d70 61 67 65 20 61 6e 64 20 6e 6f 20 73 63 68 65 6d  age and no schem
19d80 61 20 6f 62 6a 65 63 74 73 29 2e 20 52 65 74 75  a objects). Retu
19d90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
19da0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f  if successful, o
19db0 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  r an SQLite erro
19dc0 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
19dd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19de0 42 74 72 65 65 4e 65 77 44 62 28 42 74 72 65 65  BtreeNewDb(Btree
19df0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
19e00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
19e10 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74  ter(p);.  p->pBt
19e20 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 72  ->nPage = 0;.  r
19e30 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
19e40 70 2d 3e 70 42 74 29 3b 0a 20 20 73 71 6c 69 74  p->pBt);.  sqlit
19e50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
19e60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19e70 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
19e80 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74 72  o start a new tr
19e90 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69  ansaction. A wri
19ea0 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  te-transaction.*
19eb0 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66 20  * is started if 
19ec0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
19ed0 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20  ent is nonzero, 
19ee0 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61 64  otherwise a read
19ef0 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  -.** transaction
19f00 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
19f10 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f   argument is 2 o
19f20 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75  r more and exclu
19f30 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  sive.** transact
19f40 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20  ion is started, 
19f50 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20  meaning that no 
19f60 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
19f70 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61   allowed.** to a
19f80 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62 61  ccess the databa
19f90 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74 69  se.  A preexisti
19fa0 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ng transaction m
19fb0 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67  ay not be.** upg
19fc0 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69  raded to exclusi
19fd0 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68  ve by calling th
19fe0 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63  is routine a sec
19ff0 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a  ond time - the.*
1a000 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c  * exclusivity fl
1a010 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  ag only works fo
1a020 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  r a new transact
1a030 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69  ion..**.** A wri
1a040 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
1a050 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20 62  ust be started b
1a060 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67  efore attempting
1a070 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73   any .** changes
1a080 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a090 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66  .  None of the f
1a0a0 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
1a0b0 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20  s .** will work 
1a0c0 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63  unless a transac
1a0d0 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20  tion is started 
1a0e0 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  first:.**.**    
1a0f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
1a100 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20  eateTable().**  
1a110 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a120 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a  CreateIndex().**
1a130 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1a140 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a  eeClearTable().*
1a150 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a160 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a  reeDropTable().*
1a170 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
1a180 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20  reeInsert().**  
1a190 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a1a0 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20  Delete().**     
1a1b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
1a1c0 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20  ateMeta().**.** 
1a1d0 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74  If an initial at
1a1e0 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65  tempt to acquire
1a1f0 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20   the lock fails 
1a200 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20  because of lock 
1a210 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e  contention.** an
1a220 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  d the database w
1a230 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e  as previously un
1a240 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76  locked, then inv
1a250 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1a260 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65  dler.** if there
1a270 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66   is one.  But if
1a280 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76 69   there was previ
1a290 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63  ously a read-loc
1a2a0 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76  k, do not.** inv
1a2b0 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
1a2c0 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75  dler - just retu
1a2d0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  rn SQLITE_BUSY. 
1a2e0 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
1a2f0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65  .** returned whe
1a300 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  n there is alrea
1a310 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  dy a read-lock i
1a320 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1a330 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a   a deadlock..**.
1a340 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72 65  ** Suppose there
1a350 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73   are two process
1a360 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68  es A and B.  A h
1a370 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  as a read lock a
1a380 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65  nd B has.** a re
1a390 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20  served lock.  B 
1a3a0 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65  tries to promote
1a3b0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75   to exclusive bu
1a3c0 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63  t is blocked bec
1a3d0 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72  ause.** of A's r
1a3e0 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69  ead lock.  A tri
1a3f0 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
1a400 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69 73   reserved but is
1a410 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a   blocked by B..*
1a420 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68  * One or the oth
1a430 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72  er of the two pr
1a440 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69 76  ocesses must giv
1a450 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20 63  e way or there c
1a460 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67  an be.** no prog
1a470 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e  ress.  By return
1a480 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ing SQLITE_BUSY 
1a490 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67  and not invoking
1a4a0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
1a4b0 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72  ck.** when A alr
1a4c0 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64 20  eady has a read 
1a4d0 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61  lock, we encoura
1a4e0 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70 20  ge A to give up 
1a4f0 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f  and let B.** pro
1a500 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ceed..*/.int sql
1a510 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72  ite3BtreeBeginTr
1a520 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ans(Btree *p, in
1a530 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53  t wrflag){.  BtS
1a540 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1a550 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
1a560 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
1a570 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
1a580 70 29 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  p);.  btreeInteg
1a590 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
1a5a0 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
1a5b0 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
1a5c0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
1a5d0 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
1a5e0 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
1a5f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
1a600 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
1a610 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
1a620 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
1a630 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
1a640 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
1a650 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
1a660 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
1a670 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
1a680 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
1a690 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 20 20 61  s_begun;.  }.  a
1a6a0 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
1a6b0 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
1a6c0 5f 57 52 49 54 45 20 7c 7c 20 49 66 4e 6f 74 4f  _WRITE || IfNotO
1a6d0 6d 69 74 41 56 28 70 42 74 2d 3e 62 44 6f 54 72  mitAV(pBt->bDoTr
1a6e0 75 6e 63 61 74 65 29 3d 3d 30 20 29 3b 0a 0a 20  uncate)==0 );.. 
1a6f0 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
1a700 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
1a710 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
1a720 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
1a730 2a 2f 0a 20 20 69 66 28 20 28 70 42 74 2d 3e 62  */.  if( (pBt->b
1a740 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 52 45  tsFlags & BTS_RE
1a750 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 26 26 20 77  AD_ONLY)!=0 && w
1a760 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
1a770 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
1a780 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  Y;.    goto tran
1a790 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69  s_begun;.  }..#i
1a7a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a7b0 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20  T_SHARED_CACHE. 
1a7c0 20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a   {.    sqlite3 *
1a7d0 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  pBlock = 0;.    
1a7e0 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
1a7f0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
1a800 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
1a810 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
1a820 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6f 6e 20  tion .    ** on 
1a830 74 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65  this shared-btre
1a840 65 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  e structure and 
1a850 61 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74  a second write t
1a860 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
1a870 20 20 2a 2a 20 72 65 71 75 65 73 74 65 64 2c 20    ** requested, 
1a880 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
1a890 43 4b 45 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  CKED..    */.   
1a8a0 20 69 66 28 20 28 77 72 66 6c 61 67 20 26 26 20   if( (wrflag && 
1a8b0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
1a8c0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  on==TRANS_WRITE)
1a8d0 0a 20 20 20 20 20 7c 7c 20 28 70 42 74 2d 3e 62  .     || (pBt->b
1a8e0 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f 50 45  tsFlags & BTS_PE
1a8f0 4e 44 49 4e 47 29 21 3d 30 0a 20 20 20 20 29 7b  NDING)!=0.    ){
1a900 0a 20 20 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20  .      pBlock = 
1a910 70 42 74 2d 3e 70 57 72 69 74 65 72 2d 3e 64 62  pBt->pWriter->db
1a920 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a930 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
1a940 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
1a950 0a 20 20 20 20 20 20 66 6f 72 28 70 49 74 65 72  .      for(pIter
1a960 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74  =pBt->pLock; pIt
1a970 65 72 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d  er; pIter=pIter-
1a980 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
1a990 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74 72   if( pIter->pBtr
1a9a0 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20 20  ee!=p ){.       
1a9b0 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65     pBlock = pIte
1a9c0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20  r->pBtree->db;. 
1a9d0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1a9e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a9f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1aa00 70 42 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  pBlock ){.      
1aa10 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
1aa20 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64 62 2c 20  nBlocked(p->db, 
1aa30 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72  pBlock);.      r
1aa40 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  c = SQLITE_LOCKE
1aa50 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  D_SHAREDCACHE;. 
1aa60 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f       goto trans_
1aa70 62 65 67 75 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  begun;.    }.  }
1aa80 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e  .#endif..  /* An
1aa90 79 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 72  y read-only or r
1aaa0 65 61 64 2d 77 72 69 74 65 20 74 72 61 6e 73 61  ead-write transa
1aab0 63 74 69 6f 6e 20 69 6d 70 6c 69 65 73 20 61 20  ction implies a 
1aac0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 0a 20 20  read-lock on .  
1aad0 2a 2a 20 70 61 67 65 20 31 2e 20 53 6f 20 69 66  ** page 1. So if
1aae0 20 73 6f 6d 65 20 6f 74 68 65 72 20 73 68 61 72   some other shar
1aaf0 65 64 2d 63 61 63 68 65 20 63 6c 69 65 6e 74 20  ed-cache client 
1ab00 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 77 72  already has a wr
1ab10 69 74 65 2d 6c 6f 63 6b 20 0a 20 20 2a 2a 20 6f  ite-lock .  ** o
1ab20 6e 20 70 61 67 65 20 31 2c 20 74 68 65 20 74 72  n page 1, the tr
1ab30 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 6e 6f 74  ansaction cannot
1ab40 20 62 65 20 6f 70 65 6e 65 64 2e 20 2a 2f 0a 20   be opened. */. 
1ab50 20 72 63 20 3d 20 71 75 65 72 79 53 68 61 72 65   rc = queryShare
1ab60 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
1ab70 70 2c 20 4d 41 53 54 45 52 5f 52 4f 4f 54 2c 20  p, MASTER_ROOT, 
1ab80 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  READ_LOCK);.  if
1ab90 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
1aba0 29 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67  ) goto trans_beg
1abb0 75 6e 3b 0a 0a 20 20 70 42 74 2d 3e 62 74 73 46  un;..  pBt->btsF
1abc0 6c 61 67 73 20 26 3d 20 7e 42 54 53 5f 49 4e 49  lags &= ~BTS_INI
1abd0 54 49 41 4c 4c 59 5f 45 4d 50 54 59 3b 0a 20 20  TIALLY_EMPTY;.  
1abe0 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 3d 3d  if( pBt->nPage==
1abf0 30 20 29 20 70 42 74 2d 3e 62 74 73 46 6c 61 67  0 ) pBt->btsFlag
1ac00 73 20 7c 3d 20 42 54 53 5f 49 4e 49 54 49 41 4c  s |= BTS_INITIAL
1ac10 4c 59 5f 45 4d 50 54 59 3b 0a 20 20 64 6f 20 7b  LY_EMPTY;.  do {
1ac20 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 6c 6f 63  .    /* Call loc
1ac30 6b 42 74 72 65 65 28 29 20 75 6e 74 69 6c 20 65  kBtree() until e
1ac40 69 74 68 65 72 20 70 42 74 2d 3e 70 50 61 67 65  ither pBt->pPage
1ac50 31 20 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f  1 is populated o
1ac60 72 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 42 74 72  r.    ** lockBtr
1ac70 65 65 28 29 20 72 65 74 75 72 6e 73 20 73 6f 6d  ee() returns som
1ac80 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
1ac90 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 6c 6f 63  n SQLITE_OK. loc
1aca0 6b 42 74 72 65 65 28 29 0a 20 20 20 20 2a 2a 20  kBtree().    ** 
1acb0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1acc0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 20 70  E_OK but leave p
1acd0 42 74 2d 3e 70 50 61 67 65 31 20 73 65 74 20 74  Bt->pPage1 set t
1ace0 6f 20 30 20 69 66 20 61 66 74 65 72 0a 20 20 20  o 0 if after.   
1acf0 20 2a 2a 20 72 65 61 64 69 6e 67 20 70 61 67 65   ** reading page
1ad00 20 31 20 69 74 20 64 69 73 63 6f 76 65 72 73 20   1 it discovers 
1ad10 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
1ad20 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1ad30 73 65 20 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  se .    ** file 
1ad40 69 73 20 6e 6f 74 20 70 42 74 2d 3e 70 61 67 65  is not pBt->page
1ad50 53 69 7a 65 2e 20 49 6e 20 74 68 69 73 20 63 61  Size. In this ca
1ad60 73 65 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 77  se lockBtree() w
1ad70 69 6c 6c 20 75 70 64 61 74 65 0a 20 20 20 20 2a  ill update.    *
1ad80 2a 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  * pBt->pageSize 
1ad90 74 6f 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  to the page-size
1ada0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
1adb0 64 69 73 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  disk..    */.   
1adc0 20 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61   while( pBt->pPa
1add0 67 65 31 3d 3d 30 20 26 26 20 53 51 4c 49 54 45  ge1==0 && SQLITE
1ade0 5f 4f 4b 3d 3d 28 72 63 20 3d 20 6c 6f 63 6b 42  _OK==(rc = lockB
1adf0 74 72 65 65 28 70 42 74 29 29 20 29 3b 0a 0a 20  tree(pBt)) );.. 
1ae00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1ae10 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
1ae20 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 42 74  {.      if( (pBt
1ae30 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
1ae40 5f 52 45 41 44 5f 4f 4e 4c 59 29 21 3d 30 20 29  _READ_ONLY)!=0 )
1ae50 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
1ae60 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
1ae70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ae80 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ae90 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
1aea0 3e 70 50 61 67 65 72 2c 77 72 66 6c 61 67 3e 31  >pPager,wrflag>1
1aeb0 2c 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65  ,sqlite3TempInMe
1aec0 6d 6f 72 79 28 70 2d 3e 64 62 29 29 3b 0a 20 20  mory(p->db));.  
1aed0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1aee0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1aef0 20 20 20 20 20 72 63 20 3d 20 6e 65 77 44 61 74       rc = newDat
1af00 61 62 61 73 65 28 70 42 74 29 3b 0a 20 20 20 20  abase(pBt);.    
1af10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1af20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 72    }.  .    if( r
1af30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1af40 20 20 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65        unlockBtre
1af50 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1af60 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1af70 28 72 63 26 30 78 46 46 29 3d 3d 53 51 4c 49 54  (rc&0xFF)==SQLIT
1af80 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69  E_BUSY && pBt->i
1af90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1afa0 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20  ANS_NONE &&.    
1afb0 20 20 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b        btreeInvok
1afc0 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74  eBusyHandler(pBt
1afd0 29 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ) );..  if( rc==
1afe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1aff0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
1b000 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
1b010 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73       pBt->nTrans
1b020 61 63 74 69 6f 6e 2b 2b 3b 0a 23 69 66 6e 64 65  action++;.#ifnde
1b030 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
1b040 41 52 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20  ARED_CACHE.     
1b050 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65   if( p->sharable
1b060 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1b070 72 74 28 20 70 2d 3e 6c 6f 63 6b 2e 70 42 74 72  rt( p->lock.pBtr
1b080 65 65 3d 3d 70 20 26 26 20 70 2d 3e 6c 6f 63 6b  ee==p && p->lock
1b090 2e 69 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20  .iTable==1 );.  
1b0a0 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 2e 65 4c        p->lock.eL
1b0b0 6f 63 6b 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 3b  ock = READ_LOCK;
1b0c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b  .        p->lock
1b0d0 2e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c  .pNext = pBt->pL
1b0e0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 70 42 74  ock;.        pBt
1b0f0 2d 3e 70 4c 6f 63 6b 20 3d 20 26 70 2d 3e 6c 6f  ->pLock = &p->lo
1b100 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ck;.      }.#end
1b110 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  if.    }.    p->
1b120 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
1b130 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
1b140 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
1b150 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
1b160 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
1b170 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
1b180 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
1b190 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
1b1a0 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 20  .    if( wrflag 
1b1b0 29 7b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  ){.      MemPage
1b1c0 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
1b1d0 70 50 61 67 65 31 3b 0a 23 69 66 6e 64 65 66 20  pPage1;.#ifndef 
1b1e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
1b1f0 45 44 5f 43 41 43 48 45 0a 20 20 20 20 20 20 61  ED_CACHE.      a
1b200 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
1b210 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
1b220 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
1b230 20 20 20 20 20 20 70 42 74 2d 3e 62 74 73 46 6c        pBt->btsFl
1b240 61 67 73 20 26 3d 20 7e 42 54 53 5f 45 58 43 4c  ags &= ~BTS_EXCL
1b250 55 53 49 56 45 3b 0a 20 20 20 20 20 20 69 66 28  USIVE;.      if(
1b260 20 77 72 66 6c 61 67 3e 31 20 29 20 70 42 74 2d   wrflag>1 ) pBt-
1b270 3e 62 74 73 46 6c 61 67 73 20 7c 3d 20 42 54 53  >btsFlags |= BTS
1b280 5f 45 58 43 4c 55 53 49 56 45 3b 0a 23 65 6e 64  _EXCLUSIVE;.#end
1b290 69 66 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  if..      /* If 
1b2a0 74 68 65 20 64 62 2d 73 69 7a 65 20 68 65 61 64  the db-size head
1b2b0 65 72 20 66 69 65 6c 64 20 69 73 20 69 6e 63 6f  er field is inco
1b2c0 72 72 65 63 74 20 28 61 73 20 69 74 20 6d 61 79  rrect (as it may
1b2d0 20 62 65 20 69 66 20 61 6e 20 6f 6c 64 0a 20 20   be if an old.  
1b2e0 20 20 20 20 2a 2a 20 63 6c 69 65 6e 74 20 68 61      ** client ha
1b2f0 73 20 62 65 65 6e 20 77 72 69 74 69 6e 67 20 74  s been writing t
1b300 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b310 29 2c 20 75 70 64 61 74 65 20 69 74 20 6e 6f 77  ), update it now
1b320 2e 20 44 6f 69 6e 67 0a 20 20 20 20 20 20 2a 2a  . Doing.      **
1b330 20 74 68 69 73 20 73 6f 6f 6e 65 72 20 72 61 74   this sooner rat
1b340 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 20 6d  her than later m
1b350 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  eans the databas
1b360 65 20 73 69 7a 65 20 63 61 6e 20 73 61 66 65 6c  e size can safel
1b370 79 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 2d 72  y .      ** re-r
1b380 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73 65  ead the database
1b390 20 73 69 7a 65 20 66 72 6f 6d 20 70 61 67 65 20   size from page 
1b3a0 31 20 69 66 20 61 20 73 61 76 65 70 6f 69 6e 74  1 if a savepoint
1b3b0 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a   or transaction.
1b3c0 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
1b3d0 6b 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  k occurs within 
1b3e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
1b3f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b400 69 66 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d  if( pBt->nPage!=
1b410 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
1b420 2d 3e 61 44 61 74 61 5b 32 38 5d 29 20 29 7b 0a  ->aData[28]) ){.
1b430 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b440 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1b450 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
1b460 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
1b470 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b480 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1b490 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1b4a0 32 38 5d 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  28], pBt->nPage)
1b4b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b4c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a    }.    }.  }...
1b4d0 74 72 61 6e 73 5f 62 65 67 75 6e 3a 0a 20 20 69  trans_begun:.  i
1b4e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b4f0 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
1b500 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
1b510 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 74  akes sure that t
1b520 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
1b530 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
1b540 6f 66 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 20 73  of.    ** open s
1b550 61 76 65 70 6f 69 6e 74 73 2e 20 49 66 20 74 68  avepoints. If th
1b560 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
1b570 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74 68  er is greater th
1b580 61 6e 20 30 20 61 6e 64 0a 20 20 20 20 2a 2a 20  an 0 and.    ** 
1b590 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
1b5a0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
1b5b0 70 65 6e 2c 20 74 68 65 6e 20 69 74 20 77 69 6c  pen, then it wil
1b5c0 6c 20 62 65 20 6f 70 65 6e 65 64 20 68 65 72 65  l be opened here
1b5d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
1b5e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
1b5f0 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d  enSavepoint(pBt-
1b600 3e 70 50 61 67 65 72 2c 20 70 2d 3e 64 62 2d 3e  >pPager, p->db->
1b610 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d  nSavepoint);.  }
1b620 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
1b630 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
1b640 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
1b650 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
1b660 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b670 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
1b680 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
1b690 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
1b6a0 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
1b6b0 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
1b6c0 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
1b6d0 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
1b6e0 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
1b6f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1b700 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
1b710 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
1b720 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
1b730 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
1b740 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
1b750 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
1b760 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1b770 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1b780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b790 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
1b7a0 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
1b7b0 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b7d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
1b7e0 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
1b7f0 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b810 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1b820 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
1b830 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1b840 65 2d 3e 70 42 74 3b 0a 20 20 75 38 20 69 73 49  e->pBt;.  u8 isI
1b850 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
1b860 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f 20  >isInit;.  Pgno 
1b870 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
1b880 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  no;..  assert( s
1b890 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1b8a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
1b8b0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 62  tex) );.  rc = b
1b8c0 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
1b8d0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1b8e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b8f0 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70  goto set_child_p
1b900 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a  trmaps_out;.  }.
1b910 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
1b920 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69  >nCell;..  for(i
1b930 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b  =0; i<nCell; i++
1b940 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c  ){.    u8 *pCell
1b950 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67   = findCell(pPag
1b960 65 2c 20 69 29 3b 0a 0a 20 20 20 20 70 74 72 6d  e, i);..    ptrm
1b970 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
1b980 67 65 2c 20 70 43 65 6c 6c 2c 20 26 72 63 29 3b  ge, pCell, &rc);
1b990 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
1b9a0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1b9b0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
1b9c0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
1b9d0 3b 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75  ;.      ptrmapPu
1b9e0 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
1b9f0 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
1ba00 70 67 6e 6f 2c 20 26 72 63 29 3b 0a 20 20 20 20  pgno, &rc);.    
1ba10 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  }.  }..  if( !pP
1ba20 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1ba30 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20   Pgno childPgno 
1ba40 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1ba50 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1ba60 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1ba70 20 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74     ptrmapPut(pBt
1ba80 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20 50 54 52  , childPgno, PTR
1ba90 4d 41 50 5f 42 54 52 45 45 2c 20 70 67 6e 6f 2c  MAP_BTREE, pgno,
1baa0 20 26 72 63 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f   &rc);.  }..set_
1bab0 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75  child_ptrmaps_ou
1bac0 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  t:.  pPage->isIn
1bad0 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
1bae0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1baf0 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65  ./*.** Somewhere
1bb00 20 6f 6e 20 70 50 61 67 65 20 69 73 20 61 20 70   on pPage is a p
1bb10 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20 69  ointer to page i
1bb20 46 72 6f 6d 2e 20 20 4d 6f 64 69 66 79 20 74 68  From.  Modify th
1bb30 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 0a 2a 2a  is pointer so.**
1bb40 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
1bb50 74 6f 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  to iTo. Paramete
1bb60 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
1bb70 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
1bb80 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 62 65 20 6d  inter to.** be m
1bb90 6f 64 69 66 69 65 64 2c 20 61 73 20 20 66 6f 6c  odified, as  fol
1bba0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
1bbb0 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
1bbc0 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
1bbd0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
1bbe0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
1bbf0 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
1bc00 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
1bc10 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
1bc20 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
1bc30 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
1bc40 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
1bc50 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
1bc60 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
1bc80 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
1bc90 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
1bca0 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
1bcb0 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
1bcc0 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
1bcd0 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
1bce0 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
1bcf0 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
1bd20 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
1bd30 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
1bd40 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
1bd50 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
1bd60 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
1bd70 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
1bd80 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1bd90 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1bda0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1bdb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1bdc0 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
1bdd0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
1bde0 67 65 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ge) );.  if( eTy
1bdf0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
1be00 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
1be10 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
1be20 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
1be30 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
1be40 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
1be50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
1be60 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
1be70 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
1be80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1be90 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1bea0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
1beb0 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
1bec0 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
1bed0 20 20 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69      u8 isInitOri
1bee0 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
1bef0 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
1bf00 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 20    int nCell;.   
1bf10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 72 63   int rc;..    rc
1bf20 20 3d 20 62 74 72 65 65 49 6e 69 74 50 61 67 65   = btreeInitPage
1bf30 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  (pPage);.    if(
1bf40 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1bf50 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  .    nCell = pPa
1bf60 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  ge->nCell;..    
1bf70 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
1bf80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38  ; i++){.      u8
1bf90 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65   *pCell = findCe
1bfa0 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  ll(pPage, i);.  
1bfb0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1bfc0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
1bfd0 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c 49  ){.        CellI
1bfe0 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20  nfo info;.      
1bff0 20 20 70 50 61 67 65 2d 3e 78 50 61 72 73 65 43    pPage->xParseC
1c000 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  ell(pPage, pCell
1c010 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
1c020 20 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61    if( info.nLoca
1c030 6c 3c 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 0a  l<info.nPayload.
1c040 20 20 20 20 20 20 20 20 20 26 26 20 70 43 65 6c           && pCel
1c050 6c 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 3c 3d  l+info.nSize-1<=
1c060 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
1c070 67 65 2d 3e 6d 61 73 6b 50 61 67 65 0a 20 20 20  ge->maskPage.   
1c080 20 20 20 20 20 20 26 26 20 69 46 72 6f 6d 3d 3d        && iFrom==
1c090 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 2b 69  get4byte(pCell+i
1c0a0 6e 66 6f 2e 6e 53 69 7a 65 2d 34 29 0a 20 20 20  nfo.nSize-4).   
1c0b0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
1c0c0 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
1c0d0 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 34 2c 20 69  +info.nSize-4, i
1c0e0 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62  To);.          b
1c0f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
1c100 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c110 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
1c120 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
1c130 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
1c140 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
1c150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1c160 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1c170 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
1c180 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
1c190 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
1c1a0 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
1c1b0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
1c1c0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c1d0 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c1e0 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
1c1f0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
1c200 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1c210 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
1c220 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
1c230 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1c240 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1c250 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
1c260 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
1c270 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
1c280 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1c290 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c2a0 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
1c2b0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
1c2c0 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
1c2d0 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
1c2e0 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
1c2f0 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
1c300 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
1c310 61 6c 69 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  alid..**.** The 
1c320 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 69 6e  isCommit flag in
1c330 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1c340 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f  re is no need to
1c350 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74 0a 2a   remember that.*
1c360 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  * the journal ne
1c370 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
1c380 65 64 20 62 65 66 6f 72 65 20 64 61 74 61 62 61  ed before databa
1c390 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2d  se page pDbPage-
1c3a0 3e 70 67 6e 6f 20 0a 2a 2a 20 63 61 6e 20 62 65  >pgno .** can be
1c3b0 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 54 68 65   written to. The
1c3c0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1c3d0 61 64 79 20 70 72 6f 6d 69 73 65 64 20 6e 6f 74  ady promised not
1c3e0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 61   to write to tha
1c3f0 74 0a 2a 2a 20 70 61 67 65 2e 0a 2a 2f 0a 73 74  t.** page..*/.st
1c400 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
1c410 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
1c420 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
1c430 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
1c440 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
1c450 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
1c460 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
1c470 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
1c480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1c490 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
1c4a0 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
1c4b0 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
1c4c0 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
1c4d0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
1c4e0 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
1c4f0 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
1c500 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
1c510 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ,          /* Th
1c520 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
1c530 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
1c540 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69 74 20  .  int isCommit 
1c550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1c560 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20 70 61 73  sCommit flag pas
1c570 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 50 61  sed to sqlite3Pa
1c580 67 65 72 4d 6f 76 65 70 61 67 65 20 2a 2f 0a 29  gerMovepage */.)
1c590 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74  {.  MemPage *pPt
1c5a0 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20  rPage;   /* The 
1c5b0 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
1c5c0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
1c5d0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
1c5e0 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44 62 50  o iDbPage = pDbP
1c5f0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67  age->pgno;.  Pag
1c600 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
1c610 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1c620 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  rc;..  assert( e
1c630 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
1c640 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d  RFLOW2 || eType=
1c650 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
1c660 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70  1 || .      eTyp
1c670 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20  e==PTRMAP_BTREE 
1c680 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
1c690 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61  _ROOTPAGE );.  a
1c6a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1c6b0 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
1c6c0 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
1c6d0 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d  t( pDbPage->pBt=
1c6e0 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f  =pBt );..  /* Mo
1c6f0 76 65 20 70 61 67 65 20 69 44 62 50 61 67 65 20  ve page iDbPage 
1c700 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74  from its current
1c710 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67   location to pag
1c720 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61  e number iFreePa
1c730 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ge */.  TRACE(("
1c740 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69  AUTOVACUUM: Movi
1c750 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20 70 61  ng %d to free pa
1c760 67 65 20 25 64 20 28 70 74 72 20 70 61 67 65 20  ge %d (ptr page 
1c770 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20  %d type %d)\n", 
1c780 0a 20 20 20 20 20 20 69 44 62 50 61 67 65 2c 20  .      iDbPage, 
1c790 69 46 72 65 65 50 61 67 65 2c 20 69 50 74 72 50  iFreePage, iPtrP
1c7a0 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20  age, eType));.  
1c7b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1c7c0 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67 65 72  rMovepage(pPager
1c7d0 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61  , pDbPage->pDbPa
1c7e0 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
1c7f0 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20  sCommit);.  if( 
1c800 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1c810 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1c820 20 20 7d 0a 20 20 70 44 62 50 61 67 65 2d 3e 70    }.  pDbPage->p
1c830 67 6e 6f 20 3d 20 69 46 72 65 65 50 61 67 65 3b  gno = iFreePage;
1c840 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62 50 61 67  ..  /* If pDbPag
1c850 65 20 77 61 73 20 61 20 62 74 72 65 65 2d 70 61  e was a btree-pa
1c860 67 65 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20  ge, then it may 
1c870 68 61 76 65 20 63 68 69 6c 64 20 70 61 67 65 73  have child pages
1c880 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73 0a 20 20   and/or cells.  
1c890 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  ** that point to
1c8a0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
1c8b0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
1c8c0 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
1c8d0 20 74 68 65 73 65 0a 20 20 2a 2a 20 70 61 67 65   these.  ** page
1c8e0 73 20 6e 65 65 64 20 74 6f 20 62 65 20 63 68 61  s need to be cha
1c8f0 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  nged..  **.  ** 
1c900 49 66 20 70 44 62 50 61 67 65 20 69 73 20 61 6e  If pDbPage is an
1c910 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
1c920 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 34  then the first 4
1c930 20 62 79 74 65 73 20 6d 61 79 20 73 74 6f 72 65   bytes may store
1c940 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20   a.  ** pointer 
1c950 74 6f 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  to a subsequent 
1c960 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
1c970 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
1c980 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  se, then.  ** th
1c990 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 6e 65  e pointer map ne
1c9a0 65 64 73 20 74 6f 20 62 65 20 75 70 64 61 74 65  eds to be update
1c9b0 64 20 66 6f 72 20 74 68 65 20 73 75 62 73 65 71  d for the subseq
1c9c0 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
1c9d0 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ge..  */.  if( e
1c9e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
1c9f0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
1ca00 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
1ca10 20 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c      rc = setChil
1ca20 64 50 74 72 6d 61 70 73 28 70 44 62 50 61 67 65  dPtrmaps(pDbPage
1ca30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1ca40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ca50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1ca60 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1ca70 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c 20 3d 20  Pgno nextOvfl = 
1ca80 67 65 74 34 62 79 74 65 28 70 44 62 50 61 67 65  get4byte(pDbPage
1ca90 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 69 66  ->aData);.    if
1caa0 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30 20 29 7b  ( nextOvfl!=0 ){
1cab0 0a 20 20 20 20 20 20 70 74 72 6d 61 70 50 75 74  .      ptrmapPut
1cac0 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20  (pBt, nextOvfl, 
1cad0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
1cae0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 26 72 63  , iFreePage, &rc
1caf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1cb00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cb20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cb30 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20 74 68 65   }..  /* Fix the
1cb40 20 64 61 74 61 62 61 73 65 20 70 6f 69 6e 74 65   database pointe
1cb50 72 20 6f 6e 20 70 61 67 65 20 69 50 74 72 50 61  r on page iPtrPa
1cb60 67 65 20 74 68 61 74 20 70 6f 69 6e 74 65 64 20  ge that pointed 
1cb70 61 74 20 69 44 62 50 61 67 65 20 73 6f 0a 20 20  at iDbPage so.  
1cb80 2a 2a 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  ** that it point
1cb90 73 20 61 74 20 69 46 72 65 65 50 61 67 65 2e 20  s at iFreePage. 
1cba0 41 6c 73 6f 20 66 69 78 20 74 68 65 20 70 6f 69  Also fix the poi
1cbb0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66  nter map entry f
1cbc0 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50 61 67 65  or.  ** iPtrPage
1cbd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79  ..  */.  if( eTy
1cbe0 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
1cbf0 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  AGE ){.    rc = 
1cc00 62 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  btreeGetPage(pBt
1cc10 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
1cc20 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
1cc30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cc40 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1cc50 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1cc60 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1cc70 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
1cc80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
1cc90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1cca0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
1ccb0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
1ccc0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ccd0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
1cce0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
1ccf0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
1cd00 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
1cd10 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
1cd20 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
1cd30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1cd40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1cd50 20 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c    ptrmapPut(pBt,
1cd60 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
1cd70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 26 72 63  e, iPtrPage, &rc
1cd80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1cd90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1cda0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1cdb0 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
1cdc0 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
1cdd0 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
1cde0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1cdf0 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
1ce00 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
1ce10 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
1ce20 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
1ce30 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
1ce40 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1ce50 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
1ce60 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  l, return.** SQL
1ce70 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
1ce80 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
1ce90 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
1cea0 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 0a 2a 2a   no point in .**
1ceb0 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1cec0 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72  nction again), r
1ced0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
1cee0 45 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  E. Or, if an err
1cef0 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 72  or .** occurs, r
1cf00 65 74 75 72 6e 20 73 6f 6d 65 20 6f 74 68 65 72  eturn some other
1cf10 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a   error code..**.
1cf20 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
1cf30 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74  ally, this funct
1cf40 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
1cf50 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20  re-organize the 
1cf60 64 61 74 61 62 61 73 65 20 73 6f 20 0a 2a 2a 20  database so .** 
1cf70 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
1cf80 67 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  ge of the file c
1cf90 75 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 20  urrently in use 
1cfa0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
1cfb0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  use..**.** Param
1cfc0 65 74 65 72 20 6e 46 69 6e 20 69 73 20 74 68 65  eter nFin is the
1cfd0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1cfe0 20 74 68 61 74 20 74 68 69 73 20 64 61 74 61 62   that this datab
1cff0 61 73 65 20 77 6f 75 6c 64 20 63 6f 6e 74 61 69  ase would contai
1d000 6e 0a 2a 2a 20 77 65 72 65 20 74 68 69 73 20 66  n.** were this f
1d010 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 75  unction called u
1d020 6e 74 69 6c 20 69 74 20 72 65 74 75 72 6e 73 20  ntil it returns 
1d030 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
1d040 2a 2a 20 49 66 20 74 68 65 20 62 43 6f 6d 6d 69  ** If the bCommi
1d050 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  t parameter is n
1d060 6f 6e 2d 7a 65 72 6f 2c 20 74 68 69 73 20 66 75  on-zero, this fu
1d070 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74  nction assumes t
1d080 68 61 74 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c  hat the .** call
1d090 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c  er will keep cal
1d0a0 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53  ling incrVacuumS
1d0b0 74 65 70 28 29 20 75 6e 74 69 6c 20 69 74 20 72  tep() until it r
1d0c0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f  eturns SQLITE_DO
1d0d0 4e 45 20 0a 2a 2a 20 6f 72 20 61 6e 20 65 72 72  NE .** or an err
1d0e0 6f 72 2e 20 62 43 6f 6d 6d 69 74 20 69 73 20 70  or. bCommit is p
1d0f0 61 73 73 65 64 20 74 72 75 65 20 66 6f 72 20 61  assed true for a
1d100 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 2d 6f 6e  n auto-vacuum-on
1d110 2d 63 6f 6d 6d 69 74 20 0a 2a 2a 20 6f 70 65 72  -commit .** oper
1d120 61 74 69 6f 6e 2c 20 6f 72 20 66 61 6c 73 65 20  ation, or false 
1d130 66 6f 72 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74  for an increment
1d140 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2f 0a 73 74  al vacuum..*/.st
1d150 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63  atic int incrVac
1d160 75 75 6d 53 74 65 70 28 42 74 53 68 61 72 65 64  uumStep(BtShared
1d170 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e   *pBt, Pgno nFin
1d180 2c 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 2c 20  , Pgno iLastPg, 
1d190 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20  int bCommit){.  
1d1a0 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
1d1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d1c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
1d1d0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
1d1e0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ist */.  int rc;
1d1f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1d200 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1d210 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1d220 61 73 73 65 72 74 28 20 69 4c 61 73 74 50 67 3e  assert( iLastPg>
1d230 6e 46 69 6e 20 29 3b 0a 0a 20 20 69 66 28 20 21  nFin );..  if( !
1d240 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
1d250 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
1d260 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
1d270 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1d280 7b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a  {.    u8 eType;.
1d290 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
1d2a0 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69 73  e;..    nFreeLis
1d2b0 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 42  t = get4byte(&pB
1d2c0 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
1d2d0 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  [36]);.    if( n
1d2e0 46 72 65 65 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  FreeList==0 ){. 
1d2f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1d300 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a  TE_DONE;.    }..
1d310 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
1d320 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50 67 2c  et(pBt, iLastPg,
1d330 20 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61   &eType, &iPtrPa
1d340 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
1d350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d360 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d370 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 54 79     }.    if( eTy
1d380 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe==PTRMAP_ROOTP
1d390 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  AGE ){.      ret
1d3a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1d3b0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a  PT_BKPT;.    }..
1d3c0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
1d3d0 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
1d3e0 7b 0a 20 20 20 20 20 20 69 66 28 20 62 43 6f 6d  {.      if( bCom
1d3f0 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  mit==0 ){.      
1d400 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1d410 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69  page from the fi
1d420 6c 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54  les free-list. T
1d430 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
1d440 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  red.        ** i
1d450 66 20 62 43 6f 6d 6d 69 74 20 69 73 20 6e 6f 6e  f bCommit is non
1d460 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74 20 63  -zero. In that c
1d470 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d 6c 69  ase, the free-li
1d480 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20  st will be.     
1d490 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20     ** truncated 
1d4a0 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20 74 68  to zero after th
1d4b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
1d4c0 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  rns, so it doesn
1d4d0 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d  't .        ** m
1d4e0 61 74 74 65 72 20 69 66 20 69 74 20 73 74 69 6c  atter if it stil
1d4f0 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20  l contains some 
1d500 67 61 72 62 61 67 65 20 65 6e 74 72 69 65 73 2e  garbage entries.
1d510 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1d520 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65 50 67      Pgno iFreePg
1d530 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  ;.        MemPag
1d540 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
1d550 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
1d560 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
1d570 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
1d580 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 42 54 41  Pg, iLastPg, BTA
1d590 4c 4c 4f 43 5f 45 58 41 43 54 29 3b 0a 20 20 20  LLOC_EXACT);.   
1d5a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d5b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d5c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d5d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d5e0 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
1d5f0 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
1d600 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1d610 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
1d620 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
1d630 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
1d640 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
1d650 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
1d660 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
1d670 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
1d680 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
1d690 50 67 3b 0a 20 20 20 20 20 20 75 38 20 65 4d 6f  Pg;.      u8 eMo
1d6a0 64 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 41 4e 59  de = BTALLOC_ANY
1d6b0 3b 20 20 20 2f 2a 20 4d 6f 64 65 20 70 61 72 61  ;   /* Mode para
1d6c0 6d 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61  meter for alloca
1d6d0 74 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f  teBtreePage() */
1d6e0 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65 61  .      Pgno iNea
1d6f0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
1d700 20 2f 2a 20 6e 65 61 72 62 79 20 70 61 72 61 6d   /* nearby param
1d710 65 74 65 72 20 66 6f 72 20 61 6c 6c 6f 63 61 74  eter for allocat
1d720 65 42 74 72 65 65 50 61 67 65 28 29 20 2a 2f 0a  eBtreePage() */.
1d730 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65  .      rc = btre
1d740 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4c  eGetPage(pBt, iL
1d750 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67 2c  astPg, &pLastPg,
1d760 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1d770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d780 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1d790 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  c;.      }..    
1d7a0 20 20 2f 2a 20 49 66 20 62 43 6f 6d 6d 69 74 20    /* If bCommit 
1d7b0 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
1d7c0 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
1d7d0 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
1d7e0 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
1d7f0 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
1d800 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
1d810 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
1d820 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
1d830 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
1d840 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
1d850 2c 20 69 66 20 62 43 6f 6d 6d 69 74 20 69 73 20  , if bCommit is 
1d860 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
1d870 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
1d880 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
1d890 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
1d8a0 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
1d8b0 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
1d8c0 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
1d8d0 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
1d8e0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
1d8f0 20 20 69 66 28 20 62 43 6f 6d 6d 69 74 3d 3d 30    if( bCommit==0
1d900 20 29 7b 0a 20 20 20 20 20 20 20 20 65 4d 6f 64   ){.        eMod
1d910 65 20 3d 20 42 54 41 4c 4c 4f 43 5f 4c 45 3b 0a  e = BTALLOC_LE;.
1d920 20 20 20 20 20 20 20 20 69 4e 65 61 72 20 3d 20          iNear = 
1d930 6e 46 69 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nFin;.      }.  
1d940 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
1d950 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
1d960 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
1d970 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
1d980 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
1d990 20 26 69 46 72 65 65 50 67 2c 20 69 4e 65 61 72   &iFreePg, iNear
1d9a0 2c 20 65 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20  , eMode);.      
1d9b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d9c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d9d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c 61   releasePage(pLa
1d9e0 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  stPg);.         
1d9f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1da00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1da10 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
1da20 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  g);.      }while
1da30 28 20 62 43 6f 6d 6d 69 74 20 26 26 20 69 46 72  ( bCommit && iFr
1da40 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20 20  eePg>nFin );.   
1da50 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65 65     assert( iFree
1da60 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20 20  Pg<iLastPg );.  
1da70 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d 20      .      rc = 
1da80 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
1da90 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
1daa0 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
1dab0 65 50 67 2c 20 62 43 6f 6d 6d 69 74 29 3b 0a 20  ePg, bCommit);. 
1dac0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1dad0 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
1dae0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1daf0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
1db00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
1db10 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1db20 28 20 62 43 6f 6d 6d 69 74 3d 3d 30 20 29 7b 0a  ( bCommit==0 ){.
1db30 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
1db40 4c 61 73 74 50 67 2d 2d 3b 0a 20 20 20 20 7d 77  LastPg--;.    }w
1db50 68 69 6c 65 28 20 69 4c 61 73 74 50 67 3d 3d 50  hile( iLastPg==P
1db60 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1db70 28 70 42 74 29 20 7c 7c 20 50 54 52 4d 41 50 5f  (pBt) || PTRMAP_
1db80 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c 61 73  ISPAGE(pBt, iLas
1db90 74 50 67 29 20 29 3b 0a 20 20 20 20 70 42 74 2d  tPg) );.    pBt-
1dba0 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20 31  >bDoTruncate = 1
1dbb0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 50 61 67 65  ;.    pBt->nPage
1dbc0 20 3d 20 69 4c 61 73 74 50 67 3b 0a 20 20 7d 0a   = iLastPg;.  }.
1dbd0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1dbe0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1dbf0 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
1dc00 20 62 79 20 74 68 65 20 66 69 72 73 74 20 61 72   by the first ar
1dc10 67 75 6d 65 6e 74 20 69 73 20 61 6e 20 61 75 74  gument is an aut
1dc20 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1dc30 65 0a 2a 2a 20 6e 4f 72 69 67 20 70 61 67 65 73  e.** nOrig pages
1dc40 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e   in size contain
1dc50 69 6e 67 20 6e 46 72 65 65 20 66 72 65 65 20 70  ing nFree free p
1dc60 61 67 65 73 2e 20 52 65 74 75 72 6e 20 74 68 65  ages. Return the
1dc70 20 65 78 70 65 63 74 65 64 20 0a 2a 2a 20 73 69   expected .** si
1dc80 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
1dc90 73 65 20 69 6e 20 70 61 67 65 73 20 66 6f 6c 6c  se in pages foll
1dca0 6f 77 69 6e 67 20 61 6e 20 61 75 74 6f 2d 76 61  owing an auto-va
1dcb0 63 75 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  cuum operation..
1dcc0 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 66  */.static Pgno f
1dcd0 69 6e 61 6c 44 62 53 69 7a 65 28 42 74 53 68 61  inalDbSize(BtSha
1dce0 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e  red *pBt, Pgno n
1dcf0 4f 72 69 67 2c 20 50 67 6e 6f 20 6e 46 72 65 65  Orig, Pgno nFree
1dd00 29 7b 0a 20 20 69 6e 74 20 6e 45 6e 74 72 79 3b  ){.  int nEntry;
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1dd30 66 20 65 6e 74 72 69 65 73 20 6f 6e 20 6f 6e 65  f entries on one
1dd40 20 70 74 72 6d 61 70 20 70 61 67 65 20 2a 2f 0a   ptrmap page */.
1dd50 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 20    Pgno nPtrmap; 
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd70 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
1dd80 74 72 4d 61 70 20 70 61 67 65 73 20 74 6f 20 62  trMap pages to b
1dd90 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 50 67 6e  e freed */.  Pgn
1dda0 6f 20 6e 46 69 6e 3b 20 20 20 20 20 20 20 20 20  o nFin;         
1ddb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ddc0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1ddd0 0a 20 20 6e 45 6e 74 72 79 20 3d 20 70 42 74 2d  .  nEntry = pBt-
1dde0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 3b 0a 20  >usableSize/5;. 
1ddf0 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
1de00 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
1de10 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
1de20 29 2b 6e 45 6e 74 72 79 29 2f 6e 45 6e 74 72 79  )+nEntry)/nEntry
1de30 3b 0a 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67  ;.  nFin = nOrig
1de40 20 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d   - nFree - nPtrm
1de50 61 70 3b 0a 20 20 69 66 28 20 6e 4f 72 69 67 3e  ap;.  if( nOrig>
1de60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1de70 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 50  E(pBt) && nFin<P
1de80 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1de90 28 70 42 74 29 20 29 7b 0a 20 20 20 20 6e 46 69  (pBt) ){.    nFi
1dea0 6e 2d 2d 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  n--;.  }.  while
1deb0 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
1dec0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
1ded0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
1dee0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
1def0 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20    nFin--;.  }.. 
1df00 20 72 65 74 75 72 6e 20 6e 46 69 6e 3b 0a 7d 0a   return nFin;.}.
1df10 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
1df20 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1df30 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
1df40 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
1df50 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
1df60 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
1df70 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
1df80 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
1df90 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
1dfa0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
1dfb0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
1dfc0 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
1dfd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
1dfe0 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
1dff0 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
1e000 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
1e010 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
1e020 72 72 6f 72 20 6f 63 63 75 72 72 65 64 2c 0a 2a  rror occurred,.*
1e030 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1e040 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
1e050 73 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  se an SQLite err
1e060 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74  or code. .*/.int
1e070 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63   sqlite3BtreeInc
1e080 72 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  rVacuum(Btree *p
1e090 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
1e0a0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1e0b0 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
1e0c0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1e0d0 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
1e0e0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
1e0f0 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70 2d 3e  ANS_WRITE && p->
1e100 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
1e110 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 21 70  RITE );.  if( !p
1e120 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
1e130 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1e140 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  E_DONE;.  }else{
1e150 0a 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20  .    Pgno nOrig 
1e160 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1e170 28 70 42 74 29 3b 0a 20 20 20 20 50 67 6e 6f 20  (pBt);.    Pgno 
1e180 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
1e190 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e1a0 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 50  Data[36]);.    P
1e1b0 67 6e 6f 20 6e 46 69 6e 20 3d 20 66 69 6e 61 6c  gno nFin = final
1e1c0 44 62 53 69 7a 65 28 70 42 74 2c 20 6e 4f 72 69  DbSize(pBt, nOri
1e1d0 67 2c 20 6e 46 72 65 65 29 3b 0a 0a 20 20 20 20  g, nFree);..    
1e1e0 69 66 28 20 6e 4f 72 69 67 3c 6e 46 69 6e 20 29  if( nOrig<nFin )
1e1f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1e200 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1e210 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1e220 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
1e230 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72   rc = saveAllCur
1e240 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b  sors(pBt, 0, 0);
1e250 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
1e260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e270 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
1e280 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
1e290 42 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  Bt);.        rc 
1e2a0 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
1e2b0 28 70 42 74 2c 20 6e 46 69 6e 2c 20 6e 4f 72 69  (pBt, nFin, nOri
1e2c0 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g, 0);.      }. 
1e2d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1e2e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e2f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e300 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1e310 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1e320 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1e330 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
1e340 44 61 74 61 5b 32 38 5d 2c 20 70 42 74 2d 3e 6e  Data[28], pBt->n
1e350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
1e360 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e370 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
1e380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
1e390 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
1e3a0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
1e3b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
1e3c0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1e3d0 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74 65   prior to sqlite
1e3e0 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68 65  3PagerCommit whe
1e3f0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  n a transaction.
1e400 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20  ** is committed 
1e410 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
1e420 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
1e430 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
1e440 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
1e450 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
1e460 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
1e470 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
1e480 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
1e490 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
1e4a0 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
1e4b0 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
1e4c0 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
1e4d0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
1e4e0 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
1e4f0 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
1e500 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
1e510 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
1e520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
1e530 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
1e540 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
1e550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1e560 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  _OK;.  Pager *pP
1e570 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67  ager = pBt->pPag
1e580 65 72 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20  er;.  VVA_ONLY( 
1e590 69 6e 74 20 6e 52 65 66 20 3d 20 73 71 6c 69 74  int nRef = sqlit
1e5a0 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1e5b0 70 50 61 67 65 72 29 3b 20 29 0a 0a 20 20 61 73  pPager); )..  as
1e5c0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1e5d0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1e5e0 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
1e5f0 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
1e600 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
1e610 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
1e620 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
1e630 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
1e640 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 3b 20 20      Pgno nFin;  
1e650 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e660 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1e670 61 62 61 73 65 20 61 66 74 65 72 20 61 75 74 6f  abase after auto
1e680 76 61 63 75 75 6d 69 6e 67 20 2a 2f 0a 20 20 20  vacuuming */.   
1e690 20 50 67 6e 6f 20 6e 46 72 65 65 3b 20 20 20 20   Pgno nFree;    
1e6a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e6b0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1e6c0 65 65 6c 69 73 74 20 69 6e 69 74 69 61 6c 6c 79  eelist initially
1e6d0 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 46 72   */.    Pgno iFr
1e6e0 65 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ee;        /* Th
1e6f0 65 20 6e 65 78 74 20 70 61 67 65 20 74 6f 20 62  e next page to b
1e700 65 20 66 72 65 65 64 20 2a 2f 0a 20 20 20 20 50  e freed */.    P
1e710 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20 20 20 20  gno nOrig;      
1e720 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73 69    /* Database si
1e730 7a 65 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  ze before freein
1e740 67 20 2a 2f 0a 0a 20 20 20 20 6e 4f 72 69 67 20  g */..    nOrig 
1e750 3d 20 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  = btreePagecount
1e760 28 70 42 74 29 3b 0a 20 20 20 20 69 66 28 20 50  (pBt);.    if( P
1e770 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1e780 2c 20 6e 4f 72 69 67 29 20 7c 7c 20 6e 4f 72 69  , nOrig) || nOri
1e790 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
1e7a0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
1e7b0 20 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20     /* It is not 
1e7c0 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 72 65 61  possible to crea
1e7d0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 6f  te a database fo
1e7e0 72 20 77 68 69 63 68 20 74 68 65 20 66 69 6e 61  r which the fina
1e7f0 6c 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  l page.      ** 
1e800 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
1e810 74 65 72 2d 6d 61 70 20 70 61 67 65 20 6f 72 20  ter-map page or 
1e820 74 68 65 20 70 65 6e 64 69 6e 67 2d 62 79 74 65  the pending-byte
1e830 20 70 61 67 65 2e 20 49 66 20 6f 6e 65 0a 20 20   page. If one.  
1e840 20 20 20 20 2a 2a 20 69 73 20 65 6e 63 6f 75 6e      ** is encoun
1e850 74 65 72 65 64 2c 20 74 68 69 73 20 69 6e 64 69  tered, this indi
1e860 63 61 74 65 73 20 63 6f 72 72 75 70 74 69 6f 6e  cates corruption
1e870 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1e880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1e890 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e8a0 20 7d 0a 0a 20 20 20 20 6e 46 72 65 65 20 3d 20   }..    nFree = 
1e8b0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
1e8c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
1e8d0 29 3b 0a 20 20 20 20 6e 46 69 6e 20 3d 20 66 69  );.    nFin = fi
1e8e0 6e 61 6c 44 62 53 69 7a 65 28 70 42 74 2c 20 6e  nalDbSize(pBt, n
1e8f0 4f 72 69 67 2c 20 6e 46 72 65 65 29 3b 0a 20 20  Orig, nFree);.  
1e900 20 20 69 66 28 20 6e 46 69 6e 3e 6e 4f 72 69 67    if( nFin>nOrig
1e910 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e920 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1e930 20 20 20 69 66 28 20 6e 46 69 6e 3c 6e 4f 72 69     if( nFin<nOri
1e940 67 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  g ){.      rc = 
1e950 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
1e960 42 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  Bt, 0, 0);.    }
1e970 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65 3d 6e  .    for(iFree=n
1e980 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46 69 6e  Orig; iFree>nFin
1e990 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1e9a0 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20 20 20  K; iFree--){.   
1e9b0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
1e9c0 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46 69 6e  umStep(pBt, nFin
1e9d0 2c 20 69 46 72 65 65 2c 20 31 29 3b 0a 20 20 20  , iFree, 1);.   
1e9e0 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
1e9f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
1ea00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
1ea10 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
1ea20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ea30 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
1ea40 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
1ea50 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1ea60 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
1ea70 74 61 5b 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20  ta[32], 0);.    
1ea80 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
1ea90 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
1eaa0 36 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 75  6], 0);.      pu
1eab0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
1eac0 67 65 31 2d 3e 61 44 61 74 61 5b 32 38 5d 2c 20  ge1->aData[28], 
1ead0 6e 46 69 6e 29 3b 0a 20 20 20 20 20 20 70 42 74  nFin);.      pBt
1eae0 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 3d 20  ->bDoTruncate = 
1eaf0 31 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 50  1;.      pBt->nP
1eb00 61 67 65 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20  age = nFin;.    
1eb10 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  }.    if( rc!=SQ
1eb20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1eb30 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
1eb40 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
1eb50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
1eb60 72 74 28 20 6e 52 65 66 3e 3d 73 71 6c 69 74 65  rt( nRef>=sqlite
1eb70 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
1eb80 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65 74 75  Pager) );.  retu
1eb90 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6c 73 65 20  rn rc;.}..#else 
1eba0 2f 2a 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /* ifndef SQLITE
1ebb0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1ebc0 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 73 65 74   */.# define set
1ebd0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 78 29 20  ChildPtrmaps(x) 
1ebe0 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
1ebf0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1ec00 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69  tine does the fi
1ec10 72 73 74 20 70 68 61 73 65 20 6f 66 20 61 20 74  rst phase of a t
1ec20 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e  wo-phase commit.
1ec30 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1ec40 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c 6c 62  * causes a rollb
1ec50 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62  ack journal to b
1ec60 65 20 63 72 65 61 74 65 64 20 28 69 66 20 69 74  e created (if it
1ec70 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64   does not alread
1ec80 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e 64 20  y exist).** and 
1ec90 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 65  populated with e
1eca0 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74 69 6f  nough informatio
1ecb0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61 20 70  n so that if a p
1ecc0 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75 72 73  ower loss occurs
1ecd0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
1ece0 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64   can be restored
1ecf0 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   to its original
1ed00 20 73 74 61 74 65 20 62 79 20 70 6c 61 79 69 6e   state by playin
1ed10 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20 6a 6f  g back.** the jo
1ed20 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74 68 65  urnal.  Then the
1ed30 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
1ed40 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66 6c 75   journal are flu
1ed50 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a 20 74  shed out to.** t
1ed60 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65 72 20  he disk.  After 
1ed70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1ed80 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65 2c 20  afely on oxide, 
1ed90 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f 20 74  the changes to t
1eda0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 61  he.** database a
1edb0 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  re written into 
1edc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1edd0 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20 74 6f  e and flushed to
1ede0 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20 74 68   oxide..** At th
1edf0 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 63 61  e end of this ca
1ee00 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ll, the rollback
1ee10 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c 20 65   journal still e
1ee20 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  xists on the.** 
1ee30 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72 65 20  disk and we are 
1ee40 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 6c  still holding al
1ee50 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68 65 20  l locks, so the 
1ee60 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1ee70 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  not.** committed
1ee80 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 42 74  .  See sqlite3Bt
1ee90 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
1eea0 6f 28 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f  o() for the seco
1eeb0 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a  nd phase of the.
1eec0 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  ** commit proces
1eed0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61  s..**.** This ca
1eee0 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  ll is a no-op if
1eef0 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61   no write-transa
1ef00 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74  ction is current
1ef10 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74  ly active on pBt
1ef20 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ef30 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74 61  e, sync the data
1ef40 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
1ef50 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61  e btree pBt. zMa
1ef60 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a  ster points to.*
1ef70 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  * the name of a 
1ef80 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1ef90 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1efa0 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1efb0 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61  the.** individua
1efc0 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  l journal file, 
1efd0 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69  or is NULL, indi
1efe0 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72  cating no master
1eff0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
1f000 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61  * (single databa
1f010 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
1f020 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
1f030 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1f040 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73  master journal s
1f050 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61  hould already ha
1f060 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74  ve been.** creat
1f070 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69  ed, populated wi
1f080 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  th this journal 
1f090 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63  pointer and sync
1f0a0 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  ed to disk..**.*
1f0b0 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72  * Once this is r
1f0c0 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75 72  outine has retur
1f0d0 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68  ned, the only th
1f0e0 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f 20  ing required to 
1f0f0 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72  commit.** the wr
1f100 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1f110 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
1f120 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c  e file is to del
1f130 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
1f140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1f150 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
1f160 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e  ne(Btree *p, con
1f170 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  st char *zMaster
1f180 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f190 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
1f1a0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
1f1b0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74  _WRITE ){.    Bt
1f1c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1f1d0 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  >pBt;.    sqlite
1f1e0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
1f1f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f200 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1f210 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
1f220 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
1f230 72 63 20 3d 20 61 75 74 6f 56 61 63 75 75 6d 43  rc = autoVacuumC
1f240 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20  ommit(pBt);.    
1f250 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
1f270 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
1f280 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
1f290 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f2a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42      }.    if( pB
1f2b0 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65 20 29  t->bDoTruncate )
1f2c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
1f2d0 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67  agerTruncateImag
1f2e0 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  e(pBt->pPager, p
1f2f0 42 74 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 20 20  Bt->nPage);.    
1f300 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 63 20  }.#endif.    rc 
1f310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
1f320 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
1f330 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  ->pPager, zMaste
1f340 72 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 0);.    sqlit
1f350 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
1f360 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1f370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1f380 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1f390 65 64 20 66 72 6f 6d 20 62 6f 74 68 20 42 74 72  ed from both Btr
1f3a0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
1f3b0 28 29 20 61 6e 64 20 42 74 72 65 65 52 6f 6c 6c  () and BtreeRoll
1f3c0 62 61 63 6b 28 29 0a 2a 2a 20 61 74 20 74 68 65  back().** at the
1f3d0 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 20 61   conclusion of a
1f3e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f   transaction..*/
1f3f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 74 72  .static void btr
1f400 65 65 45 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  eeEndTransaction
1f410 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
1f420 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
1f430 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  >pBt;.  sqlite3 
1f440 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61  *db = p->db;.  a
1f450 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1f460 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1f470 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   );..#ifndef SQL
1f480 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1f490 55 55 4d 0a 20 20 70 42 74 2d 3e 62 44 6f 54 72  UUM.  pBt->bDoTr
1f4a0 75 6e 63 61 74 65 20 3d 20 30 3b 0a 23 65 6e 64  uncate = 0;.#end
1f4b0 69 66 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  if.  if( p->inTr
1f4c0 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e 45 20 26  ans>TRANS_NONE &
1f4d0 26 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  & db->nVdbeRead>
1f4e0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  1 ){.    /* If t
1f4f0 68 65 72 65 20 61 72 65 20 6f 74 68 65 72 20 61  here are other a
1f500 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
1f510 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20   that belong to 
1f520 74 68 69 73 20 64 61 74 61 62 61 73 65 0a 20 20  this database.  
1f530 20 20 2a 2a 20 68 61 6e 64 6c 65 2c 20 64 6f 77    ** handle, dow
1f540 6e 67 72 61 64 65 20 74 6f 20 61 20 72 65 61 64  ngrade to a read
1f550 2d 6f 6e 6c 79 20 74 72 61 6e 73 61 63 74 69 6f  -only transactio
1f560 6e 2e 20 54 68 65 20 6f 74 68 65 72 20 73 74 61  n. The other sta
1f570 74 65 6d 65 6e 74 73 0a 20 20 20 20 2a 2a 20 6d  tements.    ** m
1f580 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
1f590 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1f5a0 61 62 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 64  abase.  */.    d
1f5b0 6f 77 6e 67 72 61 64 65 41 6c 6c 53 68 61 72 65  owngradeAllShare
1f5c0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73  dCacheTableLocks
1f5d0 28 70 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 54 72  (p);.    p->inTr
1f5e0 61 6e 73 20 3d 20 54 52 41 4e 53 5f 52 45 41 44  ans = TRANS_READ
1f5f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1f600 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
1f610 68 61 64 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  had any kind of 
1f620 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
1f630 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
1f640 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1f650 69 6f 6e 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  ion count of the
1f660 20 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49   shared btree. I
1f670 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1f680 6e 20 63 6f 75 6e 74 20 0a 20 20 20 20 2a 2a 20  n count .    ** 
1f690 72 65 61 63 68 65 73 20 30 2c 20 73 65 74 20 74  reaches 0, set t
1f6a0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
1f6b0 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54  to TRANS_NONE. T
1f6c0 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66  he unlockBtreeIf
1f6d0 55 6e 75 73 65 64 28 29 0a 20 20 20 20 2a 2a 20  Unused().    ** 
1f6e0 63 61 6c 6c 20 62 65 6c 6f 77 20 77 69 6c 6c 20  call below will 
1f6f0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
1f700 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  .  */.    if( p-
1f710 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
1f720 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 63 6c  NONE ){.      cl
1f730 65 61 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68  earAllSharedCach
1f740 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a  eTableLocks(p);.
1f750 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e        pBt->nTran
1f760 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 20  saction--;.     
1f770 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72   if( 0==pBt->nTr
1f780 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ansaction ){.   
1f790 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e       pBt->inTran
1f7a0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
1f7b0 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
1f7c0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
1f7d0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1f7e0 73 61 63 74 69 6f 6e 20 73 74 61 74 65 20 74 6f  saction state to
1f7f0 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20   TRANS_NONE and 
1f800 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 20 20 20 20  unlock the .    
1f810 2a 2a 20 70 61 67 65 72 20 69 66 20 74 68 69 73  ** pager if this
1f820 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
1f830 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
1f840 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
1f850 20 20 2a 2f 0a 20 20 20 20 70 2d 3e 69 6e 54 72    */.    p->inTr
1f860 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
1f870 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ;.    unlockBtre
1f880 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
1f890 20 20 7d 0a 0a 20 20 62 74 72 65 65 49 6e 74 65    }..  btreeInte
1f8a0 67 72 69 74 79 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  grity(p);.}../*.
1f8b0 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 74 72  ** Commit the tr
1f8c0 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e  ansaction curren
1f8d0 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  tly in progress.
1f8e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f8f0 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ine implements t
1f900 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73 65 20  he second phase 
1f910 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63 6f 6d  of a 2-phase com
1f920 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73 71 6c  mit.  The.** sql
1f930 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
1f940 68 61 73 65 4f 6e 65 28 29 20 72 6f 75 74 69 6e  haseOne() routin
1f950 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
1f960 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
1f970 64 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20  d.** be invoked 
1f980 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
1f990 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
1f9a0 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
1f9b0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
1f9c0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 64 69 64 20  .** routine did 
1f9d0 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  all the work of 
1f9e0 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74  writing informat
1f9f0 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  ion out to disk 
1fa00 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65  and flushing the
1fa10 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20  .** contents so 
1fa20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72  that they are wr
1fa30 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64  itten onto the d
1fa40 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c  isk platter.  Al
1fa50 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  l this.** routin
1fa60 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64  e has to do is d
1fa70 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74  elete or truncat
1fa80 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 68 65  e or zero the he
1fa90 61 64 65 72 20 69 6e 20 74 68 65 0a 2a 2a 20 74  ader in the.** t
1faa0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
1fab0 6e 61 6c 20 28 77 68 69 63 68 20 63 61 75 73 65  nal (which cause
1fac0 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  s the transactio
1fad0 6e 20 74 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64  n to commit) and
1fae0 0a 2a 2a 20 64 72 6f 70 20 6c 6f 63 6b 73 2e 0a  .** drop locks..
1faf0 2a 2a 0a 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20  **.** Normally, 
1fb00 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
1fb10 72 73 20 77 68 69 6c 65 20 74 68 65 20 70 61 67  rs while the pag
1fb20 65 72 20 6c 61 79 65 72 20 69 73 20 61 74 74 65  er layer is atte
1fb30 6d 70 74 69 6e 67 20 74 6f 20 0a 2a 2a 20 66 69  mpting to .** fi
1fb40 6e 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72  nalize the under
1fb50 6c 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 69  lying journal fi
1fb60 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
1fb70 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72  n returns an err
1fb80 6f 72 20 61 6e 64 0a 2a 2a 20 74 68 65 20 75 70  or and.** the up
1fb90 70 65 72 20 6c 61 79 65 72 20 77 69 6c 6c 20 61  per layer will a
1fba0 74 74 65 6d 70 74 20 61 20 72 6f 6c 6c 62 61 63  ttempt a rollbac
1fbb0 6b 2e 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  k. However, if t
1fbc0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1fbd0 6e 74 0a 2a 2a 20 69 73 20 6e 6f 6e 2d 7a 65 72  nt.** is non-zer
1fbe0 6f 20 74 68 65 6e 20 74 68 69 73 20 62 2d 74 72  o then this b-tr
1fbf0 65 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ee transaction i
1fc00 73 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  s part of a mult
1fc10 69 2d 66 69 6c 65 20 0a 2a 2a 20 74 72 61 6e 73  i-file .** trans
1fc20 61 63 74 69 6f 6e 2e 20 49 6e 20 74 68 69 73 20  action. In this 
1fc30 63 61 73 65 2c 20 74 68 65 20 74 72 61 6e 73 61  case, the transa
1fc40 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1fc50 79 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  y been committed
1fc60 20 0a 2a 2a 20 28 62 79 20 64 65 6c 65 74 69 6e   .** (by deletin
1fc70 67 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  g a master journ
1fc80 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
1fc90 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 69 67 6e   caller will ign
1fca0 6f 72 65 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e  ore this .** fun
1fcb0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 63 6f  ctions return co
1fcc0 64 65 2e 20 53 6f 2c 20 65 76 65 6e 20 69 66 20  de. So, even if 
1fcd0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
1fce0 69 6e 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  in the pager lay
1fcf0 65 72 2c 0a 2a 2a 20 72 65 73 65 74 20 74 68 65  er,.** reset the
1fd00 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74 73 20   b-tree objects 
1fd10 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 20 74  internal state t
1fd20 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1fd30 74 68 65 20 77 72 69 74 65 0a 2a 2a 20 74 72 61  the write.** tra
1fd40 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 62 65 65  nsaction has bee
1fd50 6e 20 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 69  n closed. This i
1fd60 73 20 71 75 69 74 65 20 73 61 66 65 2c 20 61 73  s quite safe, as
1fd70 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
1fd80 68 61 76 65 0a 2a 2a 20 74 72 61 6e 73 69 74 69  have.** transiti
1fd90 6f 6e 65 64 20 74 6f 20 74 68 65 20 65 72 72 6f  oned to the erro
1fda0 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  r state..**.** T
1fdb0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
1fdc0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
1fdd0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fde0 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
1fdf0 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
1fe00 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
1fe10 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
1fe20 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
1fe30 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
1fe40 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
1fe50 65 20 2a 70 2c 20 69 6e 74 20 62 43 6c 65 61 6e  e *p, int bClean
1fe60 75 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  up){..  if( p->i
1fe70 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f  nTrans==TRANS_NO
1fe80 4e 45 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  NE ) return SQLI
1fe90 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
1fea0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
1feb0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
1fec0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
1fed0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72   handle has a wr
1fee0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
1fef0 6f 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65  open, commit the
1ff00 20 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a   shared-btrees .
1ff10 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1ff20 20 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61   and set the sha
1ff30 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
1ff40 4e 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20  NS_READ..  */.  
1ff50 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
1ff60 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
1ff70 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 42     int rc;.    B
1ff80 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1ff90 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65 72  ->pBt;.    asser
1ffa0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
1ffb0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
1ffc0 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  TE );.    assert
1ffd0 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
1ffe0 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20  ion>0 );.    rc 
1fff0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  = sqlite3PagerCo
20000 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
20010 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
20020 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20030 20 26 26 20 62 43 6c 65 61 6e 75 70 3d 3d 30 20   && bCleanup==0 
20040 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20050 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
20060 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20070 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69 44 61      }.    p->iDa
20080 74 61 56 65 72 73 69 6f 6e 2d 2d 3b 20 20 2f 2a  taVersion--;  /*
20090 20 43 6f 6d 70 65 6e 73 61 74 65 20 66 6f 72 20   Compensate for 
200a0 70 50 61 67 65 72 2d 3e 69 44 61 74 61 56 65 72  pPager->iDataVer
200b0 73 69 6f 6e 2b 2b 3b 20 2a 2f 0a 20 20 20 20 70  sion++; */.    p
200c0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
200d0 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a  n = TRANS_READ;.
200e0 20 20 20 20 62 74 72 65 65 43 6c 65 61 72 48 61      btreeClearHa
200f0 73 43 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20  sContent(pBt);. 
20100 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e 64 54 72   }..  btreeEndTr
20110 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
20120 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
20130 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
20140 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20150 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65  ** Do both phase
20160 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a  s of a commit..*
20170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
20180 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a  eeCommit(Btree *
20190 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
201a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
201b0 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r(p);.  rc = sql
201c0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
201d0 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20  haseOne(p, 0);. 
201e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
201f0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
20200 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
20210 74 50 68 61 73 65 54 77 6f 28 70 2c 20 30 29 3b  tPhaseTwo(p, 0);
20220 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
20230 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
20240 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20250 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20260 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
20270 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
20280 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
20290 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
202a0 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
202b0 20 6f 6e 20 61 6e 79 20 42 74 53 68 61 72 65 64   on any BtShared
202c0 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
202d0 72 65 66 65 72 65 6e 63 65 73 2e 20 20 4f 72 20  references.  Or 
202e0 69 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  if the writeOnly
202f0 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20   flag is set to 
20300 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 0a 2a 2a 20  1, then only.** 
20310 74 72 69 70 20 77 72 69 74 65 20 63 75 72 73 6f  trip write curso
20320 72 73 20 61 6e 64 20 6c 65 61 76 65 20 72 65 61  rs and leave rea
20330 64 20 63 75 72 73 6f 72 73 20 75 6e 63 68 61 6e  d cursors unchan
20340 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79  ged..**.** Every
20350 20 63 75 72 73 6f 72 20 69 73 20 61 20 63 61 6e   cursor is a can
20360 64 69 64 61 74 65 20 74 6f 20 62 65 20 74 72 69  didate to be tri
20370 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
20380 63 75 72 73 6f 72 73 0a 2a 2a 20 74 68 61 74 20  cursors.** that 
20390 62 65 6c 6f 6e 67 20 74 6f 20 6f 74 68 65 72 20  belong to other 
203a0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
203b0 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
203c0 20 74 6f 20 62 65 0a 2a 2a 20 73 68 61 72 69 6e   to be.** sharin
203d0 67 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  g the cache with
203e0 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
203f0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
20400 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
20410 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 20  ollback occurs. 
20420 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c 79  If the writeOnly
20430 0a 2a 2a 20 66 6c 61 67 20 69 73 20 74 72 75 65  .** flag is true
20440 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74  , then only writ
20450 65 2d 63 75 72 73 6f 72 73 20 6e 65 65 64 20 62  e-cursors need b
20460 65 20 74 72 69 70 70 65 64 20 2d 20 72 65 61 64  e tripped - read
20470 2d 6f 6e 6c 79 0a 2a 2a 20 63 75 72 73 6f 72 73  -only.** cursors
20480 20 73 61 76 65 20 74 68 65 69 72 20 63 75 72 72   save their curr
20490 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 73 6f  ent positions so
204a0 20 74 68 61 74 20 74 68 65 79 20 6d 61 79 20 63   that they may c
204b0 6f 6e 74 69 6e 75 65 20 0a 2a 2a 20 66 6f 6c 6c  ontinue .** foll
204c0 6f 77 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  owing the rollba
204d0 63 6b 2e 20 4f 72 2c 20 69 66 20 77 72 69 74 65  ck. Or, if write
204e0 4f 6e 6c 79 20 69 73 20 66 61 6c 73 65 2c 20 61  Only is false, a
204f0 6c 6c 20 63 75 72 73 6f 72 73 20 61 72 65 20 0a  ll cursors are .
20500 2a 2a 20 74 72 69 70 70 65 64 2e 20 49 6e 20 67  ** tripped. In g
20510 65 6e 65 72 61 6c 2c 20 77 72 69 74 65 4f 6e 6c  eneral, writeOnl
20520 79 20 69 73 20 66 61 6c 73 65 20 69 66 20 74 68  y is false if th
20530 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
20540 69 6e 67 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  ing.** rolled ba
20550 63 6b 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20  ck modified the 
20560 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e  database schema.
20570 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 62 2d   In this case b-
20580 74 72 65 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67  tree root.** pag
20590 65 73 20 6d 61 79 20 62 65 20 6d 6f 76 65 64 20  es may be moved 
205a0 6f 72 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 20  or deleted from 
205b0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6c 74  the database alt
205c0 6f 67 65 74 68 65 72 2c 20 6d 61 6b 69 6e 67 0a  ogether, making.
205d0 2a 2a 20 69 74 20 75 6e 73 61 66 65 20 66 6f 72  ** it unsafe for
205e0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 74 6f   read cursors to
205f0 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a   continue..**.**
20600 20 49 66 20 74 68 65 20 77 72 69 74 65 4f 6e 6c   If the writeOnl
20610 79 20 66 6c 61 67 20 69 73 20 74 72 75 65 20 61  y flag is true a
20620 6e 64 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  nd an error is e
20630 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65  ncountered while
20640 20 0a 2a 2a 20 73 61 76 69 6e 67 20 74 68 65 20   .** saving the 
20650 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
20660 20 6f 66 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20   of a read-only 
20670 63 75 72 73 6f 72 2c 20 61 6c 6c 20 63 75 72 73  cursor, all curs
20680 6f 72 73 2c 20 0a 2a 2a 20 69 6e 63 6c 75 64 69  ors, .** includi
20690 6e 67 20 61 6c 6c 20 72 65 61 64 2d 63 75 72 73  ng all read-curs
206a0 6f 72 73 20 61 72 65 20 74 72 69 70 70 65 64 2e  ors are tripped.
206b0 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
206c0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
206d0 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 69  successful, or i
206e0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
206f0 73 20 77 68 69 6c 65 0a 2a 2a 20 73 61 76 69 6e  s while.** savin
20700 67 20 61 20 63 75 72 73 6f 72 20 70 6f 73 69 74  g a cursor posit
20710 69 6f 6e 2c 20 61 6e 20 53 51 4c 69 74 65 20 65  ion, an SQLite e
20720 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  rror code..*/.in
20730 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  t sqlite3BtreeTr
20740 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
20750 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
20760 65 72 72 43 6f 64 65 2c 20 69 6e 74 20 77 72 69  errCode, int wri
20770 74 65 4f 6e 6c 79 29 7b 0a 20 20 42 74 43 75 72  teOnly){.  BtCur
20780 73 6f 72 20 2a 70 3b 0a 20 20 69 6e 74 20 72 63  sor *p;.  int rc
20790 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
207a0 20 61 73 73 65 72 74 28 20 28 77 72 69 74 65 4f   assert( (writeO
207b0 6e 6c 79 3d 3d 30 20 7c 7c 20 77 72 69 74 65 4f  nly==0 || writeO
207c0 6e 6c 79 3d 3d 31 29 20 26 26 20 42 54 43 46 5f  nly==1) && BTCF_
207d0 57 72 69 74 65 46 6c 61 67 3d 3d 31 20 29 3b 0a  WriteFlag==1 );.
207e0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
207f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
20800 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
20810 20 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65 2d     for(p=pBtree-
20820 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  >pBt->pCursor; p
20830 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
20840 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
20850 20 20 69 66 28 20 77 72 69 74 65 4f 6e 6c 79 20    if( writeOnly 
20860 26 26 20 28 70 2d 3e 63 75 72 46 6c 61 67 73 20  && (p->curFlags 
20870 26 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67  & BTCF_WriteFlag
20880 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
20890 69 66 28 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43  if( p->eState==C
208a0 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
208b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
208c0 5f 53 4b 49 50 4e 45 58 54 20 29 7b 0a 20 20 20  _SKIPNEXT ){.   
208d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 61 76 65         rc = save
208e0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
208f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20900 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20910 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76  {.            (v
20920 6f 69 64 29 73 71 6c 69 74 65 33 42 74 72 65 65  oid)sqlite3Btree
20930 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 70  TripAllCursors(p
20940 42 74 72 65 65 2c 20 72 63 2c 20 30 29 3b 0a 20  Btree, rc, 0);. 
20950 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
20960 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
20970 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
20980 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
20990 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
209a0 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 20 20 20  rsor(p);.       
209b0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
209c0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 20  SOR_FAULT;.     
209d0 20 20 20 70 2d 3e 73 6b 69 70 4e 65 78 74 20 3d     p->skipNext =
209e0 20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20   errCode;.      
209f0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
20a00 20 69 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b   i<=p->iPage; i+
20a10 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65  +){.        rele
20a20 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50 61 67  asePage(p->apPag
20a30 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 70  e[i]);.        p
20a40 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
20a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20a60 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
20a70 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
20a80 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20a90 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
20aa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20ab0 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a   in progress..**
20ac0 0a 2a 2a 20 49 66 20 74 72 69 70 43 6f 64 65 20  .** If tripCode 
20ad0 69 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b  is not SQLITE_OK
20ae0 20 74 68 65 6e 20 63 75 72 73 6f 72 73 20 77 69   then cursors wi
20af0 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
20b00 64 20 28 74 72 69 70 70 65 64 29 2e 0a 2a 2a 20  d (tripped)..** 
20b10 4f 6e 6c 79 20 77 72 69 74 65 20 63 75 72 73 6f  Only write curso
20b20 72 73 20 61 72 65 20 74 72 69 70 70 65 64 20 69  rs are tripped i
20b30 66 20 77 72 69 74 65 4f 6e 6c 79 20 69 73 20 74  f writeOnly is t
20b40 72 75 65 20 62 75 74 20 61 6c 6c 20 63 75 72 73  rue but all curs
20b50 6f 72 73 20 61 72 65 0a 2a 2a 20 74 72 69 70 70  ors are.** tripp
20b60 65 64 20 69 66 20 77 72 69 74 65 4f 6e 6c 79 20  ed if writeOnly 
20b70 69 73 20 66 61 6c 73 65 2e 20 20 41 6e 79 20 61  is false.  Any a
20b80 74 74 65 6d 70 74 20 74 6f 20 75 73 65 0a 2a 2a  ttempt to use.**
20b90 20 61 20 74 72 69 70 70 65 64 20 63 75 72 73 6f   a tripped curso
20ba0 72 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  r will result in
20bb0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a   an error..**.**
20bc0 20 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61   This will relea
20bd0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
20be0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
20bf0 65 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  e file.  If ther
20c00 65 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69  e.** are no acti
20c10 76 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61  ve cursors, it a
20c20 6c 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65  lso releases the
20c30 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69   read lock..*/.i
20c40 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  nt sqlite3BtreeR
20c50 6f 6c 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70  ollback(Btree *p
20c60 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 2c 20  , int tripCode, 
20c70 69 6e 74 20 77 72 69 74 65 4f 6e 6c 79 29 7b 0a  int writeOnly){.
20c80 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
20c90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
20ca0 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
20cb0 50 61 67 65 31 3b 0a 0a 20 20 61 73 73 65 72 74  Page1;..  assert
20cc0 28 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 31 20 7c  ( writeOnly==1 |
20cd0 7c 20 77 72 69 74 65 4f 6e 6c 79 3d 3d 30 20 29  | writeOnly==0 )
20ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 74 72 69 70  ;.  assert( trip
20cf0 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 41 42 4f  Code==SQLITE_ABO
20d00 52 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 74  RT_ROLLBACK || t
20d10 72 69 70 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  ripCode==SQLITE_
20d20 4f 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  OK );.  sqlite3B
20d30 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
20d40 69 66 28 20 74 72 69 70 43 6f 64 65 3d 3d 53 51  if( tripCode==SQ
20d50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
20d60 63 20 3d 20 74 72 69 70 43 6f 64 65 20 3d 20 73  c = tripCode = s
20d70 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
20d80 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  t, 0, 0);.    if
20d90 28 20 72 63 20 29 20 77 72 69 74 65 4f 6e 6c 79  ( rc ) writeOnly
20da0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
20db0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
20dc0 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 72 69  K;.  }.  if( tri
20dd0 70 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 6e 74  pCode ){.    int
20de0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
20df0 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72  reeTripAllCursor
20e00 73 28 70 2c 20 74 72 69 70 43 6f 64 65 2c 20 77  s(p, tripCode, w
20e10 72 69 74 65 4f 6e 6c 79 29 3b 0a 20 20 20 20 61  riteOnly);.    a
20e20 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
20e30 45 5f 4f 4b 20 7c 7c 20 28 77 72 69 74 65 4f 6e  E_OK || (writeOn
20e40 6c 79 3d 3d 30 20 26 26 20 72 63 32 3d 3d 53 51  ly==0 && rc2==SQ
20e50 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 20 20  LITE_OK) );.    
20e60 69 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f  if( rc2!=SQLITE_
20e70 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20  OK ) rc = rc2;. 
20e80 20 7d 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72   }.  btreeIntegr
20e90 69 74 79 28 70 29 3b 0a 0a 20 20 69 66 28 20 70  ity(p);..  if( p
20ea0 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
20eb0 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e  _WRITE ){.    in
20ec0 74 20 72 63 32 3b 0a 0a 20 20 20 20 61 73 73 65  t rc2;..    asse
20ed0 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d  rt( TRANS_WRITE=
20ee0 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  =pBt->inTransact
20ef0 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d  ion );.    rc2 =
20f00 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
20f10 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65  lback(pBt->pPage
20f20 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21  r);.    if( rc2!
20f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20f40 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
20f50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20    }..    /* The 
20f60 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
20f70 65 20 64 65 73 74 72 6f 79 65 64 20 74 68 65 20  e destroyed the 
20f80 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61  pPage1->aData va
20f90 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20  lue.  So.    ** 
20fa0 63 61 6c 6c 20 62 74 72 65 65 47 65 74 50 61 67  call btreeGetPag
20fb0 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67  e() on page 1 ag
20fc0 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20  ain to make.    
20fd0 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e  ** sure pPage1->
20fe0 61 44 61 74 61 20 69 73 20 73 65 74 20 63 6f 72  aData is set cor
20ff0 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69  rectly. */.    i
21000 66 28 20 62 74 72 65 65 47 65 74 50 61 67 65 28  f( btreeGetPage(
21010 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
21020 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
21030 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67  {.      int nPag
21040 65 20 3d 20 67 65 74 34 62 79 74 65 28 32 38 2b  e = get4byte(28+
21050 28 75 38 2a 29 70 50 61 67 65 31 2d 3e 61 44 61  (u8*)pPage1->aDa
21060 74 61 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ta);.      testc
21070 61 73 65 28 20 6e 50 61 67 65 3d 3d 30 20 29 3b  ase( nPage==0 );
21080 0a 20 20 20 20 20 20 69 66 28 20 6e 50 61 67 65  .      if( nPage
21090 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 50 61 67  ==0 ) sqlite3Pag
210a0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
210b0 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  >pPager, &nPage)
210c0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
210d0 28 20 70 42 74 2d 3e 6e 50 61 67 65 21 3d 6e 50  ( pBt->nPage!=nP
210e0 61 67 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  age );.      pBt
210f0 2d 3e 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 3b  ->nPage = nPage;
21100 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
21110 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
21120 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 6f  }.    assert( co
21130 75 6e 74 56 61 6c 69 64 43 75 72 73 6f 72 73 28  untValidCursors(
21140 70 42 74 2c 20 31 29 3d 3d 30 20 29 3b 0a 20 20  pBt, 1)==0 );.  
21150 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63    pBt->inTransac
21160 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41  tion = TRANS_REA
21170 44 3b 0a 20 20 20 20 62 74 72 65 65 43 6c 65 61  D;.    btreeClea
21180 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74 29  rHasContent(pBt)
21190 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 45 6e  ;.  }..  btreeEn
211a0 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b  dTransaction(p);
211b0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
211c0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
211d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
211e0 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
211f0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
21200 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
21210 69 6f 6e 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ion can be rolle
21220 64 0a 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65  d.** back indepe
21230 6e 64 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d  ndently of the m
21240 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ain transaction.
21250 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
21260 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a  a transaction .*
21270 2a 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e  * before startin
21280 67 20 61 20 73 75 62 74 72 61 6e 73 61 63 74 69  g a subtransacti
21290 6f 6e 2e 20 54 68 65 20 73 75 62 74 72 61 6e 73  on. The subtrans
212a0 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
212b0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 0a 2a  automatically .*
212c0 2a 20 69 66 20 74 68 65 20 6d 61 69 6e 20 74 72  * if the main tr
212d0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
212e0 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e  s or rolls back.
212f0 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e 74  .**.** Statement
21300 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 73   subtransactions
21310 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e 64   are used around
21320 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c 20   individual SQL 
21330 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74 68  statements.** th
21340 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65 64  at are contained
21350 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e 2e   within a BEGIN.
21360 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e 20  ..COMMIT block. 
21370 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74   If a constraint
21380 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73  .** error occurs
21390 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61 74   within the stat
213a0 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65 63  ement, the effec
213b0 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73 74  t of that one st
213c0 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20 62  atement.** can b
213d0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77 69  e rolled back wi
213e0 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20  thout having to 
213f0 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e 74  rollback the ent
21400 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ire transaction.
21410 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61 74 65 6d 65  .**.** A stateme
21420 6e 74 20 73 75 62 2d 74 72 61 6e 73 61 63 74 69  nt sub-transacti
21430 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
21440 64 20 61 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  d as an anonymou
21450 73 20 73 61 76 65 70 6f 69 6e 74 2e 20 54 68 65  s savepoint. The
21460 0a 2a 2a 20 76 61 6c 75 65 20 70 61 73 73 65 64  .** value passed
21470 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70   as the second p
21480 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
21490 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
214a0 73 61 76 65 70 6f 69 6e 74 73 2c 0a 2a 2a 20 69  savepoints,.** i
214b0 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 6e 65 77  ncluding the new
214c0 20 61 6e 6f 6e 79 6d 6f 75 73 20 73 61 76 65 70   anonymous savep
214d0 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f 6e 20 74 68  oint, open on th
214e0 65 20 42 2d 54 72 65 65 2e 20 69 2e 65 2e 20 69  e B-Tree. i.e. i
214f0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
21500 6f 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  o active savepoi
21510 6e 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65 72  nts and no other
21520 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
21530 61 63 74 69 6f 6e 73 20 6f 70 65 6e 2c 0a 2a 2a  actions open,.**
21540 20 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 31   iStatement is 1
21550 2e 20 54 68 69 73 20 61 6e 6f 6e 79 6d 6f 75 73  . This anonymous
21560 20 73 61 76 65 70 6f 69 6e 74 20 63 61 6e 20 62   savepoint can b
21570 65 20 72 65 6c 65 61 73 65 64 20 6f 72 20 72 6f  e released or ro
21580 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a 20 75 73 69  lled back.** usi
21590 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 42 74  ng the sqlite3Bt
215a0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 29 20 66  reeSavepoint() f
215b0 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
215c0 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
215d0 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 2c 20  nStmt(Btree *p, 
215e0 69 6e 74 20 69 53 74 61 74 65 6d 65 6e 74 29 7b  int iStatement){
215f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
21600 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
21610 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
21620 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
21630 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72 61 6e  ssert( p->inTran
21640 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
21650 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 74  ;.  assert( (pBt
21660 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
21670 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20 29  _READ_ONLY)==0 )
21680 3b 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61  ;.  assert( iSta
21690 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73  tement>0 );.  as
216a0 73 65 72 74 28 20 69 53 74 61 74 65 6d 65 6e 74  sert( iStatement
216b0 3e 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69  >p->db->nSavepoi
216c0 6e 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nt );.  assert( 
216d0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
216e0 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
216f0 29 3b 0a 20 20 2f 2a 20 41 74 20 74 68 65 20 70  );.  /* At the p
21700 61 67 65 72 20 6c 65 76 65 6c 2c 20 61 20 73 74  ager level, a st
21710 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
21720 69 6f 6e 20 69 73 20 61 20 73 61 76 65 70 6f 69  ion is a savepoi
21730 6e 74 20 77 69 74 68 0a 20 20 2a 2a 20 61 6e 20  nt with.  ** an 
21740 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74 68  index greater th
21750 61 6e 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74  an all savepoint
21760 73 20 63 72 65 61 74 65 64 20 65 78 70 6c 69 63  s created explic
21770 69 74 6c 79 20 75 73 69 6e 67 0a 20 20 2a 2a 20  itly using.  ** 
21780 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  SQL statements. 
21790 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
217a0 20 6f 70 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f   open, release o
217b0 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20  r rollback any. 
217c0 20 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69   ** such savepoi
217d0 6e 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74  nts while the st
217e0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
217f0 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73  ion savepoint is
21800 20 61 63 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20   active..  */.  
21810 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21820 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70  rOpenSavepoint(p
21830 42 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61  Bt->pPager, iSta
21840 74 65 6d 65 6e 74 29 3b 0a 20 20 73 71 6c 69 74  tement);.  sqlit
21850 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
21860 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21870 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  ./*.** The secon
21880 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
21890 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 70 2c  is function, op,
218a0 20 69 73 20 61 6c 77 61 79 73 20 53 41 56 45 50   is always SAVEP
218b0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a 2a 2a  OINT_ROLLBACK.**
218c0 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 45   or SAVEPOINT_RE
218d0 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75 6e 63  LEASE. This func
218e0 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65 6c 65  tion either rele
218f0 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20 62 61  ases or rolls ba
21900 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65 70 6f  ck the.** savepo
21910 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64 20 62  int identified b
21920 79 20 70 61 72 61 6d 65 74 65 72 20 69 53 61 76  y parameter iSav
21930 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64 69 6e  epoint, dependin
21940 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 0a  g on the value .
21950 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a 2a 20  ** of op..**.** 
21960 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76 65 70  Normally, iSavep
21970 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65 72 20  oint is greater 
21980 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
21990 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72 2c 20   zero. However, 
219a0 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41 56 45  if op is.** SAVE
219b0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
219c0 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e 74 20  then iSavepoint 
219d0 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31 2e 20  may also be -1. 
219e0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
219f0 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66   .** contents of
21a00 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
21a10 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f 6c 6c  saction are roll
21a20 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73  ed back. This is
21a30 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 72   different.** fr
21a40 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72 61 6e  om a normal tran
21a50 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
21a60 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20 61 72  , as no locks ar
21a70 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64 20 74  e released and t
21a80 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  he.** transactio
21a90 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e 2e 0a  n remains open..
21aa0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
21ab0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42 74 72  reeSavepoint(Btr
21ac0 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69  ee *p, int op, i
21ad0 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a  nt iSavepoint){.
21ae0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
21af0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 26 26  E_OK;.  if( p &&
21b00 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
21b10 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
21b20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
21b30 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73 73 65  p->pBt;.    asse
21b40 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
21b50 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
21b60 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
21b70 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
21b80 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
21b90 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
21ba0 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
21bb0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
21bc0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
21bd0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
21be0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
21bf0 72 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2d 3e  rSavepoint(pBt->
21c00 70 50 61 67 65 72 2c 20 6f 70 2c 20 69 53 61 76  pPager, op, iSav
21c10 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 69 66 28  epoint);.    if(
21c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
21c30 7b 0a 20 20 20 20 20 20 69 66 28 20 69 53 61 76  {.      if( iSav
21c40 65 70 6f 69 6e 74 3c 30 20 26 26 20 28 70 42 74  epoint<0 && (pBt
21c50 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53  ->btsFlags & BTS
21c60 5f 49 4e 49 54 49 41 4c 4c 59 5f 45 4d 50 54 59  _INITIALLY_EMPTY
21c70 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
21c80 70 42 74 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  pBt->nPage = 0;.
21c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
21ca0 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70   = newDatabase(p
21cb0 42 74 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  Bt);.      pBt->
21cc0 6e 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  nPage = get4byte
21cd0 28 32 38 20 2b 20 70 42 74 2d 3e 70 50 61 67 65  (28 + pBt->pPage
21ce0 31 2d 3e 61 44 61 74 61 29 3b 0a 0a 20 20 20 20  1->aData);..    
21cf0 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
21d00 65 20 73 69 7a 65 20 77 61 73 20 77 72 69 74 74  e size was writt
21d10 65 6e 20 69 6e 74 6f 20 74 68 65 20 6f 66 66 73  en into the offs
21d20 65 74 20 32 38 20 6f 66 20 74 68 65 20 68 65 61  et 28 of the hea
21d30 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 77 68 65  der.      ** whe
21d40 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
21d50 6e 20 73 74 61 72 74 65 64 2c 20 73 6f 20 77 65  n started, so we
21d60 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 76   know that the v
21d70 61 6c 75 65 20 61 74 20 6f 66 66 73 65 74 0a 20  alue at offset. 
21d80 20 20 20 20 20 2a 2a 20 32 38 20 69 73 20 6e 6f       ** 28 is no
21d90 6e 7a 65 72 6f 2e 20 2a 2f 0a 20 20 20 20 20 20  nzero. */.      
21da0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 50 61  assert( pBt->nPa
21db0 67 65 3e 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  ge>0 );.    }.  
21dc0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
21dd0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  ave(p);.  }.  re
21de0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21df0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
21e00 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54  ursor for the BT
21e10 72 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69  ree whose root i
21e20 73 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  s on the page.**
21e30 20 69 54 61 62 6c 65 2e 20 49 66 20 61 20 72 65   iTable. If a re
21e40 61 64 2d 6f 6e 6c 79 20 63 75 72 73 6f 72 20 69  ad-only cursor i
21e50 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
21e60 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
21e70 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6c  ** the caller al
21e80 72 65 61 64 79 20 68 61 73 20 61 74 20 6c 65 61  ready has at lea
21e90 73 74 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 74  st a read-only t
21ea0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 0a  ransaction open.
21eb0 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ** on the databa
21ec0 73 65 20 61 6c 72 65 61 64 79 2e 20 49 66 20 61  se already. If a
21ed0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73   write-cursor is
21ee0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 6e   requested, then
21ef0 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 20 69  .** the caller i
21f00 73 20 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76  s assumed to hav
21f10 65 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  e an open write 
21f20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a  transaction..**.
21f30 2a 2a 20 49 66 20 74 68 65 20 42 54 52 45 45 5f  ** If the BTREE_
21f40 57 52 43 53 52 20 62 69 74 20 6f 66 20 77 72 46  WRCSR bit of wrF
21f50 6c 61 67 20 69 73 20 63 6c 65 61 72 2c 20 74 68  lag is clear, th
21f60 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61  en the cursor ca
21f70 6e 20 6f 6e 6c 79 0a 2a 2a 20 62 65 20 75 73 65  n only.** be use
21f80 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 20 20  d for reading.  
21f90 49 66 20 74 68 65 20 42 54 52 45 45 5f 57 52 43  If the BTREE_WRC
21fa0 53 52 20 62 69 74 20 69 73 20 73 65 74 2c 20 74  SR bit is set, t
21fb0 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  hen the cursor.*
21fc0 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  * can be used fo
21fd0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
21fe0 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68 65   writing if othe
21ff0 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72  r conditions for
22000 20 77 72 69 74 69 6e 67 0a 2a 2a 20 61 72 65 20   writing.** are 
22010 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
22020 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74 69   are the conditi
22030 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  ons that must be
22040 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 0a 2a 2a   met in order.**
22050 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
22060 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a  be allowed:.**.*
22070 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f 72  * 1:  The cursor
22080 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
22090 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c  opened with wrFl
220a0 61 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 42 54  ag containing BT
220b0 52 45 45 5f 57 52 43 53 52 0a 2a 2a 0a 2a 2a 20  REE_WRCSR.**.** 
220c0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
220d0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
220e0 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
220f0 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
22100 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
22110 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
22120 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
22130 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
22140 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
22150 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
22160 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
22170 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
22180 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
22190 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
221a0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
221b0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
221c0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
221d0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
221e0 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
221f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
22200 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
22210 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
22220 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
22230 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
22240 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
22250 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
22260 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
22270 2a 0a 2a 2a 20 54 68 65 20 42 54 52 45 45 5f 46  *.** The BTREE_F
22280 4f 52 44 45 4c 45 54 45 20 62 69 74 20 6f 66 20  ORDELETE bit of 
22290 77 72 46 6c 61 67 20 6d 61 79 20 6f 70 74 69 6f  wrFlag may optio
222a0 6e 61 6c 6c 79 20 62 65 20 73 65 74 20 69 66 20  nally be set if 
222b0 42 54 52 45 45 5f 57 52 43 53 52 0a 2a 2a 20 69  BTREE_WRCSR.** i
222c0 73 20 73 65 74 2e 20 20 49 66 20 46 4f 52 44 45  s set.  If FORDE
222d0 4c 45 54 45 20 69 73 20 73 65 74 2c 20 74 68 61  LETE is set, tha
222e0 74 20 69 73 20 61 20 68 69 6e 74 20 74 6f 20 74  t is a hint to t
222f0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
22300 6e 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 63  n that.** this c
22310 75 72 73 6f 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  ursor will only 
22320 62 65 20 75 73 65 64 20 74 6f 20 73 65 65 6b 20  be used to seek 
22330 74 6f 20 61 6e 64 20 64 65 6c 65 74 65 20 65 6e  to and delete en
22340 74 72 69 65 73 20 6f 66 20 61 6e 20 69 6e 64 65  tries of an inde
22350 78 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20  x.** as part of 
22360 61 20 6c 61 72 67 65 72 20 44 45 4c 45 54 45 20  a larger DELETE 
22370 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 65 20  statement.  The 
22380 46 4f 52 44 45 4c 45 54 45 20 68 69 6e 74 20 69  FORDELETE hint i
22390 73 20 6e 6f 74 20 75 73 65 64 20 62 79 0a 2a 2a  s not used by.**
223a0 20 74 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 61   this implementa
223b0 74 69 6f 6e 2e 20 20 42 75 74 20 69 6e 20 61 20  tion.  But in a 
223c0 68 79 70 6f 74 68 65 74 69 63 61 6c 20 61 6c 74  hypothetical alt
223d0 65 72 6e 61 74 69 76 65 20 73 74 6f 72 61 67 65  ernative storage
223e0 20 65 6e 67 69 6e 65 20 0a 2a 2a 20 69 6e 20 77   engine .** in w
223f0 68 69 63 68 20 69 6e 64 65 78 20 65 6e 74 72 69  hich index entri
22400 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  es are automatic
22410 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
22420 6e 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  n corresponding 
22430 74 61 62 6c 65 0a 2a 2a 20 72 6f 77 73 20 61 72  table.** rows ar
22440 65 20 64 65 6c 65 74 65 64 2c 20 74 68 65 20 46  e deleted, the F
22450 4f 52 44 45 4c 45 54 45 20 66 6c 61 67 20 69 73  ORDELETE flag is
22460 20 61 20 68 69 6e 74 20 74 68 61 74 20 61 6c 6c   a hint that all
22470 20 53 45 45 4b 20 61 6e 64 20 44 45 4c 45 54 45   SEEK and DELETE
22480 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  .** operations o
22490 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 63 61  n this cursor ca
224a0 6e 20 62 65 20 6e 6f 2d 6f 70 73 20 61 6e 64 20  n be no-ops and 
224b0 61 6c 6c 20 52 45 41 44 20 6f 70 65 72 61 74 69  all READ operati
224c0 6f 6e 73 20 63 61 6e 20 0a 2a 2a 20 72 65 74 75  ons can .** retu
224d0 72 6e 20 61 20 6e 75 6c 6c 20 72 6f 77 20 28 32  rn a null row (2
224e0 2d 62 79 74 65 73 3a 20 30 78 30 31 20 30 78 30  -bytes: 0x01 0x0
224f0 30 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65  0)..**.** No che
22500 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f  cking is done to
22510 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
22520 70 61 67 65 20 69 54 61 62 6c 65 20 72 65 61 6c  page iTable real
22530 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f  ly is the.** roo
22540 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d 74 72  t page of a b-tr
22550 65 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  ee.  If it is no
22560 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  t, then the curs
22570 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 77  or acquired.** w
22580 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  ill not work cor
22590 72 65 63 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74  rectly..**.** It
225a0 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
225b0 20 74 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   the sqlite3Btre
225c0 65 43 75 72 73 6f 72 5a 65 72 6f 28 29 20 68 61  eCursorZero() ha
225d0 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 0a 2a 2a  s been called.**
225e0 20 6f 6e 20 70 43 75 72 20 74 6f 20 69 6e 69 74   on pCur to init
225f0 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
22600 79 20 73 70 61 63 65 20 70 72 69 6f 72 20 74 6f  y space prior to
22610 20 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72   invoking this r
22620 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  outine..*/.stati
22630 63 20 69 6e 74 20 62 74 72 65 65 43 75 72 73 6f  c int btreeCurso
22640 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  r(.  Btree *p,  
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22670 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e  he btree */.  in
22680 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20 20 20  t iTable,       
22690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226a0 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
226b0 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
226c0 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
226d0 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
226e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
226f0 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30 20  * 1 to write. 0 
22700 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73  read-only */.  s
22710 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70  truct KeyInfo *p
22720 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20  KeyInfo,        
22730 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
22740 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73 6f 6e  rg to comparison
22750 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 42   function */.  B
22760 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20  tCursor *pCur   
22770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22780 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
22790 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20 2a 2f  or new cursor */
227a0 0a 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  .){.  BtShared *
227b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 20 20 20  pBt = p->pBt;   
227c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
227d0 53 68 61 72 65 64 20 62 2d 74 72 65 65 20 68 61  Shared b-tree ha
227e0 6e 64 6c 65 20 2a 2f 0a 20 20 42 74 43 75 72 73  ndle */.  BtCurs
227f0 6f 72 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  or *pX;         
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22810 20 2f 2a 20 4c 6f 6f 70 69 6e 67 20 6f 76 65 72   /* Looping over
22820 20 6f 74 68 65 72 20 61 6c 6c 20 63 75 72 73 6f   other all curso
22830 72 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  rs */..  assert(
22840 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
22850 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
22860 61 73 73 65 72 74 28 20 77 72 46 6c 61 67 3d 3d  assert( wrFlag==
22870 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46  0 .       || wrF
22880 6c 61 67 3d 3d 42 54 52 45 45 5f 57 52 43 53 52  lag==BTREE_WRCSR
22890 20 0a 20 20 20 20 20 20 20 7c 7c 20 77 72 46 6c   .       || wrFl
228a0 61 67 3d 3d 28 42 54 52 45 45 5f 57 52 43 53 52  ag==(BTREE_WRCSR
228b0 7c 42 54 52 45 45 5f 46 4f 52 44 45 4c 45 54 45  |BTREE_FORDELETE
228c0 29 20 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  ) .  );..  /* Th
228d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
228e0 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 76 65  rt statements ve
228f0 72 69 66 79 20 74 68 61 74 20 69 66 20 74 68 69  rify that if thi
22900 73 20 69 73 20 61 20 73 68 61 72 61 62 6c 65 20  s is a sharable 
22910 0a 20 20 2a 2a 20 62 2d 74 72 65 65 20 64 61 74  .  ** b-tree dat
22920 61 62 61 73 65 2c 20 74 68 65 20 63 6f 6e 6e 65  abase, the conne
22930 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67  ction is holding
22940 20 74 68 65 20 72 65 71 75 69 72 65 64 20 74 61   the required ta
22950 62 6c 65 20 6c 6f 63 6b 73 2c 20 0a 20 20 2a 2a  ble locks, .  **
22960 20 61 6e 64 20 74 68 61 74 20 6e 6f 20 6f 74 68   and that no oth
22970 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  er connection ha
22980 73 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f  s any open curso
22990 72 20 74 68 61 74 20 63 6f 6e 66 6c 69 63 74 73  r that conflicts
229a0 20 77 69 74 68 20 0a 20 20 2a 2a 20 74 68 69 73   with .  ** this
229b0 20 6c 6f 63 6b 2e 20 20 2a 2f 0a 20 20 61 73 73   lock.  */.  ass
229c0 65 72 74 28 20 68 61 73 53 68 61 72 65 64 43 61  ert( hasSharedCa
229d0 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20  cheTableLock(p, 
229e0 69 54 61 62 6c 65 2c 20 70 4b 65 79 49 6e 66 6f  iTable, pKeyInfo
229f0 21 3d 30 2c 20 28 77 72 46 6c 61 67 3f 32 3a 31  !=0, (wrFlag?2:1
22a00 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  )) );.  assert( 
22a10 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 21 68 61  wrFlag==0 || !ha
22a20 73 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  sReadConflicts(p
22a30 2c 20 69 54 61 62 6c 65 29 20 29 3b 0a 0a 20 20  , iTable) );..  
22a40 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74  /* Assert that t
22a50 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 70  he caller has op
22a60 65 6e 65 64 20 74 68 65 20 72 65 71 75 69 72 65  ened the require
22a70 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  d transaction. *
22a80 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69  /.  assert( p->i
22a90 6e 54 72 61 6e 73 3e 54 52 41 4e 53 5f 4e 4f 4e  nTrans>TRANS_NON
22aa0 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  E );.  assert( w
22ab0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 70 2d 3e 69  rFlag==0 || p->i
22ac0 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52  nTrans==TRANS_WR
22ad0 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ITE );.  assert(
22ae0 20 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20   pBt->pPage1 && 
22af0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
22b00 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta );.  assert( 
22b10 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 28 70 42  wrFlag==0 || (pB
22b20 74 2d 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54  t->btsFlags & BT
22b30 53 5f 52 45 41 44 5f 4f 4e 4c 59 29 3d 3d 30 20  S_READ_ONLY)==0 
22b40 29 3b 0a 0a 20 20 69 66 28 20 77 72 46 6c 61 67  );..  if( wrFlag
22b50 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 61 74 65   ){.    allocate
22b60 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
22b70 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 54 6d      if( pBt->pTm
22b80 70 53 70 61 63 65 3d 3d 30 20 29 20 72 65 74 75  pSpace==0 ) retu
22b90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
22ba0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
22bb0 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 62 74 72  iTable==1 && btr
22bc0 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  eePagecount(pBt)
22bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
22be0 74 28 20 77 72 46 6c 61 67 3d 3d 30 20 29 3b 0a  t( wrFlag==0 );.
22bf0 20 20 20 20 69 54 61 62 6c 65 20 3d 20 30 3b 0a      iTable = 0;.
22c00 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68    }..  /* Now th
22c10 61 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f  at no other erro
22c20 72 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69  rs can occur, fi
22c30 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20  nish filling in 
22c40 74 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a  the BtCursor.  *
22c50 2a 20 76 61 72 69 61 62 6c 65 73 20 61 6e 64 20  * variables and 
22c60 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
22c70 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
22c80 64 20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 70 43  d list.  */.  pC
22c90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
22ca0 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 70  Pgno)iTable;.  p
22cb0 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
22cc0 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  .  pCur->pKeyInf
22cd0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
22ce0 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20 70  pCur->pBtree = p
22cf0 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d 20  ;.  pCur->pBt = 
22d00 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  pBt;.  pCur->cur
22d10 46 6c 61 67 73 20 3d 20 77 72 46 6c 61 67 20 3f  Flags = wrFlag ?
22d20 20 42 54 43 46 5f 57 72 69 74 65 46 6c 61 67 20   BTCF_WriteFlag 
22d30 3a 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  : 0;.  pCur->cur
22d40 50 61 67 65 72 46 6c 61 67 73 20 3d 20 77 72 46  PagerFlags = wrF
22d50 6c 61 67 20 3f 20 30 20 3a 20 50 41 47 45 52 5f  lag ? 0 : PAGER_
22d60 47 45 54 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  GET_READONLY;.  
22d70 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
22d80 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 75 72 73  two or more curs
22d90 6f 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ors on the same 
22da0 62 74 72 65 65 2c 20 74 68 65 6e 20 61 6c 6c 20  btree, then all 
22db0 73 75 63 68 0a 20 20 2a 2a 20 63 75 72 73 6f 72  such.  ** cursor
22dc0 73 20 2a 6d 75 73 74 2a 20 68 61 76 65 20 74 68  s *must* have th
22dd0 65 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65 20  e BTCF_Multiple 
22de0 66 6c 61 67 20 73 65 74 2e 20 2a 2f 0a 20 20 66  flag set. */.  f
22df0 6f 72 28 70 58 3d 70 42 74 2d 3e 70 43 75 72 73  or(pX=pBt->pCurs
22e00 6f 72 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  or; pX; pX=pX->p
22e10 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
22e20 58 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 28 50 67  X->pgnoRoot==(Pg
22e30 6e 6f 29 69 54 61 62 6c 65 20 29 7b 0a 20 20 20  no)iTable ){.   
22e40 20 20 20 70 58 2d 3e 63 75 72 46 6c 61 67 73 20     pX->curFlags 
22e50 7c 3d 20 42 54 43 46 5f 4d 75 6c 74 69 70 6c 65  |= BTCF_Multiple
22e60 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 63 75  ;.      pCur->cu
22e70 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46 5f 4d  rFlags |= BTCF_M
22e80 75 6c 74 69 70 6c 65 3b 0a 20 20 20 20 7d 0a 20  ultiple;.    }. 
22e90 20 7d 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74   }.  pCur->pNext
22ea0 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
22eb0 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
22ec0 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
22ed0 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
22ee0 49 4e 56 41 4c 49 44 3b 0a 20 20 72 65 74 75 72  INVALID;.  retur
22ef0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69  n SQLITE_OK;.}.i
22f00 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
22f10 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
22f20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
22f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f40 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
22f50 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
22f60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
22f90 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
22fa0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
22fb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22fd0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
22fe0 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
22ff0 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
23000 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
23010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23020 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
23030 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
23040 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
23050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
23070 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
23080 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
23090 63 3b 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3c  c;.  if( iTable<
230a0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
230b0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
230c0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
230d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
230e0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  r(p);.    rc = b
230f0 74 72 65 65 43 75 72 73 6f 72 28 70 2c 20 69 54  treeCursor(p, iT
23100 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b  able, wrFlag, pK
23110 65 79 49 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20  eyInfo, pCur);. 
23120 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
23130 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72  eave(p);.  }.  r
23140 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23150 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  ** Return the si
23160 7a 65 20 6f 66 20 61 20 42 74 43 75 72 73 6f 72  ze of a BtCursor
23170 20 6f 62 6a 65 63 74 20 69 6e 20 62 79 74 65 73   object in bytes
23180 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 74  ..**.** This int
23190 65 72 66 61 63 65 73 20 69 73 20 6e 65 65 64 65  erfaces is neede
231a0 64 20 73 6f 20 74 68 61 74 20 75 73 65 72 73 20  d so that users 
231b0 6f 66 20 63 75 72 73 6f 72 73 20 63 61 6e 20 70  of cursors can p
231c0 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 73 75  reallocate.** su
231d0 66 66 69 63 69 65 6e 74 20 73 74 6f 72 61 67 65  fficient storage
231e0 20 74 6f 20 68 6f 6c 64 20 61 20 63 75 72 73 6f   to hold a curso
231f0 72 2e 20 20 54 68 65 20 42 74 43 75 72 73 6f 72  r.  The BtCursor
23200 20 6f 62 6a 65 63 74 20 69 73 20 6f 70 61 71 75   object is opaqu
23210 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73 20 73 6f  e.** to users so
23220 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 64 6f 20   they cannot do 
23230 74 68 65 20 73 69 7a 65 6f 66 28 29 20 74 68 65  the sizeof() the
23240 6d 73 65 6c 76 65 73 20 2d 20 74 68 65 79 20 6d  mselves - they m
23250 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73  ust call.** this
23260 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74   routine..*/.int
23270 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
23280 73 6f 72 53 69 7a 65 28 76 6f 69 64 29 7b 0a 20  sorSize(void){. 
23290 20 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 73   return ROUND8(s
232a0 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
232b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
232c0 61 6c 69 7a 65 20 6d 65 6d 6f 72 79 20 74 68 61  alize memory tha
232d0 74 20 77 69 6c 6c 20 62 65 20 63 6f 6e 76 65 72  t will be conver
232e0 74 65 64 20 69 6e 74 6f 20 61 20 42 74 43 75 72  ted into a BtCur
232f0 73 6f 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  sor object..**.*
23300 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 61 70 70  * The simple app
23310 72 6f 61 63 68 20 68 65 72 65 20 77 6f 75 6c 64  roach here would
23320 20 62 65 20 74 6f 20 6d 65 6d 73 65 74 28 29 20   be to memset() 
23330 74 68 65 20 65 6e 74 69 72 65 20 6f 62 6a 65 63  the entire objec
23340 74 0a 2a 2a 20 74 6f 20 7a 65 72 6f 2e 20 20 42  t.** to zero.  B
23350 75 74 20 69 74 20 74 75 72 6e 73 20 6f 75 74 20  ut it turns out 
23360 74 68 61 74 20 74 68 65 20 61 70 50 61 67 65 5b  that the apPage[
23370 5d 20 61 6e 64 20 61 69 49 64 78 5b 5d 20 61 72  ] and aiIdx[] ar
23380 72 61 79 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6e  rays.** do not n
23390 65 65 64 20 74 6f 20 62 65 20 7a 65 72 6f 65 64  eed to be zeroed
233a0 20 61 6e 64 20 74 68 65 79 20 61 72 65 20 6c 61   and they are la
233b0 72 67 65 2c 20 73 6f 20 77 65 20 63 61 6e 20 73  rge, so we can s
233c0 61 76 65 20 61 20 6c 6f 74 0a 2a 2a 20 6f 66 20  ave a lot.** of 
233d0 72 75 6e 2d 74 69 6d 65 20 62 79 20 73 6b 69 70  run-time by skip
233e0 70 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c  ping the initial
233f0 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 6f 73 65  ization of those
23400 20 65 6c 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 76 6f   elements..*/.vo
23410 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  id sqlite3BtreeC
23420 75 72 73 6f 72 5a 65 72 6f 28 42 74 43 75 72 73  ursorZero(BtCurs
23430 6f 72 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74  or *p){.  memset
23440 28 70 2c 20 30 2c 20 6f 66 66 73 65 74 6f 66 28  (p, 0, offsetof(
23450 42 74 43 75 72 73 6f 72 2c 20 69 50 61 67 65 29  BtCursor, iPage)
23460 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
23470 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68 65  e a cursor.  The
23480 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
23490 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
234a0 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20 77  is released.** w
234b0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75 72  hen the last cur
234c0 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a  sor is closed..*
234d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
234e0 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42 74  eeCloseCursor(Bt
234f0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23500 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20 3d   Btree *pBtree =
23510 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
23520 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20   if( pBtree ){. 
23530 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74     int i;.    Bt
23540 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
23550 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
23560 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
23570 42 74 72 65 65 29 3b 0a 20 20 20 20 73 71 6c 69  Btree);.    sqli
23580 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75 72  te3BtreeClearCur
23590 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20 61  sor(pCur);.    a
235a0 73 73 65 72 74 28 20 70 42 74 2d 3e 70 43 75 72  ssert( pBt->pCur
235b0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  sor!=0 );.    if
235c0 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d  ( pBt->pCursor==
235d0 70 43 75 72 20 29 7b 0a 20 20 20 20 20 20 70 42  pCur ){.      pB
235e0 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
235f0 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
23600 6c 73 65 7b 0a 20 20 20 20 20 20 42 74 43 75 72  lse{.      BtCur
23610 73 6f 72 20 2a 70 50 72 65 76 20 3d 20 70 42 74  sor *pPrev = pBt
23620 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->pCursor;.     
23630 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
23640 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70   pPrev->pNext==p
23650 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
23660 20 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20   pPrev->pNext = 
23670 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
23680 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
236a0 70 50 72 65 76 20 3d 20 70 50 72 65 76 2d 3e 70  pPrev = pPrev->p
236b0 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 77 68 69  Next;.      }whi
236c0 6c 65 28 20 41 4c 57 41 59 53 28 70 50 72 65 76  le( ALWAYS(pPrev
236d0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ) );.    }.    f
236e0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
236f0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
23700 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
23710 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29  pCur->apPage[i])
23720 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 6c 6f  ;.    }.    unlo
23730 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
23740 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
23750 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76  3_free(pCur->aOv
23760 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 2f 2a 20  erflow);.    /* 
23770 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75  sqlite3_free(pCu
23780 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  r); */.    sqlit
23790 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
237a0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ree);.  }.  retu
237b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
237c0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
237d0 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20 67   the BtCursor* g
237e0 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75  iven in the argu
237f0 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69 64  ment has a valid
23800 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
23810 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 66  o structure.  If
23820 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
23830 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a 2a  dy valid, call.*
23840 2a 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  * btreeParseCell
23850 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
23860 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
23870 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
23880 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
23890 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
238a0 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
238b0 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
238c0 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
238d0 6f 66 20 63 61 6c 6c 73 20 74 6f 20 62 74 72 65  of calls to btre
238e0 65 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2f  eParseCell()..*/
238f0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
23900 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73    static void as
23910 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43  sertCellInfo(BtC
23920 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
23930 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
23940 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
23950 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20   pCur->iPage;.  
23960 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 2c 20    memset(&info, 
23970 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f 29 29  0, sizeof(info))
23980 3b 0a 20 20 20 20 62 74 72 65 65 50 61 72 73 65  ;.    btreeParse
23990 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67  Cell(pCur->apPag
239a0 65 5b 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e  e[iPage], pCur->
239b0 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69  aiIdx[iPage], &i
239c0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
239d0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20  ( CORRUPT_DB || 
239e0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
239f0 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
23a00 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
23a10 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
23a20 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
23a30 6f 28 78 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  o(x).#endif.stat
23a40 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
23a50 4e 45 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  NE void getCellI
23a60 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
23a70 75 72 29 7b 0a 20 20 69 66 28 20 70 43 75 72 2d  ur){.  if( pCur-
23a80 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
23a90 7b 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20  {.    int iPage 
23aa0 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
23ab0 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67     pCur->curFlag
23ac0 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64 4e  s |= BTCF_ValidN
23ad0 4b 65 79 3b 0a 20 20 20 20 62 74 72 65 65 50 61  Key;.    btreePa
23ae0 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70  rseCell(pCur->ap
23af0 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72  Page[iPage],pCur
23b00 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26  ->aiIdx[iPage],&
23b10 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 7d  pCur->info);.  }
23b20 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
23b30 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
23b40 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e    }.}..#ifndef N
23b50 44 45 42 55 47 20 20 2f 2a 20 54 68 65 20 6e 65  DEBUG  /* The ne
23b60 78 74 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  xt routine used 
23b70 6f 6e 6c 79 20 77 69 74 68 69 6e 20 61 73 73 65  only within asse
23b80 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
23b90 2a 2f 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  */./*.** Return 
23ba0 74 72 75 65 20 69 66 20 74 68 65 20 67 69 76 65  true if the give
23bb0 6e 20 42 74 43 75 72 73 6f 72 20 69 73 20 76 61  n BtCursor is va
23bc0 6c 69 64 2e 20 20 41 20 76 61 6c 69 64 20 63 75  lid.  A valid cu
23bd0 72 73 6f 72 20 69 73 20 6f 6e 65 0a 2a 2a 20 74  rsor is one.** t
23be0 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  hat is currently
23bf0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 20 72   pointing to a r
23c00 6f 77 20 69 6e 20 61 20 28 6e 6f 6e 2d 65 6d 70  ow in a (non-emp
23c10 74 79 29 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68  ty) table..** Th
23c20 69 73 20 69 73 20 61 20 76 65 72 69 66 69 63 61  is is a verifica
23c30 74 69 6f 6e 20 72 6f 75 74 69 6e 65 20 69 73 20  tion routine is 
23c40 75 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e  used only within
23c50 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
23c60 65 6e 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ents..*/.int sql
23c70 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
23c80 73 56 61 6c 69 64 28 42 74 43 75 72 73 6f 72 20  sValid(BtCursor 
23c90 2a 70 43 75 72 29 7b 0a 20 20 72 65 74 75 72 6e  *pCur){.  return
23ca0 20 70 43 75 72 20 26 26 20 70 43 75 72 2d 3e 65   pCur && pCur->e
23cb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
23cc0 4c 49 44 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  LID;.}.#endif /*
23cd0 20 4e 44 45 42 55 47 20 2a 2f 0a 69 6e 74 20 73   NDEBUG */.int s
23ce0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
23cf0 72 49 73 56 61 6c 69 64 4e 4e 28 42 74 43 75 72  rIsValidNN(BtCur
23d00 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73  sor *pCur){.  as
23d10 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 29 3b  sert( pCur!=0 );
23d20 0a 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e  .  return pCur->
23d30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
23d40 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
23d50 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
23d60 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
23d70 65 79 20 6f 72 20 22 72 6f 77 69 64 22 20 66 6f  ey or "rowid" fo
23d80 72 20 61 20 74 61 62 6c 65 20 62 74 72 65 65 2e  r a table btree.
23d90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
23da0 20 69 73 20 6f 6e 6c 79 20 76 61 6c 69 64 20 66   is only valid f
23db0 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61 74  or a cursor that
23dc0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74   is pointing int
23dd0 6f 20 61 0a 2a 2a 20 6f 72 64 69 6e 61 72 79 20  o a.** ordinary 
23de0 74 61 62 6c 65 20 62 74 72 65 65 2e 20 20 49 66  table btree.  If
23df0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e   the cursor poin
23e00 74 73 20 74 6f 20 61 6e 20 69 6e 64 65 78 20 62  ts to an index b
23e10 74 72 65 65 20 6f 72 0a 2a 2a 20 69 73 20 69 6e  tree or.** is in
23e20 76 61 6c 69 64 2c 20 74 68 65 20 72 65 73 75 6c  valid, the resul
23e30 74 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  t of this routin
23e40 65 20 69 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a  e is undefined..
23e50 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 42 74  */.i64 sqlite3Bt
23e60 72 65 65 49 6e 74 65 67 65 72 4b 65 79 28 42 74  reeIntegerKey(Bt
23e70 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
23e80 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
23e90 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
23ea0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
23eb0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
23ec0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
23ed0 65 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e  ert( pCur->curIn
23ee0 74 4b 65 79 20 29 3b 0a 20 20 67 65 74 43 65 6c  tKey );.  getCel
23ef0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72  lInfo(pCur);.  r
23f00 65 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f  eturn pCur->info
23f10 2e 6e 4b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  .nKey;.}../*.** 
23f20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
23f30 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 61  r of bytes of pa
23f40 79 6c 6f 61 64 20 66 6f 72 20 74 68 65 20 65 6e  yload for the en
23f50 74 72 79 20 74 68 61 74 20 70 43 75 72 20 69 73  try that pCur is
23f60 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  .** currently po
23f70 69 6e 74 69 6e 67 20 74 6f 2e 20 20 46 6f 72 20  inting to.  For 
23f80 74 61 62 6c 65 20 62 74 72 65 65 73 2c 20 74 68  table btrees, th
23f90 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 61  is will be the a
23fa0 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 64 61 74 61  mount.** of data
23fb0 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 62 74 72  .  For index btr
23fc0 65 65 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ees, this will b
23fd0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
23fe0 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  e key..**.** The
23ff0 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 67 75 61   caller must gua
24000 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
24010 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
24020 6e 67 20 74 6f 20 61 20 6e 6f 6e 2d 4e 55 4c 4c  ng to a non-NULL
24030 0a 2a 2a 20 76 61 6c 69 64 20 65 6e 74 72 79 2e  .** valid entry.
24040 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
24050 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  , the calling pr
24060 6f 63 65 64 75 72 65 20 6d 75 73 74 20 67 75 61  ocedure must gua
24070 72 61 6e 74 65 65 0a 2a 2a 20 74 68 61 74 20 74  rantee.** that t
24080 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 43 75  he cursor has Cu
24090 72 73 6f 72 2e 65 53 74 61 74 65 3d 3d 43 55 52  rsor.eState==CUR
240a0 53 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2f 0a 75 33  SOR_VALID..*/.u3
240b0 32 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  2 sqlite3BtreePa
240c0 79 6c 6f 61 64 53 69 7a 65 28 42 74 43 75 72 73  yloadSize(BtCurs
240d0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
240e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
240f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
24100 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
24110 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
24120 4c 49 44 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c  LID );.  getCell
24130 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 72 65  Info(pCur);.  re
24140 74 75 72 6e 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  turn pCur->info.
24150 6e 50 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 2f 2a 0a  nPayload;.}../*.
24160 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
24170 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
24180 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
24190 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
241a0 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
241b0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
241c0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
241d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
241e0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
241f0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
24200 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
24210 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
24220 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
24230 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
24240 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
24250 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
24260 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
24270 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
24280 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
24290 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
242a0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
242b0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
242c0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65  rwise:.**.** The
242d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
242e0 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f  the next overflo
242f0 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
24300 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a  nked list is .**
24310 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67   written to *pPg
24320 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20  noNext. If page 
24330 6f 76 66 6c 20 69 73 20 74 68 65 20 6c 61 73 74  ovfl is the last
24340 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69 6e   page in its lin
24350 6b 65 64 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70  ked .** list, *p
24360 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74 20  PgnoNext is set 
24370 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20  to zero. .**.** 
24380 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f 74  If ppPage is not
24390 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66   NULL, and a ref
243a0 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 4d 65  erence to the Me
243b0 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 63 6f 72  mPage object cor
243c0 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
243d0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 70 4f 76   page number pOv
243e0 66 6c 20 77 61 73 20 6f 62 74 61 69 6e 65 64 2c  fl was obtained,
243f0 20 74 68 65 6e 20 2a 70 70 50 61 67 65 20 69 73   then *ppPage is
24400 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
24410 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e   that.** referen
24420 63 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ce. It is the re
24430 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
24440 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 63 61  the caller to ca
24450 6c 6c 20 72 65 6c 65 61 73 65 50 61 67 65 28 29  ll releasePage()
24460 0a 2a 2a 20 6f 6e 20 2a 70 70 50 61 67 65 20 74  .** on *ppPage t
24470 6f 20 66 72 65 65 20 74 68 65 20 72 65 66 65 72  o free the refer
24480 65 6e 63 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65  ence. In no refe
24490 72 65 6e 63 65 20 77 61 73 20 6f 62 74 61 69 6e  rence was obtain
244a0 65 64 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74  ed (because.** t
244b0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77  he pointer-map w
244c0 61 73 20 75 73 65 64 20 74 6f 20 6f 62 74 61 69  as used to obtai
244d0 6e 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  n the value for 
244e0 2a 70 50 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65  *pPgnoNext), the
244f0 6e 0a 2a 2a 20 2a 70 70 50 61 67 65 20 69 73 20  n.** *ppPage is 
24500 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a  set to zero..*/.
24510 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
24520 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
24530 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
24540 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
24550 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
24560 2a 2f 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20  */.  Pgno ovfl, 
24570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24580 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 76 65    /* Current ove
24590 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62 65  rflow page numbe
245a0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
245b0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
245c0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
245d0 61 67 65 20 68 61 6e 64 6c 65 20 28 6d 61 79 20  age handle (may 
245e0 62 65 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 50 67  be NULL) */.  Pg
245f0 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20  no *pPgnoNext   
24600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24610 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77  T: Next overflow
24620 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
24630 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d  ){.  Pgno next =
24640 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
24650 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
24660 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24670 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
24680 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
24690 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
246a0 73 73 65 72 74 28 70 50 67 6e 6f 4e 65 78 74 29  ssert(pPgnoNext)
246b0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
246c0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
246d0 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  M.  /* Try to fi
246e0 6e 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  nd the next page
246f0 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
24700 20 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a   list using the.
24710 20 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20    ** autovacuum 
24720 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
24730 73 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68  s. Guess that th
24740 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a  e next page in .
24750 20 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f    ** the overflo
24760 77 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e  w list is page n
24770 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20  umber (ovfl+1). 
24780 49 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75  If that guess tu
24790 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f  rns .  ** out to
247a0 20 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20   be wrong, fall 
247b0 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20  back to loading 
247c0 74 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65  the data of page
247d0 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76   .  ** number ov
247e0 66 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  fl to determine 
247f0 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75  the next page nu
24800 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  mber..  */.  if(
24810 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
24820 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
24830 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65  o;.    Pgno iGue
24840 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20  ss = ovfl+1;.   
24850 20 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20   u8 eType;..    
24860 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53  while( PTRMAP_IS
24870 50 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73  PAGE(pBt, iGuess
24880 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e  ) || iGuess==PEN
24890 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
248a0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75  Bt) ){.      iGu
248b0 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20  ess++;.    }..  
248c0 20 20 69 66 28 20 69 47 75 65 73 73 3c 3d 62 74    if( iGuess<=bt
248d0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
248e0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
248f0 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69  ptrmapGet(pBt, i
24900 47 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26  Guess, &eType, &
24910 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
24920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
24930 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  & eType==PTRMAP_
24940 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
24950 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
24960 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
24970 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
24980 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
24990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
249a0 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
249b0 6e 65 78 74 3d 3d 30 20 7c 7c 20 72 63 3d 3d 53  next==0 || rc==S
249c0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
249d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
249e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 74  K ){.    rc = bt
249f0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
24a00 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20 28 70  ovfl, &pPage, (p
24a10 70 50 61 67 65 3d 3d 30 29 20 3f 20 50 41 47 45  pPage==0) ? PAGE
24a20 52 5f 47 45 54 5f 52 45 41 44 4f 4e 4c 59 20 3a  R_GET_READONLY :
24a30 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
24a40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc==SQLITE_OK |
24a50 7c 20 70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  | pPage==0 );.  
24a60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
24a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78  _OK ){.      nex
24a80 74 20 3d 20 67 65 74 34 62 79 74 65 28 70 50 61  t = get4byte(pPa
24a90 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20  ge->aData);.    
24aa0 7d 0a 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e  }.  }..  *pPgnoN
24ab0 65 78 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66  ext = next;.  if
24ac0 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
24ad0 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
24ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
24af0 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
24b00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
24b10 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
24b20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63  ? SQLITE_OK : rc
24b30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  );.}../*.** Copy
24b40 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66   data from a buf
24b50 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f  fer to a page, o
24b60 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f  r from a page to
24b70 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a   a buffer..**.**
24b80 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70   pPayload is a p
24b90 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73  ointer to data s
24ba0 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73  tored on databas
24bb0 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a  e page pDbPage..
24bc0 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65  ** If argument e
24bd0 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  Op is false, the
24be0 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  n nByte bytes of
24bf0 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64   data are copied
24c00 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61  .** from pPayloa
24c10 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
24c20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70 42  pointed at by pB
24c30 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72  uf. If eOp is tr
24c40 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69  ue,.** then sqli
24c50 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
24c60 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62  is called on pDb
24c70 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62  Page and nByte b
24c80 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20  ytes.** of data 
24c90 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20  are copied from 
24ca0 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 20  the buffer pBuf 
24cb0 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a  to pPayload..**.
24cc0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
24cd0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
24ce0 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61  ess, otherwise a
24cf0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  n error code..*/
24d00 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79  .static int copy
24d10 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20  Payload(.  void 
24d20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20  *pPayload,      
24d30 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
24d40 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  to page data */.
24d50 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20    void *pBuf,   
24d60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
24d70 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
24d80 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c   */.  int nByte,
24d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24da0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
24db0 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20  es to copy */.  
24dc0 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20  int eOp,        
24dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d            /* 0 -
24de0 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65  > copy from page
24df0 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70  , 1 -> copy to p
24e00 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20  age */.  DbPage 
24e10 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20 20  *pDbPage        
24e20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61     /* Page conta
24e30 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a  ining pPayload *
24e40 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29  /.){.  if( eOp )
24e50 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61  {.    /* Copy da
24e60 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74  ta from buffer t
24e70 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65 20  o page (a write 
24e80 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24e90 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
24ea0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
24eb0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
24ec0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
24ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24ee0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
24ef0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66  y(pPayload, pBuf
24f00 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73  , nByte);.  }els
24f10 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  e{.    /* Copy d
24f20 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f  ata from page to
24f30 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64 20   buffer (a read 
24f40 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20  operation) */.  
24f50 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70    memcpy(pBuf, p
24f60 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b  Payload, nByte);
24f70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
24f80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
24f90 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
24fa0 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  is used to read 
24fb0 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61 79  or overwrite pay
24fc0 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  load information
24fd0 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72  .** for the entr
24fe0 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72 20  y that the pCur 
24ff0 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69  cursor is pointi
25000 6e 67 20 74 6f 2e 20 54 68 65 20 65 4f 70 0a 2a  ng to. The eOp.*
25010 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e  * argument is in
25020 74 65 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c  terpreted as fol
25030 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 30 3a  lows:.**.**   0:
25040 20 54 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   The operation i
25050 73 20 61 20 72 65 61 64 2e 20 50 6f 70 75 6c 61  s a read. Popula
25060 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
25070 63 61 63 68 65 2e 0a 2a 2a 20 20 20 31 3a 20 54  cache..**   1: T
25080 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  he operation is 
25090 61 20 77 72 69 74 65 2e 20 50 6f 70 75 6c 61 74  a write. Populat
250a0 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63  e the overflow c
250b0 61 63 68 65 2e 0a 2a 2a 20 20 20 32 3a 20 54 68  ache..**   2: Th
250c0 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
250d0 20 72 65 61 64 2e 20 44 6f 20 6e 6f 74 20 70 6f   read. Do not po
250e0 70 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66  pulate the overf
250f0 6c 6f 77 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  low cache..**.**
25100 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
25110 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
25120 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
25130 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
25140 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
25150 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
25160 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
25170 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74  *.** The content
25180 20 62 65 69 6e 67 20 72 65 61 64 20 6f 72 20 77   being read or w
25190 72 69 74 74 65 6e 20 6d 69 67 68 74 20 61 70 70  ritten might app
251a0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
251b0 70 61 67 65 0a 2a 2a 20 6f 72 20 62 65 20 73 63  page.** or be sc
251c0 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d  attered out on m
251d0 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77  ultiple overflow
251e0 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
251f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72   the current cur
25200 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f  sor entry uses o
25210 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
25220 6c 6f 77 20 70 61 67 65 73 20 61 6e 64 20 74 68  low pages and th
25230 65 0a 2a 2a 20 65 4f 70 20 61 72 67 75 6d 65 6e  e.** eOp argumen
25240 74 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 69 73  t is not 2, this
25250 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 61 6c   function may al
25260 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
25270 20 61 6e 64 20 6c 61 7a 69 6c 79 20 0a 2a 2a 20   and lazily .** 
25280 70 6f 70 75 6c 61 74 65 73 20 74 68 65 20 6f 76  populates the ov
25290 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
252a0 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42 74   cache array (Bt
252b0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
252c0 29 2e 20 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ). .** Subsequen
252d0 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73  t calls use this
252e0 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
252f0 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
25300 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 0a 2a  pplied offset .*
25310 2a 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  * more efficient
25320 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20  ..**.** Once an 
25330 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
25340 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
25350 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
25360 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69  may be.** invali
25370 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74  dated if some ot
25380 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74 65  her cursor write
25390 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61  s to the same ta
253a0 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68  ble, or if.** th
253b0 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65  e cursor is move
253c0 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
253d0 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c   row. Additional
253e0 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  ly, in auto-vacu
253f0 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20  um.** mode, the 
25400 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73  following events
25410 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20   may invalidate 
25420 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
25430 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a  -list cache..**.
25440 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d  **   * An increm
25450 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a  ental vacuum,.**
25460 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e     * A commit in
25470 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75   auto_vacuum="fu
25480 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a  ll" mode,.**   *
25490 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c   Creating a tabl
254a0 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d  e (may require m
254b0 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f  oving an overflo
254c0 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74  w page)..*/.stat
254d0 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61 79  ic int accessPay
254e0 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72  load(.  BtCursor
254f0 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20   *pCur,      /* 
25500 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20  Cursor pointing 
25510 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64  to entry to read
25520 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f   from */.  u32 o
25530 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  ffset,          
25540 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67  /* Begin reading
25550 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70   this far into p
25560 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20  ayload */.  u32 
25570 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
25580 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61   /* Read this ma
25590 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e  ny bytes */.  un
255a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75  signed char *pBu
255b0 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  f, /* Write the 
255c0 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20  bytes into this 
255d0 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74  buffer */ .  int
255e0 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
255f0 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
25600 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
25610 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
25620 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
25630 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
25640 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
25650 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
25660 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
25670 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
25680 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74  r->iPage]; /* Bt
25690 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72 72  ree page of curr
256a0 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42  ent entry */.  B
256b0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
256c0 43 75 72 2d 3e 70 42 74 3b 20 20 20 20 20 20 20  Cur->pBt;       
256d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74             /* Bt
256e0 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72 20  ree this cursor 
256f0 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 23 69  belongs to */.#i
25700 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52 45  fdef SQLITE_DIRE
25710 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41 44  CT_OVERFLOW_READ
25720 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
25730 20 2a 20 63 6f 6e 73 74 20 70 42 75 66 53 74 61   * const pBufSta
25740 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 69 6e 74  rt = pBuf;.  int
25750 20 62 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20   bEnd;          
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25770 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25780 66 20 72 65 61 64 69 6e 67 20 74 6f 20 65 6e 64  f reading to end
25790 20 6f 66 20 64 61 74 61 20 2a 2f 0a 23 65 6e 64   of data */.#end
257a0 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  if..  assert( pP
257b0 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  age );.  assert(
257c0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
257d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
257e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61   assert( pCur->a
257f0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
25800 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ]<pPage->nCell )
25810 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
25820 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
25830 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
25840 65 4f 70 21 3d 32 20 7c 7c 20 6f 66 66 73 65 74  eOp!=2 || offset
25850 3d 3d 30 20 29 3b 20 20 20 20 2f 2a 20 41 6c 77  ==0 );    /* Alw
25860 61 79 73 20 73 74 61 72 74 20 66 72 6f 6d 20 62  ays start from b
25870 65 67 69 6e 6e 69 6e 67 20 66 6f 72 20 65 4f 70  eginning for eOp
25880 3d 3d 32 20 2a 2f 0a 0a 20 20 67 65 74 43 65 6c  ==2 */..  getCel
25890 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
258a0 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
258b0 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a 23  info.pPayload;.#
258c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
258d0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
258e0 44 0a 20 20 62 45 6e 64 20 3d 20 6f 66 66 73 65  D.  bEnd = offse
258f0 74 2b 61 6d 74 3d 3d 70 43 75 72 2d 3e 69 6e 66  t+amt==pCur->inf
25900 6f 2e 6e 50 61 79 6c 6f 61 64 3b 0a 23 65 6e 64  o.nPayload;.#end
25910 69 66 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66  if.  assert( off
25920 73 65 74 2b 61 6d 74 20 3c 3d 20 70 43 75 72 2d  set+amt <= pCur-
25930 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  >info.nPayload )
25940 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 50 61  ;..  assert( aPa
25950 79 6c 6f 61 64 20 3e 20 70 50 61 67 65 2d 3e 61  yload > pPage->a
25960 44 61 74 61 20 29 3b 0a 20 20 69 66 28 20 28 75  Data );.  if( (u
25970 70 74 72 29 28 61 50 61 79 6c 6f 61 64 20 2d 20  ptr)(aPayload - 
25980 70 50 61 67 65 2d 3e 61 44 61 74 61 29 20 3e 20  pPage->aData) > 
25990 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
259a0 20 2d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   - pCur->info.nL
259b0 6f 63 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20  ocal) ){.    /* 
259c0 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
259d0 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
259e0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
259f0 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 54   is an error.  T
25a00 68 65 0a 20 20 20 20 2a 2a 20 63 6f 6e 64 69 74  he.    ** condit
25a10 69 6f 6e 61 6c 20 61 62 6f 76 65 20 69 73 20 72  ional above is r
25a20 65 61 6c 6c 79 3a 0a 20 20 20 20 2a 2a 20 20 20  eally:.    **   
25a30 20 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d   &aPayload[pCur-
25a40 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 20 3e 20  >info.nLocal] > 
25a50 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 42  &pPage->aData[pB
25a60 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 5d 0a 20  t->usableSize]. 
25a70 20 20 20 2a 2a 20 62 75 74 20 69 73 20 72 65 63     ** but is rec
25a80 61 73 74 20 69 6e 74 6f 20 69 74 73 20 63 75 72  ast into its cur
25a90 72 65 6e 74 20 66 6f 72 6d 20 74 6f 20 61 76 6f  rent form to avo
25aa0 69 64 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  id integer overf
25ab0 6c 6f 77 20 70 72 6f 62 6c 65 6d 73 0a 20 20 20  low problems.   
25ac0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
25ad0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
25ae0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  PT;.  }..  /* Ch
25af0 65 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74  eck if data must
25b00 20 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e   be read/written
25b10 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72   to/from the btr
25b20 65 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20  ee page itself. 
25b30 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
25b40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
25b50 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d  l ){.    int a =
25b60 20 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b   amt;.    if( a+
25b70 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66  offset>pCur->inf
25b80 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
25b90 20 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f    a = pCur->info
25ba0 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74  .nLocal - offset
25bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
25bc0 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
25bd0 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20  ayload[offset], 
25be0 70 42 75 66 2c 20 61 2c 20 28 65 4f 70 20 26 20  pBuf, a, (eOp & 
25bf0 30 78 30 31 29 2c 20 70 50 61 67 65 2d 3e 70 44  0x01), pPage->pD
25c00 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73  bPage);.    offs
25c10 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66  et = 0;.    pBuf
25c20 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d   += a;.    amt -
25c30 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = a;.  }else{.  
25c40 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72    offset -= pCur
25c50 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20  ->info.nLocal;. 
25c60 20 7d 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   }...  if( rc==S
25c70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
25c80 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  0 ){.    const u
25c90 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  32 ovflSize = pB
25ca0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
25cb0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
25cc0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
25cd0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
25ce0 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
25cf0 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
25d00 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
25d10 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
25d20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
25d30 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
25d40 6f 77 5b 5d 20 68 61 73 20 6e 6f 74 20 62 65 65  ow[] has not bee
25d50 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c  n allocated, all
25d60 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 0a 20 20  ocate it now..  
25d70 20 20 2a 2a 20 45 78 63 65 70 74 2c 20 64 6f 20    ** Except, do 
25d80 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 4f 76  not allocate aOv
25d90 65 72 66 6c 6f 77 5b 5d 20 66 6f 72 20 65 4f 70  erflow[] for eOp
25da0 3d 3d 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ==2..    **.    
25db0 2a 2a 20 54 68 65 20 61 4f 76 65 72 66 6c 6f 77  ** The aOverflow
25dc0 5b 5d 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  [] array is size
25dd0 64 20 61 74 20 6f 6e 65 20 65 6e 74 72 79 20 66  d at one entry f
25de0 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
25df0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 69 6e 20   page.    ** in 
25e00 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
25e10 69 6e 2e 20 54 68 65 20 70 61 67 65 20 6e 75 6d  in. The page num
25e20 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
25e30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
25e40 73 0a 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20  s.    ** stored 
25e50 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
25e60 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
25e70 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
25e80 6c 6f 77 5b 5d 20 61 72 72 61 79 0a 20 20 20 20  low[] array.    
25e90 2a 2a 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ** means "not ye
25ea0 74 20 6b 6e 6f 77 6e 22 20 28 74 68 65 20 63 61  t known" (the ca
25eb0 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
25ec0 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
25ed0 0a 20 20 20 20 69 66 28 20 65 4f 70 21 3d 32 20  .    if( eOp!=2 
25ee0 26 26 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61  && (pCur->curFla
25ef0 67 73 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f  gs & BTCF_ValidO
25f00 76 66 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  vfl)==0 ){.     
25f10 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
25f20 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
25f30 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
25f40 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
25f50 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
25f60 69 66 28 20 6e 4f 76 66 6c 3e 70 43 75 72 2d 3e  if( nOvfl>pCur->
25f70 6e 4f 76 66 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20  nOvflAlloc ){.  
25f80 20 20 20 20 20 20 50 67 6e 6f 20 2a 61 4e 65 77        Pgno *aNew
25f90 20 3d 20 28 50 67 6e 6f 2a 29 73 71 6c 69 74 65   = (Pgno*)sqlite
25fa0 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  3Realloc(.      
25fb0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65        pCur->aOve
25fc0 72 66 6c 6f 77 2c 20 6e 4f 76 66 6c 2a 32 2a 73  rflow, nOvfl*2*s
25fd0 69 7a 65 6f 66 28 50 67 6e 6f 29 0a 20 20 20 20  izeof(Pgno).    
25fe0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
25ff0 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( aNew==0 ){.  
26000 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
26010 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
26020 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
26030 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 6e           pCur->n
26040 4f 76 66 6c 41 6c 6c 6f 63 20 3d 20 6e 4f 76 66  OvflAlloc = nOvf
26050 6c 2a 32 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l*2;.          p
26060 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
26070 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d   aNew;.        }
26080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
260a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73   ){.        mems
260b0 65 74 28 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  et(pCur->aOverfl
260c0 6f 77 2c 20 30 2c 20 6e 4f 76 66 6c 2a 73 69 7a  ow, 0, nOvfl*siz
260d0 65 6f 66 28 50 67 6e 6f 29 29 3b 0a 20 20 20 20  eof(Pgno));.    
260e0 20 20 20 20 70 43 75 72 2d 3e 63 75 72 46 6c 61      pCur->curFla
260f0 67 73 20 7c 3d 20 42 54 43 46 5f 56 61 6c 69 64  gs |= BTCF_Valid
26100 4f 76 66 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Ovfl;.      }.  
26110 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
26120 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
26130 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
26140 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
26150 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
26160 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
26170 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
26180 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
26190 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
261a0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
261b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
261c0 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
261d0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 21  BTCF_ValidOvfl)!
261e0 3d 30 0a 20 20 20 20 20 26 26 20 70 43 75 72 2d  =0.     && pCur-
261f0 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65  >aOverflow[offse
26200 74 2f 6f 76 66 6c 53 69 7a 65 5d 0a 20 20 20 20  t/ovflSize].    
26210 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  ){.      iIdx = 
26220 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  (offset/ovflSize
26230 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67  );.      nextPag
26240 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
26250 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20  low[iIdx];.     
26260 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65   offset = (offse
26270 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t%ovflSize);.   
26280 20 7d 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20 72   }..    for( ; r
26290 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
262a0 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61 67  amt>0 && nextPag
262b0 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 20 20 20  e; iIdx++){..   
262c0 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65     /* If require
262d0 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  d, populate the 
262e0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
262f0 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  st cache. */.   
26300 20 20 20 69 66 28 20 28 70 43 75 72 2d 3e 63 75     if( (pCur->cu
26310 72 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61  rFlags & BTCF_Va
26320 6c 69 64 4f 76 66 6c 29 21 3d 30 20 29 7b 0a 20  lidOvfl)!=0 ){. 
26330 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
26340 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
26350 49 64 78 5d 3d 3d 30 0a 20 20 20 20 20 20 20 20  Idx]==0.        
26360 20 20 20 20 20 20 20 20 7c 7c 20 70 43 75 72 2d          || pCur-
26370 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
26380 3d 3d 6e 65 78 74 50 61 67 65 0a 20 20 20 20 20  ==nextPage.     
26390 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f             || CO
263a0 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20  RRUPT_DB );.    
263b0 20 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66      pCur->aOverf
263c0 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74  low[iIdx] = next
263d0 50 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Page;.      }.. 
263e0 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e       if( offset>
263f0 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20  =ovflSize ){.   
26400 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79       /* The only
26410 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20   reason to read 
26420 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20  this page is to 
26430 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a  obtain the page.
26440 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
26450 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70  r for the next p
26460 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
26470 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70  low chain. The p
26480 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  age.        ** d
26490 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69  ata is not requi
264a0 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72  red. So first tr
264b0 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20  y to lookup the 
264c0 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20  overflow.       
264d0 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61   ** page-list ca
264e0 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65  che, if any, the
264f0 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  n fall back to t
26500 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  he getOverflowPa
26510 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20  ge().        ** 
26520 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  function..      
26530 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
26540 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 61 4f  Note that the aO
26550 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
26560 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
26570 64 20 62 65 63 61 75 73 65 20 65 4f 70 21 3d 32  d because eOp!=2
26580 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 65 72 65  .        ** here
26590 2e 20 20 49 66 20 65 4f 70 3d 3d 32 2c 20 74 68  .  If eOp==2, th
265a0 65 6e 20 6f 66 66 73 65 74 3d 3d 30 20 61 6e 64  en offset==0 and
265b0 20 74 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   this branch is 
265c0 6e 65 76 65 72 20 74 61 6b 65 6e 2e 0a 20 20 20  never taken..   
265d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
265e0 61 73 73 65 72 74 28 20 65 4f 70 21 3d 32 20 29  assert( eOp!=2 )
265f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
26600 28 20 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73  ( pCur->curFlags
26610 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4f 76 66   & BTCF_ValidOvf
26620 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  l );.        ass
26630 65 72 74 28 20 70 43 75 72 2d 3e 70 42 74 72 65  ert( pCur->pBtre
26640 65 2d 3e 64 62 3d 3d 70 42 74 2d 3e 64 62 20 29  e->db==pBt->db )
26650 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
26660 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
26670 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  dx+1] ){.       
26680 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
26690 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
266a0 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d  dx+1];.        }
266b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
266c0 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
266d0 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61  Page(pBt, nextPa
266e0 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65  ge, 0, &nextPage
266f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
26700 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
26710 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
26720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
26730 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
26740 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
26750 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
26760 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
26770 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
26780 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
26790 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
267a0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
267b0 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  0)..        */.#
267c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 52  ifdef SQLITE_DIR
267d0 45 43 54 5f 4f 56 45 52 46 4c 4f 57 5f 52 45 41  ECT_OVERFLOW_REA
267e0 44 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  D.        sqlite
267f0 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 23 65 6e 64  3_file *fd;.#end
26800 69 66 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  if.        int a
26810 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
26820 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e  if( a + offset >
26830 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20   ovflSize ){.   
26840 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
26850 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
26860 20 20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20        }..#ifdef 
26870 53 51 4c 49 54 45 5f 44 49 52 45 43 54 5f 4f 56  SQLITE_DIRECT_OV
26880 45 52 46 4c 4f 57 5f 52 45 41 44 0a 20 20 20 20  ERFLOW_READ.    
26890 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 20 74 68      /* If all th
268a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
268b0 74 72 75 65 3a 0a 20 20 20 20 20 20 20 20 2a 2a  true:.        **
268c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 31 29  .        **   1)
268d0 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
268e0 6f 70 65 72 61 74 69 6f 6e 2c 20 61 6e 64 20 0a  operation, and .
268f0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 32 29 20          **   2) 
26900 64 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64  data is required
26910 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
26920 6f 66 20 74 68 69 73 20 6f 76 65 72 66 6c 6f 77  of this overflow
26930 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 20 20 20   page, and.     
26940 20 20 20 2a 2a 20 20 20 33 29 20 74 68 65 20 64     **   3) the d
26950 61 74 61 62 61 73 65 20 69 73 20 66 69 6c 65 2d  atabase is file-
26960 62 61 63 6b 65 64 2c 20 61 6e 64 0a 20 20 20 20  backed, and.    
26970 20 20 20 20 2a 2a 20 20 20 34 29 20 74 68 65 72      **   4) ther
26980 65 20 69 73 20 6e 6f 20 6f 70 65 6e 20 77 72 69  e is no open wri
26990 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
269a0 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  and.        **  
269b0 20 35 29 20 74 68 65 20 64 61 74 61 62 61 73 65   5) the database
269c0 20 69 73 20 6e 6f 74 20 61 20 57 41 4c 20 64 61   is not a WAL da
269d0 74 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20  tabase,.        
269e0 2a 2a 20 20 20 36 29 20 61 6c 6c 20 64 61 74 61  **   6) all data
269f0 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69   from the page i
26a00 73 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 20 20  s being read..  
26a10 20 20 20 20 20 20 2a 2a 20 20 20 37 29 20 61 74        **   7) at
26a20 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 20 68   least 4 bytes h
26a30 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
26a40 20 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6f   read into the o
26a50 75 74 70 75 74 20 62 75 66 66 65 72 20 0a 20 20  utput buffer .  
26a60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
26a70 20 2a 2a 20 74 68 65 6e 20 64 61 74 61 20 63 61   ** then data ca
26a80 6e 20 62 65 20 72 65 61 64 20 64 69 72 65 63 74  n be read direct
26a90 6c 79 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ly from the data
26aa0 62 61 73 65 20 66 69 6c 65 20 69 6e 74 6f 20 74  base file into t
26ab0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
26ac0 74 70 75 74 20 62 75 66 66 65 72 2c 20 62 79 70  tput buffer, byp
26ad0 61 73 73 69 6e 67 20 74 68 65 20 70 61 67 65 2d  assing the page-
26ae0 63 61 63 68 65 20 61 6c 74 6f 67 65 74 68 65 72  cache altogether
26af0 2e 20 54 68 69 73 20 73 70 65 65 64 73 0a 20 20  . This speeds.  
26b00 20 20 20 20 20 20 2a 2a 20 75 70 20 6c 6f 61 64        ** up load
26b10 69 6e 67 20 6c 61 72 67 65 20 72 65 63 6f 72 64  ing large record
26b20 73 20 74 68 61 74 20 73 70 61 6e 20 6d 61 6e 79  s that span many
26b30 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
26b40 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
26b50 20 20 20 20 69 66 28 20 28 65 4f 70 26 30 78 30      if( (eOp&0x0
26b60 31 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  1)==0           
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
26b90 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 26 26  ) */.         &&
26ba0 20 6f 66 66 73 65 74 3d 3d 30 20 20 20 20 20 20   offset==0      
26bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bd0 20 20 20 20 2f 2a 20 28 32 29 20 2a 2f 0a 20 20      /* (2) */.  
26be0 20 20 20 20 20 20 20 26 26 20 28 62 45 6e 64 20         && (bEnd 
26bf0 7c 7c 20 61 3d 3d 6f 76 66 6c 53 69 7a 65 29 20  || a==ovflSize) 
26c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26c20 28 36 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  (6) */.         
26c30 26 26 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  && pBt->inTransa
26c40 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 52 45 41  ction==TRANS_REA
26c50 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
26c60 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
26c70 20 20 20 20 20 20 20 20 20 26 26 20 28 66 64 20           && (fd 
26c80 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  = sqlite3PagerFi
26c90 6c 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29  le(pBt->pPager))
26ca0 2d 3e 70 4d 65 74 68 6f 64 73 20 20 20 20 20 2f  ->pMethods     /
26cb0 2a 20 28 33 29 20 2a 2f 0a 20 20 20 20 20 20 20  * (3) */.       
26cc0 20 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 50    && 0==sqlite3P
26cd0 61 67 65 72 55 73 65 57 61 6c 28 70 42 74 2d 3e  agerUseWal(pBt->
26ce0 70 50 61 67 65 72 29 20 20 20 20 20 20 20 20 20  pPager)         
26cf0 20 20 20 20 20 20 20 20 2f 2a 20 28 35 29 20 2a          /* (5) *
26d00 2f 0a 20 20 20 20 20 20 20 20 20 26 26 20 26 70  /.         && &p
26d10 42 75 66 5b 2d 34 5d 3e 3d 70 42 75 66 53 74 61  Buf[-4]>=pBufSta
26d20 72 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rt              
26d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d40 20 2f 2a 20 28 37 29 20 2a 2f 0a 20 20 20 20 20   /* (7) */.     
26d50 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
26d60 75 38 20 61 53 61 76 65 5b 34 5d 3b 0a 20 20 20  u8 aSave[4];.   
26d70 20 20 20 20 20 20 20 75 38 20 2a 61 57 72 69 74         u8 *aWrit
26d80 65 20 3d 20 26 70 42 75 66 5b 2d 34 5d 3b 0a 20  e = &pBuf[-4];. 
26d90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
26da0 20 61 57 72 69 74 65 3e 3d 70 42 75 66 53 74 61   aWrite>=pBufSta
26db0 72 74 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt );           
26dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26dd0 20 68 65 6e 63 65 20 28 37 29 20 2a 2f 0a 20 20   hence (7) */.  
26de0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61          memcpy(a
26df0 53 61 76 65 2c 20 61 57 72 69 74 65 2c 20 34 29  Save, aWrite, 4)
26e00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
26e10 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
26e20 64 2c 20 61 57 72 69 74 65 2c 20 61 2b 34 2c 20  d, aWrite, a+4, 
26e30 28 69 36 34 29 70 42 74 2d 3e 70 61 67 65 53 69  (i64)pBt->pageSi
26e40 7a 65 2a 28 6e 65 78 74 50 61 67 65 2d 31 29 29  ze*(nextPage-1))
26e50 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  ;.          next
26e60 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26e70 61 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20  aWrite);.       
26e80 20 20 20 6d 65 6d 63 70 79 28 61 57 72 69 74 65     memcpy(aWrite
26e90 2c 20 61 53 61 76 65 2c 20 34 29 3b 0a 20 20 20  , aSave, 4);.   
26ea0 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
26eb0 66 0a 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  f..        {.   
26ec0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
26ed0 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
26ee0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
26ef0 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
26f00 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70  er, nextPage, &p
26f10 44 62 50 61 67 65 2c 0a 20 20 20 20 20 20 20 20  DbPage,.        
26f20 20 20 20 20 20 20 28 28 65 4f 70 26 30 78 30 31        ((eOp&0x01
26f30 29 3d 3d 30 20 3f 20 50 41 47 45 52 5f 47 45 54  )==0 ? PAGER_GET
26f40 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 30 29 0a 20  _READONLY : 0). 
26f50 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
26f60 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
26f80 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
26f90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
26fa0 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 78 74              next
26fc0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
26fd0 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20  aPayload);.     
26fe0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
26ff0 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
27000 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
27010 66 2c 20 61 2c 20 28 65 4f 70 26 30 78 30 31 29  f, a, (eOp&0x01)
27020 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  , pDbPage);.    
27030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
27040 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
27050 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
27060 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
27070 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27080 7d 0a 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d  }.        amt -=
27090 20 61 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66   a;.        pBuf
270a0 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 7d 0a 20   += a;.      }. 
270b0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
270c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
270d0 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65   amt>0 ){.    re
270e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
270f0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
27100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27110 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66  .** Read part of
27120 20 74 68 65 20 70 61 79 6c 6f 61 64 20 66 6f 72   the payload for
27130 20 74 68 65 20 72 6f 77 20 61 74 20 77 68 69 63   the row at whic
27140 68 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43  h that cursor pC
27150 75 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  ur is currently.
27160 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20 22 61  ** pointing.  "a
27170 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
27180 65 20 74 72 61 6e 73 66 65 72 72 65 64 20 69 6e  e transferred in
27190 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
271a0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
271b0 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
271c0 2a 2a 0a 2a 2a 20 70 43 75 72 20 63 61 6e 20 62  **.** pCur can b
271d0 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 69  e pointing to ei
271e0 74 68 65 72 20 61 20 74 61 62 6c 65 20 6f 72 20  ther a table or 
271f0 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 2e  an index b-tree.
27200 0a 2a 2a 20 49 66 20 70 6f 69 6e 74 69 6e 67 20  .** If pointing 
27210 74 6f 20 61 20 74 61 62 6c 65 20 62 74 72 65 65  to a table btree
27220 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
27230 6e 74 20 73 65 63 74 69 6f 6e 20 69 73 20 72 65  nt section is re
27240 61 64 2e 20 20 49 66 0a 2a 2a 20 70 43 75 72 20  ad.  If.** pCur 
27250 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
27260 6e 20 69 6e 64 65 78 20 62 2d 74 72 65 65 20 74  n index b-tree t
27270 68 65 6e 20 74 68 65 20 6b 65 79 20 73 65 63 74  hen the key sect
27280 69 6f 6e 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a  ion is read..**.
27290 2a 2a 20 46 6f 72 20 73 71 6c 69 74 65 33 42 74  ** For sqlite3Bt
272a0 72 65 65 50 61 79 6c 6f 61 64 28 29 2c 20 74 68  reePayload(), th
272b0 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 6e  e caller must en
272c0 73 75 72 65 20 74 68 61 74 20 70 43 75 72 20 69  sure that pCur i
272d0 73 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  s pointing.** to
272e0 20 61 20 76 61 6c 69 64 20 72 6f 77 20 69 6e 20   a valid row in 
272f0 74 68 65 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  the table.  For 
27300 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c  sqlite3BtreePayl
27310 6f 61 64 43 68 65 63 6b 65 64 28 29 2c 20 74 68  oadChecked(), th
27320 65 0a 2a 2a 20 63 75 72 73 6f 72 20 6d 69 67 68  e.** cursor migh
27330 74 20 62 65 20 69 6e 76 61 6c 69 64 20 6f 72 20  t be invalid or 
27340 6d 69 67 68 74 20 6e 65 65 64 20 74 6f 20 62 65  might need to be
27350 20 72 65 73 74 6f 72 65 64 20 62 65 66 6f 72 65   restored before
27360 20 62 65 69 6e 67 20 72 65 61 64 2e 0a 2a 2a 0a   being read..**.
27370 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
27380 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
27390 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
273a0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
273b0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
273c0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
273d0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
273e0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
273f0 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
27400 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
27410 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
27420 6c 6f 61 64 28 42 74 43 75 72 73 6f 72 20 2a 70  load(BtCursor *p
27430 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
27440 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
27450 70 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28  pBuf){.  assert(
27460 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
27470 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
27480 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
27490 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
274a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
274b0 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70  r->iPage>=0 && p
274c0 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
274d0 2d 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73  ->iPage] );.  as
274e0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64  sert( pCur->aiId
274f0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70  x[pCur->iPage]<p
27500 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
27510 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20  ->iPage]->nCell 
27520 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  );.  return acce
27530 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
27540 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
27550 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75  signed char*)pBu
27560 66 2c 20 30 29 3b 0a 7d 0a 23 69 66 6e 64 65 66  f, 0);.}.#ifndef
27570 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
27580 52 42 4c 4f 42 0a 69 6e 74 20 73 71 6c 69 74 65  RBLOB.int sqlite
27590 33 42 74 72 65 65 50 61 79 6c 6f 61 64 43 68 65  3BtreePayloadChe
275a0 63 6b 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  cked(BtCursor *p
275b0 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
275c0 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
275d0 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
275e0 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
275f0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
27600 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
27610 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
27620 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
27630 75 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65  ursorOwnsBtShare
27640 64 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  d(pCur) );.  rc 
27650 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
27660 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
27670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27680 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
27690 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
276a0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
276b0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
276c0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
276d0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
276e0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
276f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
27700 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
27710 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27720 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
27730 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
27740 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
27750 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
27760 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
27770 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
27780 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
27790 5f 49 4e 43 52 42 4c 4f 42 20 2a 2f 0a 0a 2f 2a  _INCRBLOB */../*
277a0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
277b0 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
277c0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
277d0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
277e0 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
277f0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
27800 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
27810 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
27820 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
27830 65 79 20 69 66 20 69 6e 64 65 78 20 62 74 72 65  ey if index btre
27840 65 73 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  es (pPage->intKe
27850 79 3d 3d 30 29 20 61 6e 64 20 69 73 20 74 68 65  y==0) and is the
27860 20 64 61 74 61 20 66 6f 72 0a 2a 2a 20 74 61 62   data for.** tab
27870 6c 65 20 62 74 72 65 65 73 20 28 70 50 61 67 65  le btrees (pPage
27880 2d 3e 69 6e 74 4b 65 79 3d 3d 31 29 2e 20 54 68  ->intKey==1). Th
27890 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
278a0 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 0a 2a  s of available.*
278b0 2a 20 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72  * key/data is wr
278c0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 41 6d 74  itten into *pAmt
278d0 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20  .  If *pAmt==0, 
278e0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 0a 2a  then the value.*
278f0 2a 20 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20  * returned will 
27900 6e 6f 74 20 62 65 20 61 20 76 61 6c 69 64 20 70  not be a valid p
27910 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  ointer..**.** Th
27920 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
27930 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20   optimization.  
27940 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72  It is common for
27950 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a   the entire key.
27960 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66  ** and data to f
27970 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  it on the local 
27980 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65  page and for the
27990 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72  re to be no over
279a0 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20  flow.** pages.  
279b0 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c  When that is so,
279c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   this routine ca
279d0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63 63  n be used to acc
279e0 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61  ess the.** key a
279f0 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74 20  nd data without 
27a00 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20  making a copy.  
27a10 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f  If the key and/o
27a20 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a  r data spills.**
27a30 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70   onto overflow p
27a40 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73  ages, then acces
27a50 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20  sPayload() must 
27a60 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73 73  be used to reass
27a70 65 6d 62 6c 65 0a 2a 2a 20 74 68 65 20 6b 65 79  emble.** the key
27a80 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69  /data and copy i
27a90 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f  t into a preallo
27aa0 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a  cated buffer..**
27ab0 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
27ac0 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
27ad0 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64   routine looks d
27ae0 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65  irectly into the
27af0 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20   cached.** page 
27b00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
27b10 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68 74    The data might
27b20 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20   change or move 
27b30 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a  the next time.**
27b40 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69   any btree routi
27b50 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  ne is called..*/
27b60 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 76 6f  .static const vo
27b70 69 64 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  id *fetchPayload
27b80 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
27b90 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
27ba0 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
27bb0 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
27bc0 6d 20 2a 2f 0a 20 20 75 33 32 20 2a 70 41 6d 74  m */.  u32 *pAmt
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
27be0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
27bf0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
27c00 65 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  es here */.){.  
27c10 75 33 32 20 61 6d 74 3b 0a 20 20 61 73 73 65 72  u32 amt;.  asser
27c20 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70 43  t( pCur!=0 && pC
27c30 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20  ur->iPage>=0 && 
27c40 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
27c50 72 2d 3e 69 50 61 67 65 5d 29 3b 0a 20 20 61 73  r->iPage]);.  as
27c60 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
27c70 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
27c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
27c90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
27ca0 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
27cb0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
27cc0 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e  ssert( cursorOwn
27cd0 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20  sBtShared(pCur) 
27ce0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
27cf0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
27d00 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
27d10 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
27d20 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
27d30 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
27d40 53 69 7a 65 3e 30 20 29 3b 0a 20 20 61 73 73 65  Size>0 );.  asse
27d50 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
27d60 50 61 79 6c 6f 61 64 3e 70 43 75 72 2d 3e 61 70  Payload>pCur->ap
27d70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27d80 5d 2d 3e 61 44 61 74 61 20 7c 7c 20 43 4f 52 52  ]->aData || CORR
27d90 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
27da0 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  rt( pCur->info.p
27db0 50 61 79 6c 6f 61 64 3c 70 43 75 72 2d 3e 61 70  Payload<pCur->ap
27dc0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
27dd0 5d 2d 3e 61 44 61 74 61 45 6e 64 20 7c 7c 43 4f  ]->aDataEnd ||CO
27de0 52 52 55 50 54 5f 44 42 29 3b 0a 20 20 61 6d 74  RRUPT_DB);.  amt
27df0 20 3d 20 28 69 6e 74 29 28 70 43 75 72 2d 3e 61   = (int)(pCur->a
27e00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
27e10 65 5d 2d 3e 61 44 61 74 61 45 6e 64 20 2d 20 70  e]->aDataEnd - p
27e20 43 75 72 2d 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f  Cur->info.pPaylo
27e30 61 64 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ad);.  if( pCur-
27e40 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3c 61 6d 74  >info.nLocal<amt
27e50 20 29 20 61 6d 74 20 3d 20 70 43 75 72 2d 3e 69   ) amt = pCur->i
27e60 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 2a 70  nfo.nLocal;.  *p
27e70 41 6d 74 20 3d 20 61 6d 74 3b 0a 20 20 72 65 74  Amt = amt;.  ret
27e80 75 72 6e 20 28 76 6f 69 64 2a 29 70 43 75 72 2d  urn (void*)pCur-
27e90 3e 69 6e 66 6f 2e 70 50 61 79 6c 6f 61 64 3b 0a  >info.pPayload;.
27ea0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
27eb0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
27ec0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
27ed0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
27ee0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
27ef0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
27f00 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
27f10 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
27f20 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
27f30 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
27f40 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
27f50 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
27f60 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
27f70 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
27f80 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
27f90 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
27fa0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
27fb0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
27fc0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
27fd0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
27fe0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
27ff0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
28000 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
28010 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
28020 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
28030 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
28040 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
28050 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
28060 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
28070 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
28080 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
28090 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
280a0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
280b0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
280c0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
280d0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
280e0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
280f0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50  d *sqlite3BtreeP
28100 61 79 6c 6f 61 64 46 65 74 63 68 28 42 74 43 75  ayloadFetch(BtCu
28110 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20  rsor *pCur, u32 
28120 2a 70 41 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e  *pAmt){.  return
28130 20 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43   fetchPayload(pC
28140 75 72 2c 20 70 41 6d 74 29 3b 0a 7d 0a 0a 0a 2f  ur, pAmt);.}.../
28150 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
28160 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20 6e  rsor down to a n
28170 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  ew child page.  
28180 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67 75  The newPgno argu
28190 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20 70  ment is the.** p
281a0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
281b0 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f 20  e child page to 
281c0 6d 6f 76 65 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 54  move to..**.** T
281d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
281e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  urns SQLITE_CORR
281f0 55 50 54 20 69 66 20 74 68 65 20 70 61 67 65 2d  UPT if the page-
28200 68 65 61 64 65 72 20 66 6c 61 67 73 20 66 69 65  header flags fie
28210 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  ld of.** the new
28220 20 63 68 69 6c 64 20 70 61 67 65 20 64 6f 65 73   child page does
28230 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 66   not match the f
28240 6c 61 67 73 20 66 69 65 6c 64 20 6f 66 20 74 68  lags field of th
28250 65 20 70 61 72 65 6e 74 20 28 69 2e 65 2e 0a 2a  e parent (i.e..*
28260 2a 20 69 66 20 61 6e 20 69 6e 74 6b 65 79 20 70  * if an intkey p
28270 61 67 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  age appears to b
28280 65 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20  e the parent of 
28290 61 20 6e 6f 6e 2d 69 6e 74 6b 65 79 20 70 61 67  a non-intkey pag
282a0 65 2c 20 6f 72 0a 2a 2a 20 76 69 63 65 2d 76 65  e, or.** vice-ve
282b0 72 73 61 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rsa)..*/.static 
282c0 69 6e 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  int moveToChild(
282d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
282e0 75 33 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20  u32 newPgno){.  
282f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
28300 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73  pCur->pBt;..  as
28310 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28320 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
28330 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
28340 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
28350 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
28360 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3c  rt( pCur->iPage<
28370 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44 45 50  BTCURSOR_MAX_DEP
28380 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
28390 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20 29  pCur->iPage>=0 )
283a0 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50  ;.  if( pCur->iP
283b0 61 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d  age>=(BTCURSOR_M
283c0 41 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20  AX_DEPTH-1) ){. 
283d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
283e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
283f0 20 7d 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   }.  pCur->info.
28400 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28410 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28420 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
28430 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28440 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b  .  pCur->iPage++
28450 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  ;.  pCur->aiIdx[
28460 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 30  pCur->iPage] = 0
28470 3b 0a 20 20 72 65 74 75 72 6e 20 67 65 74 41 6e  ;.  return getAn
28480 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e  dInitPage(pBt, n
28490 65 77 50 67 6e 6f 2c 20 26 70 43 75 72 2d 3e 61  ewPgno, &pCur->a
284a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
284b0 65 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e],.            
284c0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 75 72              pCur
284d0 2c 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72  , pCur->curPager
284e0 46 6c 61 67 73 29 3b 0a 7d 0a 0a 23 69 66 20 53  Flags);.}..#if S
284f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
28500 2a 20 50 61 67 65 20 70 50 61 72 65 6e 74 20 69  * Page pParent i
28510 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 28 6e  s an internal (n
28520 6f 6e 2d 6c 65 61 66 29 20 74 72 65 65 20 70 61  on-leaf) tree pa
28530 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
28540 6e 20 0a 2a 2a 20 61 73 73 65 72 74 73 20 74 68  n .** asserts th
28550 61 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  at page number i
28560 43 68 69 6c 64 20 69 73 20 74 68 65 20 6c 65 66  Child is the lef
28570 74 2d 63 68 69 6c 64 20 69 66 20 74 68 65 20 69  t-child if the i
28580 49 64 78 27 74 68 0a 2a 2a 20 63 65 6c 6c 20 69  Idx'th.** cell i
28590 6e 20 70 61 67 65 20 70 50 61 72 65 6e 74 2e 20  n page pParent. 
285a0 4f 72 2c 20 69 66 20 69 49 64 78 20 69 73 20 65  Or, if iIdx is e
285b0 71 75 61 6c 20 74 6f 20 74 68 65 20 74 6f 74 61  qual to the tota
285c0 6c 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  l number of.** c
285d0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 2c  ells in pParent,
285e0 20 74 68 61 74 20 70 61 67 65 20 6e 75 6d 62 65   that page numbe
285f0 72 20 69 43 68 69 6c 64 20 69 73 20 74 68 65 20  r iChild is the 
28600 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 0a 2a  right-child of.*
28610 2a 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73  * the page..*/.s
28620 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 72  tatic void asser
28630 74 50 61 72 65 6e 74 49 6e 64 65 78 28 4d 65 6d  tParentIndex(Mem
28640 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 69  Page *pParent, i
28650 6e 74 20 69 49 64 78 2c 20 50 67 6e 6f 20 69 43  nt iIdx, Pgno iC
28660 68 69 6c 64 29 7b 0a 20 20 69 66 28 20 43 4f 52  hild){.  if( COR
28670 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
28680 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6e 64 69 74  ;  /* The condit
28690 69 6f 6e 73 20 74 65 73 74 65 64 20 62 65 6c 6f  ions tested belo
286a0 77 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 74  w might not be t
286b0 72 75 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  rue.            
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70 74 20  ** in a corrupt 
286e0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 61 73  database */.  as
286f0 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50 61 72  sert( iIdx<=pPar
28700 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  ent->nCell );.  
28710 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72 65 6e  if( iIdx==pParen
28720 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
28730 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
28740 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
28750 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
28760 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c 64 20  set+8])==iChild 
28770 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
28780 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
28790 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
287a0 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68 69 6c  t, iIdx))==iChil
287b0 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65  d );.  }.}.#else
287c0 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
287d0 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78 2c 79  tParentIndex(x,y
287e0 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ,z) .#endif../*.
287f0 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
28800 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
28810 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
28820 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
28830 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
28840 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
28850 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
28860 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
28870 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
28880 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
28890 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
288a0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
288b0 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
288c0 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
288d0 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
288e0 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
288f0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
28900 76 6f 69 64 20 6d 6f 76 65 54 6f 50 61 72 65 6e  void moveToParen
28910 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28920 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
28930 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
28940 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
28950 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  t( pCur->eState=
28960 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b  =CURSOR_VALID );
28970 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
28980 3e 69 50 61 67 65 3e 30 20 29 3b 0a 20 20 61 73  >iPage>0 );.  as
28990 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
289a0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
289b0 29 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e  );.  assertParen
289c0 74 49 6e 64 65 78 28 0a 20 20 20 20 70 43 75 72  tIndex(.    pCur
289d0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
289e0 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70 43  Page-1], .    pC
289f0 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
28a00 69 50 61 67 65 2d 31 5d 2c 20 0a 20 20 20 20 70  iPage-1], .    p
28a10 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
28a20 2d 3e 69 50 61 67 65 5d 2d 3e 70 67 6e 6f 0a 20  ->iPage]->pgno. 
28a30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
28a40 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
28a50 2d 3e 69 50 61 67 65 2d 31 5d 20 3e 20 70 43 75  ->iPage-1] > pCu
28a60 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
28a70 69 50 61 67 65 2d 31 5d 2d 3e 6e 43 65 6c 6c 20  iPage-1]->nCell 
28a80 29 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  );.  pCur->info.
28a90 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
28aa0 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d 20 7e  r->curFlags &= ~
28ab0 28 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65 79 7c  (BTCF_ValidNKey|
28ac0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3b  BTCF_ValidOvfl);
28ad0 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 4e 6f  .  releasePageNo
28ae0 74 4e 75 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61  tNull(pCur->apPa
28af0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  ge[pCur->iPage--
28b00 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  ]);.}../*.** Mov
28b10 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
28b20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 6f  point to the roo
28b30 74 20 70 61 67 65 20 6f 66 20 69 74 73 20 62 2d  t page of its b-
28b40 74 72 65 65 20 73 74 72 75 63 74 75 72 65 2e 0a  tree structure..
28b50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 61 62  **.** If the tab
28b60 6c 65 20 68 61 73 20 61 20 76 69 72 74 75 61 6c  le has a virtual
28b70 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
28b80 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d   the cursor is m
28b90 6f 76 65 64 20 74 6f 20 70 6f 69 6e 74 0a 2a 2a  oved to point.**
28ba0 20 74 6f 20 74 68 65 20 76 69 72 74 75 61 6c 20   to the virtual 
28bb0 72 6f 6f 74 20 70 61 67 65 20 69 6e 73 74 65 61  root page instea
28bc0 64 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20  d of the actual 
28bd0 72 6f 6f 74 20 70 61 67 65 2e 20 41 20 74 61 62  root page. A tab
28be0 6c 65 20 68 61 73 20 61 0a 2a 2a 20 76 69 72 74  le has a.** virt
28bf0 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 77 68  ual root page wh
28c00 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 72 6f  en the actual ro
28c10 6f 74 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ot page contains
28c20 20 6e 6f 20 63 65 6c 6c 73 20 61 6e 64 20 61 20   no cells and a 
28c30 0a 2a 2a 20 73 69 6e 67 6c 65 20 63 68 69 6c 64  .** single child
28c40 20 70 61 67 65 2e 20 54 68 69 73 20 63 61 6e 20   page. This can 
28c50 6f 6e 6c 79 20 68 61 70 70 65 6e 20 77 69 74 68  only happen with
28c60 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65   the table roote
28c70 64 20 61 74 20 70 61 67 65 20 31 2e 0a 2a 2a 0a  d at page 1..**.
28c80 2a 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  ** If the b-tree
28c90 20 73 74 72 75 63 74 75 72 65 20 69 73 20 65 6d   structure is em
28ca0 70 74 79 2c 20 74 68 65 20 63 75 72 73 6f 72 20  pty, the cursor 
28cb0 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20  state is set to 
28cc0 0a 2a 2a 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  .** CURSOR_INVAL
28cd0 49 44 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ID. Otherwise, t
28ce0 68 65 20 63 75 72 73 6f 72 20 69 73 20 73 65 74  he cursor is set
28cf0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
28d00 20 66 69 72 73 74 0a 2a 2a 20 63 65 6c 6c 20 6c   first.** cell l
28d10 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 72 6f  ocated on the ro
28d20 6f 74 20 28 6f 72 20 76 69 72 74 75 61 6c 20 72  ot (or virtual r
28d30 6f 6f 74 29 20 70 61 67 65 20 61 6e 64 20 74 68  oot) page and th
28d40 65 20 63 75 72 73 6f 72 20 73 74 61 74 65 0a 2a  e cursor state.*
28d50 2a 20 69 73 20 73 65 74 20 74 6f 20 43 55 52 53  * is set to CURS
28d60 4f 52 5f 56 41 4c 49 44 2e 0a 2a 2a 0a 2a 2a 20  OR_VALID..**.** 
28d70 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  If this function
28d80 20 72 65 74 75 72 6e 73 20 73 75 63 63 65 73 73   returns success
28d90 66 75 6c 6c 79 2c 20 69 74 20 6d 61 79 20 62 65  fully, it may be
28da0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
28db0 65 0a 2a 2a 20 70 61 67 65 2d 68 65 61 64 65 72  e.** page-header
28dc0 20 66 6c 61 67 73 20 69 6e 64 69 63 61 74 65 20   flags indicate 
28dd0 74 68 61 74 20 74 68 65 20 5b 76 69 72 74 75 61  that the [virtua
28de0 6c 5d 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20  l] root-page is 
28df0 74 68 65 20 65 78 70 65 63 74 65 64 20 0a 2a 2a  the expected .**
28e00 20 6b 69 6e 64 20 6f 66 20 62 2d 74 72 65 65 20   kind of b-tree 
28e10 70 61 67 65 20 28 69 2e 65 2e 20 69 66 20 77 68  page (i.e. if wh
28e20 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 63  en opening the c
28e30 75 72 73 6f 72 20 74 68 65 20 63 61 6c 6c 65 72  ursor the caller
28e40 20 64 69 64 20 6e 6f 74 0a 2a 2a 20 73 70 65 63   did not.** spec
28e50 69 66 79 20 61 20 4b 65 79 49 6e 66 6f 20 73 74  ify a KeyInfo st
28e60 72 75 63 74 75 72 65 20 74 68 65 20 66 6c 61 67  ructure the flag
28e70 73 20 62 79 74 65 20 69 73 20 73 65 74 20 74 6f  s byte is set to
28e80 20 30 78 30 35 20 6f 72 20 30 78 30 44 2c 0a 2a   0x05 or 0x0D,.*
28e90 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 61 20 74  * indicating a t
28ea0 61 62 6c 65 20 62 2d 74 72 65 65 2c 20 6f 72 20  able b-tree, or 
28eb0 69 66 20 74 68 65 20 63 61 6c 6c 65 72 20 64 69  if the caller di
28ec0 64 20 73 70 65 63 69 66 79 20 61 20 4b 65 79 49  d specify a KeyI
28ed0 6e 66 6f 20 0a 2a 2a 20 73 74 72 75 63 74 75 72  nfo .** structur
28ee0 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74 65  e the flags byte
28ef0 20 69 73 20 73 65 74 20 74 6f 20 30 78 30 32 20   is set to 0x02 
28f00 6f 72 20 30 78 30 41 2c 20 69 6e 64 69 63 61 74  or 0x0A, indicat
28f10 69 6e 67 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20  ing an index.** 
28f20 62 2d 74 72 65 65 29 2e 0a 2a 2f 0a 73 74 61 74  b-tree)..*/.stat
28f30 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f  ic int moveToRoo
28f40 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
28f50 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52  ){.  MemPage *pR
28f60 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  oot;.  int rc = 
28f70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
28f80 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
28f90 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
28fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53  ;.  assert( CURS
28fb0 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55 52  OR_INVALID < CUR
28fc0 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
28fd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
28fe0 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43 55  SOR_VALID   < CU
28ff0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
29000 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
29010 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20 43  RSOR_FAULT   > C
29020 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
29030 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  K );.  if( pCur-
29040 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
29050 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a 20  REQUIRESEEK ){. 
29060 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
29070 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
29080 54 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T ){.      asser
29090 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
290a0 74 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  t!=SQLITE_OK );.
290b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
290c0 72 2d 3e 73 6b 69 70 4e 65 78 74 3b 0a 20 20 20  r->skipNext;.   
290d0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
290e0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
290f0 43 75 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  Cur);.  }..  if(
29100 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30 20   pCur->iPage>=0 
29110 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
29120 3e 69 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >iPage ){.      
29130 64 6f 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  do{.        asse
29140 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
29150 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 21 3d 30  [pCur->iPage]!=0
29160 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
29170 61 73 65 50 61 67 65 4e 6f 74 4e 75 6c 6c 28 70  asePageNotNull(p
29180 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72  Cur->apPage[pCur
29190 2d 3e 69 50 61 67 65 2d 2d 5d 29 3b 0a 20 20 20  ->iPage--]);.   
291a0 20 20 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d     }while( pCur-
291b0 3e 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 67  >iPage);.      g
291c0 6f 74 6f 20 73 6b 69 70 5f 69 6e 69 74 3b 0a 20  oto skip_init;. 
291d0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
291e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
291f0 3d 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  =0 ){.    pCur->
29200 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
29210 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 72 65 74  INVALID;.    ret
29220 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
29230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
29240 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d  rt( pCur->iPage=
29250 3d 28 2d 31 29 20 29 3b 0a 20 20 20 20 72 63 20  =(-1) );.    rc 
29260 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
29270 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 70  (pCur->pBtree->p
29280 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
29290 6f 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67  ot, &pCur->apPag
292a0 65 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  e[0],.          
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c                0,
292c0 20 70 43 75 72 2d 3e 63 75 72 50 61 67 65 72 46   pCur->curPagerF
292d0 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
292e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
292f0 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
29300 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
29310 4c 49 44 3b 0a 20 20 20 20 20 20 20 72 65 74 75  LID;.       retu
29320 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
29330 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 30   pCur->iPage = 0
29340 3b 0a 20 20 20 20 70 43 75 72 2d 3e 63 75 72 49  ;.    pCur->curI
29350 6e 74 4b 65 79 20 3d 20 70 43 75 72 2d 3e 61 70  ntKey = pCur->ap
29360 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 3b  Page[0]->intKey;
29370 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70  .  }.  pRoot = p
29380 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a  Cur->apPage[0];.
29390 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d    assert( pRoot-
293a0 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
293b0 6f 52 6f 6f 74 20 29 3b 0a 0a 20 20 2f 2a 20 49  oRoot );..  /* I
293c0 66 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f  f pCur->pKeyInfo
293d0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
293e0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68  en the caller th
293f0 61 74 20 6f 70 65 6e 65 64 20 74 68 69 73 20 63  at opened this c
29400 75 72 73 6f 72 0a 20 20 2a 2a 20 65 78 70 65 63  ursor.  ** expec
29410 74 65 64 20 74 6f 20 6f 70 65 6e 20 69 74 20 6f  ted to open it o
29420 6e 20 61 6e 20 69 6e 64 65 78 20 62 2d 74 72 65  n an index b-tre
29430 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
29440 20 70 4b 65 79 49 6e 66 6f 20 69 73 0a 20 20 2a   pKeyInfo is.  *
29450 2a 20 4e 55 4c 4c 2c 20 74 68 65 20 63 61 6c 6c  * NULL, the call
29460 65 72 20 65 78 70 65 63 74 73 20 61 20 74 61 62  er expects a tab
29470 6c 65 20 62 2d 74 72 65 65 2e 20 49 66 20 74 68  le b-tree. If th
29480 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
29490 73 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  se,.  ** return 
294a0 61 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  an SQLITE_CORRUP
294b0 54 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2a 0a 20  T error. .  **. 
294c0 20 2a 2a 20 45 61 72 6c 69 65 72 20 76 65 72 73   ** Earlier vers
294d0 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 61  ions of SQLite a
294e0 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 69 73  ssumed that this
294f0 20 74 65 73 74 20 63 6f 75 6c 64 20 6e 6f 74 20   test could not 
29500 66 61 69 6c 0a 20 20 2a 2a 20 69 66 20 74 68 65  fail.  ** if the
29510 20 72 6f 6f 74 20 70 61 67 65 20 77 61 73 20 61   root page was a
29520 6c 72 65 61 64 79 20 6c 6f 61 64 65 64 20 77 68  lready loaded wh
29530 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
29540 20 77 61 73 20 63 61 6c 6c 65 64 20 28 69 2e 65   was called (i.e
29550 2e 0a 20 20 2a 2a 20 69 66 20 70 43 75 72 2d 3e  ..  ** if pCur->
29560 69 50 61 67 65 3e 3d 30 29 2e 20 42 75 74 20 74  iPage>=0). But t
29570 68 69 73 20 69 73 20 6e 6f 74 20 73 6f 20 69 66  his is not so if
29580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
29590 20 63 6f 72 72 75 70 74 65 64 20 0a 20 20 2a 2a   corrupted .  **
295a0 20 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 74   in such a way t
295b0 68 61 74 20 70 61 67 65 20 70 52 6f 6f 74 20 69  hat page pRoot i
295c0 73 20 6c 69 6e 6b 65 64 20 69 6e 74 6f 20 61 20  s linked into a 
295d0 73 65 63 6f 6e 64 20 62 2d 74 72 65 65 20 74 61  second b-tree ta
295e0 62 6c 65 20 0a 20 20 2a 2a 20 28 6f 72 20 74 68  ble .  ** (or th
295f0 65 20 66 72 65 65 6c 69 73 74 29 2e 20 20 2a 2f  e freelist).  */
29600 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74  .  assert( pRoot
29610 2d 3e 69 6e 74 4b 65 79 3d 3d 31 20 7c 7c 20 70  ->intKey==1 || p
29620 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20  Root->intKey==0 
29630 29 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e  );.  if( pRoot->
29640 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 28 70 43  isInit==0 || (pC
29650 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29  ur->pKeyInfo==0)
29660 21 3d 70 52 6f 6f 74 2d 3e 69 6e 74 4b 65 79 20  !=pRoot->intKey 
29670 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
29680 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
29690 54 3b 0a 20 20 7d 0a 0a 73 6b 69 70 5f 69 6e 69  T;.  }..skip_ini
296a0 74 3a 20 20 0a 20 20 70 43 75 72 2d 3e 61 69 49  t:  .  pCur->aiI
296b0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
296c0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
296d0 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46 6c  0;.  pCur->curFl
296e0 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 41 74  ags &= ~(BTCF_At
296f0 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69 64 4e  Last|BTCF_ValidN
29700 4b 65 79 7c 42 54 43 46 5f 56 61 6c 69 64 4f 76  Key|BTCF_ValidOv
29710 66 6c 29 3b 0a 0a 20 20 70 52 6f 6f 74 20 3d 20  fl);..  pRoot = 
29720 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b  pCur->apPage[0];
29730 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
29740 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 70 43 75  ell>0 ){.    pCu
29750 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
29760 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 7d 65 6c 73  OR_VALID;.  }els
29770 65 20 69 66 28 20 21 70 52 6f 6f 74 2d 3e 6c 65  e if( !pRoot->le
29780 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
29790 75 62 70 61 67 65 3b 0a 20 20 20 20 69 66 28 20  ubpage;.    if( 
297a0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 21 3d 31 20 29  pRoot->pgno!=1 )
297b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
297c0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
297d0 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34 62   subpage = get4b
297e0 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74  yte(&pRoot->aDat
297f0 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73  a[pRoot->hdrOffs
29800 65 74 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72  et+8]);.    pCur
29810 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
29820 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20  R_VALID;.    rc 
29830 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29840 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20  ur, subpage);.  
29850 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75 72 2d  }else{.    pCur-
29860 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
29870 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 7d 0a 20 20  _INVALID;.  }.  
29880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
29890 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  .** Move the cur
298a0 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  sor down to the 
298b0 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65  left-most leaf e
298c0 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
298d0 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69  .** entry to whi
298e0 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  ch it is current
298f0 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a  ly pointing..**.
29900 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ** The left-most
29910 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65   leaf is the one
29920 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65   with the smalle
29930 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72  st key - the fir
29940 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  st.** in ascendi
29950 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
29960 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65  tic int moveToLe
29970 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  ftmost(BtCursor 
29980 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
29990 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
299a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
299b0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
299c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
299d0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
299e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
299f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
29a00 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
29a10 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
29a20 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
29a30 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
29a40 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
29a50 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
29a60 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
29a70 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
29a80 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
29a90 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
29aa0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
29ab0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
29ac0 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
29ad0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
29ae0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
29af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29b00 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
29b10 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
29b20 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
29b30 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29b40 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
29b50 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
29b60 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
29b70 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
29b80 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
29b90 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
29ba0 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
29bb0 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
29bc0 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
29bd0 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
29be0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
29bf0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
29c00 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
29c10 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
29c20 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
29c30 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
29c40 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
29c50 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
29c60 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
29c70 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
29c80 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
29c90 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
29ca0 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
29cb0 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
29cc0 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
29cd0 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
29ce0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
29cf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
29d00 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
29d10 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
29d20 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
29d30 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
29d40 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
29d50 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
29d60 20 77 68 69 6c 65 28 20 21 28 70 50 61 67 65 20   while( !(pPage 
29d70 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
29d80 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
29d90 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
29da0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
29db0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
29dc0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
29dd0 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
29de0 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
29df0 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72  ge->nCell;.    r
29e00 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
29e10 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  pCur, pgno);.   
29e20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
29e30 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d   rc;.  }.  pCur-
29e40 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
29e50 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
29e60 6c 6c 2d 31 3b 0a 20 20 61 73 73 65 72 74 28 20  ll-1;.  assert( 
29e70 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
29e80 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29e90 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
29ea0 20 26 20 42 54 43 46 5f 56 61 6c 69 64 4e 4b 65   & BTCF_ValidNKe
29eb0 79 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  y)==0 );.  retur
29ec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29ed0 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  /* Move the curs
29ee0 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  or to the first 
29ef0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
29f00 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
29f10 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63  TE_OK.** on succ
29f20 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20  ess.  Set *pRes 
29f30 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73  to 0 if the curs
29f40 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e  or actually poin
29f50 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a  ts to something.
29f60 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20  ** or set *pRes 
29f70 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c  to 1 if the tabl
29f80 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69  e is empty..*/.i
29f90 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46  nt sqlite3BtreeF
29fa0 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70  irst(BtCursor *p
29fb0 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b  Cur, int *pRes){
29fc0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
29fd0 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77 6e 73  sert( cursorOwns
29fe0 42 74 53 68 61 72 65 64 28 70 43 75 72 29 20 29  BtShared(pCur) )
29ff0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
2a000 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
2a010 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
2a020 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
2a030 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a040 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2a050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a060 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
2a070 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
2a080 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a090 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2a0a0 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2a0b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a0c0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2a0d0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2a0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2a0f0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
2a100 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2a110 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2a120 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
2a130 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
2a140 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
2a150 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2a160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
2a170 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
2a180 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
2a190 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
2a1a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
2a1b0 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
2a1c0 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
2a1d0 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
2a1e0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
2a1f0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
2a200 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
2a210 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
2a220 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
2a230 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
2a240 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
2a250 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
2a260 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
2a270 72 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64  rsorOwnsBtShared
2a280 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
2a290 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2a2a0 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
2a2b0 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
2a2c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
2a2d0 63 75 72 73 6f 72 20 61 6c 72 65 61 64 79 20 70  cursor already p
2a2e0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61 73  oints to the las
2a2f0 74 20 65 6e 74 72 79 2c 20 74 68 69 73 20 69 73  t entry, this is
2a300 20 61 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69   a no-op. */.  i
2a310 66 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3d  f( CURSOR_VALID=
2a320 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 26 26  =pCur->eState &&
2a330 20 28 70 43 75 72 2d 3e 63 75 72 46 6c 61 67 73   (pCur->curFlags
2a340 20 26 20 42 54 43 46 5f 41 74 4c 61 73 74 29 21   & BTCF_AtLast)!
2a350 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
2a360 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
2a370 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 72 76   This block serv
2a380 65 73 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  es to assert() t
2a390 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 72  hat the cursor r
2a3a0 65 61 6c 6c 79 20 64 6f 65 73 20 70 6f 69 6e 74  eally does point
2a3b0 20 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20   .    ** to the 
2a3c0 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68  last entry in th
2a3d0 65 20 62 2d 74 72 65 65 2e 20 2a 2f 0a 20 20 20  e b-tree. */.   
2a3e0 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72   int ii;.    for
2a3f0 28 69 69 3d 30 3b 20 69 69 3c 70 43 75 72 2d 3e  (ii=0; ii<pCur->
2a400 69 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  iPage; ii++){.  
2a410 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
2a420 2d 3e 61 69 49 64 78 5b 69 69 5d 3d 3d 70 43 75  ->aiIdx[ii]==pCu
2a430 72 2d 3e 61 70 50 61 67 65 5b 69 69 5d 2d 3e 6e  r->apPage[ii]->n
2a440 43 65 6c 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Cell );.    }.  
2a450 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2a460 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
2a470 65 5d 3d 3d 70 43 75 72 2d 3e 61 70 50 61 67 65  e]==pCur->apPage
2a480 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2a490 43 65 6c 6c 2d 31 20 29 3b 0a 20 20 20 20 61 73  Cell-1 );.    as
2a4a0 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61  sert( pCur->apPa
2a4b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a4c0 3e 6c 65 61 66 20 29 3b 0a 23 65 6e 64 69 66 0a  >leaf );.#endif.
2a4d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2a4e0 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  E_OK;.  }..  rc 
2a4f0 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
2a500 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
2a510 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2a520 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
2a530 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
2a540 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2a550 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   pCur->pgnoRoot=
2a560 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  =0 || pCur->apPa
2a570 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2a580 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20  >nCell==0 );.   
2a590 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
2a5a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2a5b0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
2a5c0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
2a5d0 44 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  D );.      *pRes
2a5e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2a5f0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
2a600 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 69 66  (pCur);.      if
2a610 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2a620 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
2a630 3e 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43  >curFlags |= BTC
2a640 46 5f 41 74 4c 61 73 74 3b 0a 20 20 20 20 20 20  F_AtLast;.      
2a650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2a660 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 3d  Cur->curFlags &=
2a670 20 7e 42 54 43 46 5f 41 74 4c 61 73 74 3b 0a 20   ~BTCF_AtLast;. 
2a680 20 20 20 20 20 7d 0a 20 20 20 0a 20 20 20 20 7d       }.   .    }
2a690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2a6a0 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
2a6b0 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20   cursor so that 
2a6c0 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20  it points to an 
2a6d0 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b  entry near the k
2a6e0 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ey .** specified
2a6f0 20 62 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69   by pIdxKey or i
2a700 6e 74 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20  ntKey.   Return 
2a710 61 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a  a success code..
2a720 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59  **.** For INTKEY
2a730 20 74 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74   tables, the int
2a740 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69 73  Key parameter is
2a750 20 75 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20   used.  pIdxKey 
2a760 0a 2a 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c  .** must be NULL
2a770 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62  .  For index tab
2a780 6c 65 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20  les, pIdxKey is 
2a790 75 73 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a  used and intKey.
2a7a0 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a  ** is ignored..*
2a7b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74  *.** If an exact
2a7c0 20 6d 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f   match is not fo
2a7d0 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75  und, then the cu
2a7e0 72 73 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a  rsor is always.*
2a7f0 2a 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  * left pointing 
2a800 61 74 20 61 20 6c 65 61 66 20 70 61 67 65 20 77  at a leaf page w
2a810 68 69 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20  hich would hold 
2a820 74 68 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a  the entry if it.
2a830 2a 2a 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e  ** were present.
2a840 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67    The cursor mig
2a850 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65  ht point to an e
2a860 6e 74 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a  ntry that comes.
2a870 2a 2a 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74  ** before or aft
2a880 65 72 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a  er the key..**.*
2a890 2a 20 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20  * An integer is 
2a8a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52  written into *pR
2a8b0 65 73 20 77 68 69 63 68 20 69 73 20 74 68 65 20  es which is the 
2a8c0 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d  result of.** com
2a8d0 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77  paring the key w
2a8e0 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f  ith the entry to
2a8f0 20 77 68 69 63 68 20 74 68 65 20 63 75 72 73 6f   which the curso
2a900 72 20 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e  r is .** pointin
2a910 67 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20  g.  The meaning 
2a920 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 77  of the integer w
2a930 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a  ritten into.** *
2a940 70 52 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f  pRes is as follo
2a950 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70  ws:.**.**     *p
2a960 52 65 73 3c 30 20 20 20 20 20 20 54 68 65 20 63  Res<0      The c
2a970 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f  ursor is left po
2a980 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2a990 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20  ry that.**      
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 20 73              is s
2a9b0 6d 61 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b  maller than intK
2a9c0 65 79 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66  ey/pIdxKey or if
2a9d0 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
2a9e0 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
2a9f0 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
2aa00 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
2aa10 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
2aa20 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
2aa30 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
2aa40 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
2aa50 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
2aa60 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
2aa70 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
2aa80 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
2aa90 65 73 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65  es intKey/pIdxKe
2aaa0 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  y..**.**     *pR
2aab0 65 73 3e 30 20 20 20 20 20 20 54 68 65 20 63 75  es>0      The cu
2aac0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
2aad0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
2aae0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
2aaf0 20 20 20 20 20 20 20 20 20 20 20 69 73 20 6c 61             is la
2ab00 72 67 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  rger than intKey
2ab10 2f 70 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20  /pIdxKey..**.** 
2ab20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73  For index tables
2ab30 2c 20 74 68 65 20 70 49 64 78 4b 65 79 2d 3e 65  , the pIdxKey->e
2ab40 71 53 65 65 6e 20 66 69 65 6c 64 20 69 73 20 73  qSeen field is s
2ab50 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 72 65  et to 1 if there
2ab60 0a 2a 2a 20 65 78 69 73 74 73 20 61 6e 20 65 6e  .** exists an en
2ab70 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65  try in the table
2ab80 20 74 68 61 74 20 65 78 61 63 74 6c 79 20 6d 61   that exactly ma
2ab90 74 63 68 65 73 20 70 49 64 78 4b 65 79 2e 20 20  tches pIdxKey.  
2aba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
2abb0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
2abc0 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
2abd0 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
2abe0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
2abf0 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
2ac00 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
2ac10 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
2ac20 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
2ac30 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
2ac40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2ac50 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
2ac60 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
2ac70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
2ac80 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
2ac90 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
2aca0 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
2acb0 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
2acc0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
2acd0 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
2ace0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2acf0 0a 20 20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  .  RecordCompare
2ad00 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b   xRecordCompare;
2ad10 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2ad20 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2ad30 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2ad40 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2ad50 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
2ad60 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
2ad70 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 20  .  assert( pRes 
2ad80 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 49  );.  assert( (pI
2ad90 64 78 4b 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72  dxKey==0)==(pCur
2ada0 2d 3e 70 4b 65 79 49 6e 66 6f 3d 3d 30 29 20 29  ->pKeyInfo==0) )
2adb0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2adc0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
2add0 5f 56 41 4c 49 44 20 7c 7c 20 28 70 49 64 78 4b  _VALID || (pIdxK
2ade0 65 79 3d 3d 30 29 3d 3d 28 70 43 75 72 2d 3e 63  ey==0)==(pCur->c
2adf0 75 72 49 6e 74 4b 65 79 21 3d 30 29 20 29 3b 0a  urIntKey!=0) );.
2ae00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
2ae10 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70  sor is already p
2ae20 6f 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65  ositioned at the
2ae30 20 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72   point we are tr
2ae40 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76  ying.  ** to mov
2ae50 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20  e to, then just 
2ae60 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
2ae70 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f  oing any work */
2ae80 0a 20 20 69 66 28 20 70 49 64 78 4b 65 79 3d 3d  .  if( pIdxKey==
2ae90 30 0a 20 20 20 26 26 20 70 43 75 72 2d 3e 65 53  0.   && pCur->eS
2aea0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2aeb0 49 44 20 26 26 20 28 70 43 75 72 2d 3e 63 75 72  ID && (pCur->cur
2aec0 46 6c 61 67 73 20 26 20 42 54 43 46 5f 56 61 6c  Flags & BTCF_Val
2aed0 69 64 4e 4b 65 79 29 21 3d 30 0a 20 20 29 7b 0a  idNKey)!=0.  ){.
2aee0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e      if( pCur->in
2aef0 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  fo.nKey==intKey 
2af00 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
2af10 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
2af20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2af30 7d 0a 20 20 20 20 69 66 28 20 28 70 43 75 72 2d  }.    if( (pCur-
2af40 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54 43 46  >curFlags & BTCF
2af50 5f 41 74 4c 61 73 74 29 21 3d 30 20 26 26 20 70  _AtLast)!=0 && p
2af60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69  Cur->info.nKey<i
2af70 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a  ntKey ){.      *
2af80 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20  pRes = -1;.     
2af90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2afa0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
2afb0 69 66 28 20 70 49 64 78 4b 65 79 20 29 7b 0a 20  if( pIdxKey ){. 
2afc0 20 20 20 78 52 65 63 6f 72 64 43 6f 6d 70 61 72     xRecordCompar
2afd0 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 46  e = sqlite3VdbeF
2afe0 69 6e 64 43 6f 6d 70 61 72 65 28 70 49 64 78 4b  indCompare(pIdxK
2aff0 65 79 29 3b 0a 20 20 20 20 70 49 64 78 4b 65 79  ey);.    pIdxKey
2b000 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20  ->errCode = 0;. 
2b010 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 4b     assert( pIdxK
2b020 65 79 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3d 3d  ey->default_rc==
2b030 31 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 70  1 .         || p
2b040 49 64 78 4b 65 79 2d 3e 64 65 66 61 75 6c 74 5f  IdxKey->default_
2b050 72 63 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  rc==0 .         
2b060 7c 7c 20 70 49 64 78 4b 65 79 2d 3e 64 65 66 61  || pIdxKey->defa
2b070 75 6c 74 5f 72 63 3d 3d 2d 31 0a 20 20 20 20 29  ult_rc==-1.    )
2b080 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 78  ;.  }else{.    x
2b090 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 3d 20  RecordCompare = 
2b0a0 30 3b 20 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 61  0; /* All keys a
2b0b0 72 65 20 69 6e 74 65 67 65 72 73 20 2a 2f 0a 20  re integers */. 
2b0c0 20 7d 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   }..  rc = moveT
2b0d0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
2b0e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2b0f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2b100 73 65 72 74 28 20 70 43 75 72 2d 3e 70 67 6e 6f  sert( pCur->pgno
2b110 52 6f 6f 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d  Root==0 || pCur-
2b120 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2b130 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
2b140 28 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ( pCur->pgnoRoot
2b150 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50  ==0 || pCur->apP
2b160 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
2b170 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73  ->isInit );.  as
2b180 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
2b190 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
2b1a0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61  ID || pCur->apPa
2b1b0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2b1c0 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 69 66  >nCell>0 );.  if
2b1d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2b1e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
2b1f0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31  {.    *pRes = -1
2b200 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
2b210 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 30 20  ur->pgnoRoot==0 
2b220 7c 7c 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  || pCur->apPage[
2b230 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
2b240 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ell==0 );.    re
2b250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b260 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
2b270 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69  ur->apPage[0]->i
2b280 6e 74 4b 65 79 3d 3d 70 43 75 72 2d 3e 63 75 72  ntKey==pCur->cur
2b290 49 6e 74 4b 65 79 20 29 3b 0a 20 20 61 73 73 65  IntKey );.  asse
2b2a0 72 74 28 20 70 43 75 72 2d 3e 63 75 72 49 6e 74  rt( pCur->curInt
2b2b0 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20 29  Key || pIdxKey )
2b2c0 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  ;.  for(;;){.   
2b2d0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 2c 20 69   int lwr, upr, i
2b2e0 64 78 2c 20 63 3b 0a 20 20 20 20 50 67 6e 6f 20  dx, c;.    Pgno 
2b2f0 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
2b300 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
2b310 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
2b320 69 50 61 67 65 5d 3b 0a 20 20 20 20 75 38 20 2a  iPage];.    u8 *
2b330 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  pCell;          
2b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b350 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
2b360 72 72 65 6e 74 20 63 65 6c 6c 20 69 6e 20 70 50  rrent cell in pP
2b370 61 67 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 70  age */..    /* p
2b380 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 6d 75 73 74  Page->nCell must
2b390 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
2b3a0 20 7a 65 72 6f 2e 20 49 66 20 74 68 69 73 20 69   zero. If this i
2b3b0 73 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 0a  s the root-page.
2b3c0 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72 73 6f      ** the curso
2b3d0 72 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65  r would have bee
2b3e0 6e 20 49 4e 56 41 4c 49 44 20 61 62 6f 76 65 20  n INVALID above 
2b3f0 61 6e 64 20 74 68 69 73 20 66 6f 72 28 3b 3b 29  and this for(;;)
2b400 20 6c 6f 6f 70 0a 20 20 20 20 2a 2a 20 6e 6f 74   loop.    ** not
2b410 20 72 75 6e 2e 20 49 66 20 74 68 69 73 20 69 73   run. If this is
2b420 20 6e 6f 74 20 74 68 65 20 72 6f 6f 74 2d 70 61   not the root-pa
2b430 67 65 2c 20 74 68 65 6e 20 74 68 65 20 6d 6f 76  ge, then the mov
2b440 65 54 6f 43 68 69 6c 64 28 29 20 72 6f 75 74 69  eToChild() routi
2b450 6e 65 0a 20 20 20 20 2a 2a 20 77 6f 75 6c 64 20  ne.    ** would 
2b460 68 61 76 65 20 61 6c 72 65 61 64 79 20 64 65 74  have already det
2b470 65 63 74 65 64 20 64 62 20 63 6f 72 72 75 70 74  ected db corrupt
2b480 69 6f 6e 2e 20 53 69 6d 69 6c 61 72 6c 79 2c 20  ion. Similarly, 
2b490 70 50 61 67 65 20 6d 75 73 74 0a 20 20 20 20 2a  pPage must.    *
2b4a0 2a 20 62 65 20 74 68 65 20 72 69 67 68 74 20 6b  * be the right k
2b4b0 69 6e 64 20 28 69 6e 64 65 78 20 6f 72 20 74 61  ind (index or ta
2b4c0 62 6c 65 29 20 6f 66 20 62 2d 74 72 65 65 20 70  ble) of b-tree p
2b4d0 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 0a 20  age. Otherwise. 
2b4e0 20 20 20 2a 2a 20 61 20 6d 6f 76 65 54 6f 43 68     ** a moveToCh
2b4f0 69 6c 64 28 29 20 6f 72 20 6d 6f 76 65 54 6f 52  ild() or moveToR
2b500 6f 6f 74 28 29 20 63 61 6c 6c 20 77 6f 75 6c 64  oot() call would
2b510 20 68 61 76 65 20 64 65 74 65 63 74 65 64 20 63   have detected c
2b520 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20  orruption.  */. 
2b530 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b540 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
2b550 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2b560 69 6e 74 4b 65 79 3d 3d 28 70 49 64 78 4b 65 79  intKey==(pIdxKey
2b570 3d 3d 30 29 20 29 3b 0a 20 20 20 20 6c 77 72 20  ==0) );.    lwr 
2b580 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70  = 0;.    upr = p
2b590 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20  Page->nCell-1;. 
2b5a0 20 20 20 61 73 73 65 72 74 28 20 62 69 61 73 52     assert( biasR
2b5b0 69 67 68 74 3d 3d 30 20 7c 7c 20 62 69 61 73 52  ight==0 || biasR
2b5c0 69 67 68 74 3d 3d 31 20 29 3b 0a 20 20 20 20 69  ight==1 );.    i
2b5d0 64 78 20 3d 20 75 70 72 3e 3e 28 31 2d 62 69 61  dx = upr>>(1-bia
2b5e0 73 52 69 67 68 74 29 3b 20 2f 2a 20 69 64 78 20  sRight); /* idx 
2b5f0 3d 20 62 69 61 73 52 69 67 68 74 20 3f 20 75 70  = biasRight ? up
2b600 72 20 3a 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  r : (lwr+upr)/2;
2b610 20 2a 2f 0a 20 20 20 20 70 43 75 72 2d 3e 61 69   */.    pCur->ai
2b620 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
2b630 20 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20   = (u16)idx;.   
2b640 20 69 66 28 20 78 52 65 63 6f 72 64 43 6f 6d 70   if( xRecordComp
2b650 61 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  are==0 ){.      
2b660 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20  for(;;){.       
2b670 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20   i64 nCellKey;. 
2b680 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
2b690 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72 28 70  indCellPastPtr(p
2b6a0 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
2b6b0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
2b6c0 6e 74 4b 65 79 4c 65 61 66 20 29 7b 0a 20 20 20  ntKeyLeaf ){.   
2b6d0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 78         while( 0x
2b6e0 38 30 20 3c 3d 20 2a 28 70 43 65 6c 6c 2b 2b 29  80 <= *(pCell++)
2b6f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b700 69 66 28 20 70 43 65 6c 6c 3e 3d 70 50 61 67 65  if( pCell>=pPage
2b710 2d 3e 61 44 61 74 61 45 6e 64 20 29 20 72 65 74  ->aDataEnd ) ret
2b720 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2b730 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
2b740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2b750 20 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74         getVarint
2b760 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e  (pCell, (u64*)&n
2b770 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
2b780 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69    if( nCellKey<i
2b790 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
2b7a0 20 20 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a     lwr = idx+1;.
2b7b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6c 77            if( lw
2b7c0 72 3e 75 70 72 20 29 7b 20 63 20 3d 20 2d 31 3b  r>upr ){ c = -1;
2b7d0 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 20 20   break; }.      
2b7e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43 65 6c    }else if( nCel
2b7f0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  lKey>intKey ){. 
2b800 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69           upr = i
2b810 64 78 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  dx-1;.          
2b820 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b 20 63  if( lwr>upr ){ c
2b830 20 3d 20 2b 31 3b 20 62 72 65 61 6b 3b 20 7d 0a   = +1; break; }.
2b840 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2b850 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2b860 20 6e 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65   nCellKey==intKe
2b870 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  y );.          p
2b880 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2b890 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69  >iPage] = (u16)i
2b8a0 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  dx;.          if
2b8b0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
2b8c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 77  {.            lw
2b8d0 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20 20 20  r = idx;.       
2b8e0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
2b8f0 5f 6e 65 78 74 5f 6c 61 79 65 72 3b 0a 20 20 20  _next_layer;.   
2b900 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
2b910 20 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e            pCur->
2b920 63 75 72 46 6c 61 67 73 20 7c 3d 20 42 54 43 46  curFlags |= BTCF
2b930 5f 56 61 6c 69 64 4e 4b 65 79 3b 0a 20 20 20 20  _ValidNKey;.    
2b940 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e          pCur->in
2b950 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b  fo.nKey = nCellK
2b960 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey;.            
2b970 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
2b980 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
2b990 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
2b9a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2b9b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2b9c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2b9d0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2b9e0 20 6c 77 72 2b 75 70 72 3e 3d 30 20 29 3b 0a 20   lwr+upr>=0 );. 
2b9f0 20 20 20 20 20 20 20 69 64 78 20 3d 20 28 6c 77         idx = (lw
2ba00 72 2b 75 70 72 29 3e 3e 31 3b 20 20 2f 2a 20 69  r+upr)>>1;  /* i
2ba10 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32  dx = (lwr+upr)/2
2ba20 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2ba30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
2ba40 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 20 20 69  r(;;){.        i
2ba50 6e 74 20 6e 43 65 6c 6c 3b 20 20 2f 2a 20 53 69  nt nCell;  /* Si
2ba60 7a 65 20 6f 66 20 74 68 65 20 70 43 65 6c 6c 20  ze of the pCell 
2ba70 63 65 6c 6c 20 69 6e 20 62 79 74 65 73 20 2a 2f  cell in bytes */
2ba80 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
2ba90 20 66 69 6e 64 43 65 6c 6c 50 61 73 74 50 74 72   findCellPastPtr
2baa0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 0a 20  (pPage, idx);.. 
2bab0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
2bac0 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
2bad0 70 61 67 65 2d 73 69 7a 65 20 69 73 20 36 35 35  page-size is 655
2bae0 33 36 20 62 79 74 65 73 2e 20 54 68 69 73 20 6d  36 bytes. This m
2baf0 65 61 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20  eans that.      
2bb00 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d    ** the maximum
2bb10 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   number of recor
2bb20 64 20 62 79 74 65 73 20 73 74 6f 72 65 64 20 6f  d bytes stored o
2bb30 6e 20 61 6e 20 69 6e 64 65 78 20 42 2d 54 72 65  n an index B-Tre
2bb40 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67  e.        ** pag
2bb50 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31  e is less than 1
2bb60 36 33 38 34 20 62 79 74 65 73 20 61 6e 64 20 6d  6384 bytes and m
2bb70 61 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ay be stored as 
2bb80 61 20 32 2d 62 79 74 65 0a 20 20 20 20 20 20 20  a 2-byte.       
2bb90 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 68 69 73   ** varint. This
2bba0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
2bbb0 75 73 65 64 20 74 6f 20 61 74 74 65 6d 70 74 20  used to attempt 
2bbc0 74 6f 20 61 76 6f 69 64 20 70 61 72 73 69 6e 67  to avoid parsing
2bbd0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65   .        ** the
2bbe0 20 65 6e 74 69 72 65 20 63 65 6c 6c 20 62 79 20   entire cell by 
2bbf0 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 74 68 65  checking for the
2bc00 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
2bc10 20 72 65 63 6f 72 64 20 69 73 20 0a 20 20 20 20   record is .    
2bc20 20 20 20 20 2a 2a 20 73 74 6f 72 65 64 20 65 6e      ** stored en
2bc30 74 69 72 65 6c 79 20 77 69 74 68 69 6e 20 74 68  tirely within th
2bc40 65 20 62 2d 74 72 65 65 20 70 61 67 65 20 62 79  e b-tree page by
2bc50 20 69 6e 73 70 65 63 74 69 6e 67 20 74 68 65 20   inspecting the 
2bc60 66 69 72 73 74 20 0a 20 20 20 20 20 20 20 20 2a  first .        *
2bc70 2a 20 32 20 62 79 74 65 73 20 6f 66 20 74 68 65  * 2 bytes of the
2bc80 20 63 65 6c 6c 2e 0a 20 20 20 20 20 20 20 20 2a   cell..        *
2bc90 2f 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20  /.        nCell 
2bca0 3d 20 70 43 65 6c 6c 5b 30 5d 3b 0a 20 20 20 20  = pCell[0];.    
2bcb0 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 3c 3d 70      if( nCell<=p
2bcc0 50 61 67 65 2d 3e 6d 61 78 31 62 79 74 65 50 61  Page->max1bytePa
2bcd0 79 6c 6f 61 64 20 29 7b 0a 20 20 20 20 20 20 20  yload ){.       
2bce0 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
2bcf0 68 20 72 75 6e 73 20 69 66 20 74 68 65 20 72 65  h runs if the re
2bd00 63 6f 72 64 2d 73 69 7a 65 20 66 69 65 6c 64 20  cord-size field 
2bd10 6f 66 20 74 68 65 20 63 65 6c 6c 20 69 73 20 61  of the cell is a
2bd20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 69  .          ** si
2bd30 6e 67 6c 65 20 62 79 74 65 20 76 61 72 69 6e 74  ngle byte varint
2bd40 20 61 6e 64 20 74 68 65 20 72 65 63 6f 72 64 20   and the record 
2bd50 66 69 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 6e  fits entirely on
2bd60 20 74 68 65 20 6d 61 69 6e 0a 20 20 20 20 20 20   the main.      
2bd70 20 20 20 20 2a 2a 20 62 2d 74 72 65 65 20 70 61      ** b-tree pa
2bd80 67 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ge.  */.        
2bd90 20 20 74 65 73 74 63 61 73 65 28 20 70 43 65 6c    testcase( pCel
2bda0 6c 2b 6e 43 65 6c 6c 2b 31 3d 3d 70 50 61 67 65  l+nCell+1==pPage
2bdb0 2d 3e 61 44 61 74 61 45 6e 64 20 29 3b 0a 20 20  ->aDataEnd );.  
2bdc0 20 20 20 20 20 20 20 20 63 20 3d 20 78 52 65 63          c = xRec
2bdd0 6f 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c  ordCompare(nCell
2bde0 2c 20 28 76 6f 69 64 2a 29 26 70 43 65 6c 6c 5b  , (void*)&pCell[
2bdf0 31 5d 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  1], pIdxKey);.  
2be00 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2be10 21 28 70 43 65 6c 6c 5b 31 5d 20 26 20 30 78 38  !(pCell[1] & 0x8
2be20 30 29 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  0) .          &&
2be30 20 28 6e 43 65 6c 6c 20 3d 20 28 28 6e 43 65 6c   (nCell = ((nCel
2be40 6c 26 30 78 37 66 29 3c 3c 37 29 20 2b 20 70 43  l&0x7f)<<7) + pC
2be50 65 6c 6c 5b 31 5d 29 3c 3d 70 50 61 67 65 2d 3e  ell[1])<=pPage->
2be60 6d 61 78 4c 6f 63 61 6c 0a 20 20 20 20 20 20 20  maxLocal.       
2be70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
2be80 20 54 68 65 20 72 65 63 6f 72 64 2d 73 69 7a 65   The record-size
2be90 20 66 69 65 6c 64 20 69 73 20 61 20 32 20 62 79   field is a 2 by
2bea0 74 65 20 76 61 72 69 6e 74 20 61 6e 64 20 74 68  te varint and th
2beb0 65 20 72 65 63 6f 72 64 20 0a 20 20 20 20 20 20  e record .      
2bec0 20 20 20 20 2a 2a 20 66 69 74 73 20 65 6e 74 69      ** fits enti
2bed0 72 65 6c 79 20 6f 6e 20 74 68 65 20 6d 61 69 6e  rely on the main
2bee0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 2a   b-tree page.  *
2bef0 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
2bf00 63 61 73 65 28 20 70 43 65 6c 6c 2b 6e 43 65 6c  case( pCell+nCel
2bf10 6c 2b 32 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  l+2==pPage->aDat
2bf20 61 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 20 20  aEnd );.        
2bf30 20 20 63 20 3d 20 78 52 65 63 6f 72 64 43 6f 6d    c = xRecordCom
2bf40 70 61 72 65 28 6e 43 65 6c 6c 2c 20 28 76 6f 69  pare(nCell, (voi
2bf50 64 2a 29 26 70 43 65 6c 6c 5b 32 5d 2c 20 70 49  d*)&pCell[2], pI
2bf60 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
2bf70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
2bf80 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 66   /* The record f
2bf90 6c 6f 77 73 20 6f 76 65 72 20 6f 6e 74 6f 20 6f  lows over onto o
2bfa0 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66  ne or more overf
2bfb0 6c 6f 77 20 70 61 67 65 73 2e 20 49 6e 0a 20 20  low pages. In.  
2bfc0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20          ** this 
2bfd0 63 61 73 65 20 74 68 65 20 77 68 6f 6c 65 20 63  case the whole c
2bfe0 65 6c 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ell needs to be 
2bff0 70 61 72 73 65 64 2c 20 61 20 62 75 66 66 65 72  parsed, a buffer
2c000 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2c010 20 20 20 20 20 2a 2a 20 61 6e 64 20 61 63 63 65       ** and acce
2c020 73 73 50 61 79 6c 6f 61 64 28 29 20 75 73 65 64  ssPayload() used
2c030 20 74 6f 20 72 65 74 72 69 65 76 65 20 74 68 65   to retrieve the
2c040 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
2c050 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 75  .          ** bu
2c060 66 66 65 72 20 62 65 66 6f 72 65 20 56 64 62 65  ffer before Vdbe
2c070 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
2c080 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 0a  can be called. .
2c090 20 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20            **.   
2c0a0 20 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65         ** If the
2c0b0 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75   record is corru
2c0c0 70 74 2c 20 74 68 65 20 78 52 65 63 6f 72 64 43  pt, the xRecordC
2c0d0 6f 6d 70 61 72 65 20 72 6f 75 74 69 6e 65 20 6d  ompare routine m
2c0e0 61 79 20 72 65 61 64 0a 20 20 20 20 20 20 20 20  ay read.        
2c0f0 20 20 2a 2a 20 75 70 20 74 6f 20 74 77 6f 20 76    ** up to two v
2c100 61 72 69 6e 74 73 20 70 61 73 74 20 74 68 65 20  arints past the 
2c110 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66 66 65  end of the buffe
2c120 72 2e 20 41 6e 20 65 78 74 72 61 20 31 38 20 0a  r. An extra 18 .
2c130 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74            ** byt
2c140 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  es of padding is
2c150 20 61 6c 6c 6f 63 61 74 65 64 20 61 74 20 74 68   allocated at th
2c160 65 20 65 6e 64 20 6f 66 20 74 68 65 20 62 75 66  e end of the buf
2c170 66 65 72 20 69 6e 0a 20 20 20 20 20 20 20 20 20  fer in.         
2c180 20 2a 2a 20 63 61 73 65 20 74 68 69 73 20 68 61   ** case this ha
2c190 70 70 65 6e 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ppens.  */.     
2c1a0 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c       void *pCell
2c1b0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20 20 75  Key;.          u
2c1c0 38 20 2a 20 63 6f 6e 73 74 20 70 43 65 6c 6c 42  8 * const pCellB
2c1d0 6f 64 79 20 3d 20 70 43 65 6c 6c 20 2d 20 70 50  ody = pCell - pP
2c1e0 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a  age->childPtrSiz
2c1f0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  e;.          pPa
2c200 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c 28 70  ge->xParseCell(p
2c210 50 61 67 65 2c 20 70 43 65 6c 6c 42 6f 64 79 2c  Page, pCellBody,
2c220 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20   &pCur->info);. 
2c230 20 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 20 3d           nCell =
2c240 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e 66 6f   (int)pCur->info
2c250 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 20  .nKey;.         
2c260 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c 6c   testcase( nCell
2c270 3c 30 20 29 3b 20 20 20 2f 2a 20 54 72 75 65 20  <0 );   /* True 
2c280 69 66 20 6b 65 79 20 73 69 7a 65 20 69 73 20 32  if key size is 2
2c290 5e 33 32 20 6f 72 20 6d 6f 72 65 20 2a 2f 0a 20  ^32 or more */. 
2c2a0 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
2c2b0 65 28 20 6e 43 65 6c 6c 3d 3d 30 20 29 3b 20 20  e( nCell==0 );  
2c2c0 2f 2a 20 49 6e 76 61 6c 69 64 20 6b 65 79 20 73  /* Invalid key s
2c2d0 69 7a 65 3a 20 20 30 78 38 30 20 30 78 38 30 20  ize:  0x80 0x80 
2c2e0 30 78 30 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  0x00 */.        
2c2f0 20 20 74 65 73 74 63 61 73 65 28 20 6e 43 65 6c    testcase( nCel
2c300 6c 3d 3d 31 20 29 3b 20 20 2f 2a 20 49 6e 76 61  l==1 );  /* Inva
2c310 6c 69 64 20 6b 65 79 20 73 69 7a 65 3a 20 20 30  lid key size:  0
2c320 78 38 30 20 30 78 38 30 20 30 78 30 31 20 2a 2f  x80 0x80 0x01 */
2c330 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63  .          testc
2c340 61 73 65 28 20 6e 43 65 6c 6c 3d 3d 32 20 29 3b  ase( nCell==2 );
2c350 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6c 65 67    /* Minimum leg
2c360 61 6c 20 69 6e 64 65 78 20 6b 65 79 20 73 69 7a  al index key siz
2c370 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  e */.          i
2c380 66 28 20 6e 43 65 6c 6c 3c 32 20 29 7b 0a 20 20  f( nCell<2 ){.  
2c390 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
2c3a0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2c3b0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
2c3c0 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
2c3d0 73 68 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  sh;.          }.
2c3e0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 4b            pCellK
2c3f0 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ey = sqlite3Mall
2c400 6f 63 28 20 6e 43 65 6c 6c 2b 31 38 20 29 3b 0a  oc( nCell+18 );.
2c410 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
2c420 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
2c430 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2c440 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2c450 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
2c460 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
2c470 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2c480 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49         pCur->aiI
2c490 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
2c4a0 3d 20 28 75 31 36 29 69 64 78 3b 0a 20 20 20 20  = (u16)idx;.    
2c4b0 20 20 20 20 20 20 72 63 20 3d 20 61 63 63 65 73        rc = acces
2c4c0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 30  sPayload(pCur, 0
2c4d0 2c 20 6e 43 65 6c 6c 2c 20 28 75 6e 73 69 67 6e  , nCell, (unsign
2c4e0 65 64 20 63 68 61 72 2a 29 70 43 65 6c 6c 4b 65  ed char*)pCellKe
2c4f0 79 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 2);.         
2c500 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2c510 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2c520 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
2c530 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2c540 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
2c550 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2c560 20 20 20 20 20 63 20 3d 20 78 52 65 63 6f 72 64       c = xRecord
2c570 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 2c 20 70  Compare(nCell, p
2c580 43 65 6c 6c 4b 65 79 2c 20 70 49 64 78 4b 65 79  CellKey, pIdxKey
2c590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
2c5a0 69 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b  ite3_free(pCellK
2c5b0 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ey);.        }. 
2c5c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 0a         assert( .
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 28 70 49 64              (pId
2c5e0 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65 21 3d 53  xKey->errCode!=S
2c5f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c  QLITE_CORRUPT ||
2c600 20 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20   c==0).         
2c610 26 26 20 28 70 49 64 78 4b 65 79 2d 3e 65 72 72  && (pIdxKey->err
2c620 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  Code!=SQLITE_NOM
2c630 45 4d 20 7c 7c 20 70 43 75 72 2d 3e 70 42 74 72  EM || pCur->pBtr
2c640 65 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  ee->db->mallocFa
2c650 69 6c 65 64 29 0a 20 20 20 20 20 20 20 20 29 3b  iled).        );
2c660 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3c 30  .        if( c<0
2c670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77   ){.          lw
2c680 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20 20  r = idx+1;.     
2c690 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 30     }else if( c>0
2c6a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 70   ){.          up
2c6b0 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20 20 20 20  r = idx-1;.     
2c6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c6d0 20 20 20 20 61 73 73 65 72 74 28 20 63 3d 3d 30      assert( c==0
2c6e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70   );.          *p
2c6f0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Res = 0;.       
2c700 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2c710 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43 75  K;.          pCu
2c720 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c730 50 61 67 65 5d 20 3d 20 28 75 31 36 29 69 64 78  Page] = (u16)idx
2c740 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2c750 70 49 64 78 4b 65 79 2d 3e 65 72 72 43 6f 64 65  pIdxKey->errCode
2c760 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43   ) rc = SQLITE_C
2c770 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
2c780 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c790 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
2c7a0 20 20 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e          if( lwr>
2c7b0 75 70 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  upr ) break;.   
2c7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72       assert( lwr
2c7d0 2b 75 70 72 3e 3d 30 20 29 3b 0a 20 20 20 20 20  +upr>=0 );.     
2c7e0 20 20 20 69 64 78 20 3d 20 28 6c 77 72 2b 75 70     idx = (lwr+up
2c7f0 72 29 3e 3e 31 3b 20 20 2f 2a 20 69 64 78 20 3d  r)>>1;  /* idx =
2c800 20 28 6c 77 72 2b 75 70 72 29 2f 32 20 2a 2f 0a   (lwr+upr)/2 */.
2c810 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c820 20 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75    assert( lwr==u
2c830 70 72 2b 31 20 7c 7c 20 28 70 50 61 67 65 2d 3e  pr+1 || (pPage->
2c840 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
2c850 2d 3e 6c 65 61 66 29 20 29 3b 0a 20 20 20 20 61  ->leaf) );.    a
2c860 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c870 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
2c880 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
2c890 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2c8a0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
2c8b0 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61  Page]<pCur->apPa
2c8c0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d  ge[pCur->iPage]-
2c8d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20  >nCell );.      
2c8e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2c8f0 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
2c900 69 64 78 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  idx;.      *pRes
2c910 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20 3d   = c;.      rc =
2c920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
2c930 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
2c940 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 6d 6f 76 65  nish;.    }.move
2c950 74 6f 5f 6e 65 78 74 5f 6c 61 79 65 72 3a 0a 20  to_next_layer:. 
2c960 20 20 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67     if( lwr>=pPag
2c970 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
2c980 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
2c990 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2c9a0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2c9b0 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
2c9c0 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
2c9d0 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
2c9e0 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
2c9f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72  ;.    }.    pCur
2ca00 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2ca10 61 67 65 5d 20 3d 20 28 75 31 36 29 6c 77 72 3b  age] = (u16)lwr;
2ca20 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
2ca30 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
2ca40 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
2ca50 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 6d 6f 76  ) break;.  }.mov
2ca60 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 70 43  eto_finish:.  pC
2ca70 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2ca80 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70   0;.  assert( (p
2ca90 43 75 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20  Cur->curFlags & 
2caa0 42 54 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d  BTCF_ValidOvfl)=
2cab0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  =0 );.  return r
2cac0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  c;.}.../*.** Ret
2cad0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
2cae0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
2caf0 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74  inting at an ent
2cb00 72 79 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ry of the table.
2cb10 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20 77 69 6c 6c  .**.** TRUE will
2cb20 20 62 65 20 72 65 74 75 72 6e 65 64 20 61 66 74   be returned aft
2cb30 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  er a call to sql
2cb40 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 29 20  ite3BtreeNext() 
2cb50 6d 6f 76 65 73 0a 2a 2a 20 70 61 73 74 20 74 68  moves.** past th
2cb60 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20  e last entry in 
2cb70 74 68 65 20 74 61 62 6c 65 20 6f 72 20 73 71 6c  the table or sql
2cb80 69 74 65 33 42 74 72 65 65 50 72 65 76 28 29 20  ite3BtreePrev() 
2cb90 6d 6f 76 65 73 20 70 61 73 74 0a 2a 2a 20 74 68  moves past.** th
2cba0 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 20  e first entry.  
2cbb0 54 52 55 45 20 69 73 20 61 6c 73 6f 20 72 65 74  TRUE is also ret
2cbc0 75 72 6e 65 64 20 69 66 20 74 68 65 20 74 61 62  urned if the tab
2cbd0 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
2cbe0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2cbf0 45 6f 66 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Eof(BtCursor *pC
2cc00 75 72 29 7b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20  ur){.  /* TODO: 
2cc10 57 68 61 74 20 69 66 20 74 68 65 20 63 75 72 73  What if the curs
2cc20 6f 72 20 69 73 20 69 6e 20 43 55 52 53 4f 52 5f  or is in CURSOR_
2cc30 52 45 51 55 49 52 45 53 45 45 4b 20 62 75 74 20  REQUIRESEEK but 
2cc40 61 6c 6c 20 74 61 62 6c 65 20 65 6e 74 72 69 65  all table entrie
2cc50 73 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  s.  ** have been
2cc60 20 64 65 6c 65 74 65 64 3f 20 54 68 69 73 20 41   deleted? This A
2cc70 50 49 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20  PI will need to 
2cc80 63 68 61 6e 67 65 20 74 6f 20 72 65 74 75 72 6e  change to return
2cc90 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 20   an error code. 
2cca0 20 2a 2a 20 61 73 20 77 65 6c 6c 20 61 73 20 74   ** as well as t
2ccb0 68 65 20 62 6f 6f 6c 65 61 6e 20 72 65 73 75 6c  he boolean resul
2ccc0 74 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  t value..  */.  
2ccd0 72 65 74 75 72 6e 20 28 43 55 52 53 4f 52 5f 56  return (CURSOR_V
2cce0 41 4c 49 44 21 3d 70 43 75 72 2d 3e 65 53 74 61  ALID!=pCur->eSta
2ccf0 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  te);.}../*.** Ad
2cd00 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f 72  vance the cursor
2cd10 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
2cd20 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
2cd30 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65  se.  If.** succe
2cd40 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a  ssful then set *
2cd50 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20  pRes=0.  If the 
2cd60 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c  cursor.** was al
2cd70 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
2cd80 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
2cd90 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2cda0 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20   before.** this 
2cdb0 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c  routine was call
2cdc0 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ed, then set *pR
2cdd0 65 73 3d 31 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es=1..**.** The 
2cde0 6d 61 69 6e 20 65 6e 74 72 79 20 70 6f 69 6e 74  main entry point
2cdf0 20 69 73 20 73 71 6c 69 74 65 33 42 74 72 65 65   is sqlite3Btree
2ce00 4e 65 78 74 28 29 2e 20 20 54 68 61 74 20 72 6f  Next().  That ro
2ce10 75 74 69 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a  utine is optimiz
2ce20 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f  ed.** for the co
2ce30 6d 6d 6f 6e 20 63 61 73 65 20 6f 66 20 6d 65 72  mmon case of mer
2ce40 65 6c 79 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67  ely incrementing
2ce50 20 74 68 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65   the cell counte
2ce60 72 20 42 74 43 75 72 73 6f 72 2e 61 69 49 64 78  r BtCursor.aiIdx
2ce70 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 65 78 74 20  .** to the next 
2ce80 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72 72  cell on the curr
2ce90 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20 28  ent page.  The (
2cea0 73 6c 6f 77 65 72 29 20 62 74 72 65 65 4e 65 78  slower) btreeNex
2ceb0 74 28 29 20 68 65 6c 70 65 72 0a 2a 2a 20 72 6f  t() helper.** ro
2cec0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2ced0 77 68 65 6e 20 69 74 20 69 73 20 6e 65 63 65 73  when it is neces
2cee0 73 61 72 79 20 74 6f 20 6d 6f 76 65 20 74 6f 20  sary to move to 
2cef0 61 20 64 69 66 66 65 72 65 6e 74 20 70 61 67 65  a different page
2cf00 20 6f 72 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72   or.** to restor
2cf10 65 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 2a 2a  e the cursor..**
2cf20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
2cf30 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 73 65  function will se
2cf40 74 20 2a 70 52 65 73 20 74 6f 20 30 20 6f 72 20  t *pRes to 0 or 
2cf50 31 2e 20 20 54 68 65 20 69 6e 69 74 69 61 6c 20  1.  The initial 
2cf60 2a 70 52 65 73 20 76 61 6c 75 65 0a 2a 2a 20 77  *pRes value.** w
2cf70 69 6c 6c 20 62 65 20 31 20 69 66 20 74 68 65 20  ill be 1 if the 
2cf80 63 75 72 73 6f 72 20 62 65 69 6e 67 20 73 74 65  cursor being ste
2cf90 70 70 65 64 20 63 6f 72 72 65 73 70 6f 6e 64 73  pped corresponds
2cfa0 20 74 6f 20 61 6e 20 53 51 4c 20 69 6e 64 65 78   to an SQL index
2cfb0 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 69 73 20   and.** if this 
2cfc0 72 6f 75 74 69 6e 65 20 63 6f 75 6c 64 20 68 61  routine could ha
2cfd0 76 65 20 62 65 65 6e 20 73 6b 69 70 70 65 64 20  ve been skipped 
2cfe0 69 66 20 74 68 61 74 20 53 51 4c 20 69 6e 64 65  if that SQL inde
2cff0 78 20 68 61 64 20 62 65 65 6e 0a 2a 2a 20 61 20  x had been.** a 
2d000 75 6e 69 71 75 65 20 69 6e 64 65 78 2e 20 20 4f  unique index.  O
2d010 74 68 65 72 77 69 73 65 20 74 68 65 20 63 61 6c  therwise the cal
2d020 6c 65 72 20 77 69 6c 6c 20 68 61 76 65 20 73 65  ler will have se
2d030 74 20 2a 70 52 65 73 20 74 6f 20 7a 65 72 6f 2e  t *pRes to zero.
2d040 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 74 68 65 20  .** Zero is the 
2d050 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 20 54 68 65  common case. The
2d060 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2d070 61 74 69 6f 6e 20 69 73 20 66 72 65 65 20 74 6f  ation is free to
2d080 20 75 73 65 20 74 68 65 0a 2a 2a 20 69 6e 69 74   use the.** init
2d090 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65 20  ial *pRes value 
2d0a0 61 73 20 61 20 68 69 6e 74 20 74 6f 20 69 6d 70  as a hint to imp
2d0b0 72 6f 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  rove performance
2d0c0 2c 20 62 75 74 20 74 68 65 20 63 75 72 72 65 6e  , but the curren
2d0d0 74 0a 2a 2a 20 53 51 4c 69 74 65 20 62 74 72 65  t.** SQLite btre
2d0e0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2d0f0 20 64 6f 65 73 20 6e 6f 74 2e 20 28 4e 6f 74 65   does not. (Note
2d100 20 74 68 61 74 20 74 68 65 20 63 6f 6d 64 62 32   that the comdb2
2d110 20 62 74 72 65 65 0a 2a 2a 20 69 6d 70 6c 65 6d   btree.** implem
2d120 65 6e 74 61 74 69 6f 6e 20 64 6f 65 73 20 75 73  entation does us
2d130 65 20 74 68 69 73 20 68 69 6e 74 2c 20 68 6f 77  e this hint, how
2d140 65 76 65 72 2e 29 0a 2a 2f 0a 73 74 61 74 69 63  ever.).*/.static
2d150 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
2d160 20 69 6e 74 20 62 74 72 65 65 4e 65 78 74 28 42   int btreeNext(B
2d170 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
2d180 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
2d190 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a   rc;.  int idx;.
2d1a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d1b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
2d1c0 73 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28  sorOwnsBtShared(
2d1d0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2d1e0 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78  t( pCur->skipNex
2d1f0 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e 65 53  t==0 || pCur->eS
2d200 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c  tate!=CURSOR_VAL
2d210 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
2d220 2a 70 52 65 73 3d 3d 30 20 29 3b 0a 20 20 69 66  *pRes==0 );.  if
2d230 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d  ( pCur->eState!=
2d240 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
2d250 20 20 20 20 61 73 73 65 72 74 28 20 28 70 43 75      assert( (pCu
2d260 72 2d 3e 63 75 72 46 6c 61 67 73 20 26 20 42 54  r->curFlags & BT
2d270 43 46 5f 56 61 6c 69 64 4f 76 66 6c 29 3d 3d 30  CF_ValidOvfl)==0
2d280 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 73   );.    rc = res
2d290 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2d2a0 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66  on(pCur);.    if
2d2b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d2c0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2d2d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
2d2e0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
2d2f0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2d300 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
2d310 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
2d320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
2d330 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73  .    if( pCur->s
2d340 6b 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  kipNext ){.     
2d350 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
2d360 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
2d370 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74  LID || pCur->eSt
2d380 61 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50  ate==CURSOR_SKIP
2d390 4e 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43  NEXT );.      pC
2d3a0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
2d3b0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20  SOR_VALID;.     
2d3c0 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e   if( pCur->skipN
2d3d0 65 78 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ext>0 ){.       
2d3e0 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20   pCur->skipNext 
2d3f0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 0;.        ret
2d400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75       }.      pCu
2d420 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b  r->skipNext = 0;
2d430 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
2d440 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d450 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
2d460 0a 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72 2d  .  idx = ++pCur-
2d470 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
2d480 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
2d490 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
2d4a0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61 74  .  /* If the dat
2d4b0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 63 6f  abase file is co
2d4c0 72 72 75 70 74 2c 20 69 74 20 69 73 20 70 6f 73  rrupt, it is pos
2d4d0 73 69 62 6c 65 20 66 6f 72 20 74 68 65 20 76 61  sible for the va
2d4e0 6c 75 65 20 6f 66 20 69 64 78 20 0a 20 20 2a 2a  lue of idx .  **
2d4f0 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 20 68   to be invalid h
2d500 65 72 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e  ere. This can on
2d510 6c 79 20 6f 63 63 75 72 20 69 66 20 61 20 73 65  ly occur if a se
2d520 63 6f 6e 64 20 63 75 72 73 6f 72 20 6d 6f 64 69  cond cursor modi
2d530 66 69 65 73 0a 20 20 2a 2a 20 74 68 65 20 70 61  fies.  ** the pa
2d540 67 65 20 77 68 69 6c 65 20 63 75 72 73 6f 72 20  ge while cursor 
2d550 70 43 75 72 20 69 73 20 68 6f 6c 64 69 6e 67 20  pCur is holding 
2d560 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69  a reference to i
2d570 74 2e 20 57 68 69 63 68 20 63 61 6e 0a 20 20 2a  t. Which can.  *
2d580 2a 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  * only happen if
2d590 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
2d5a0 20 63 6f 72 72 75 70 74 20 69 6e 20 73 75 63 68   corrupt in such
2d5b0 20 61 20 77 61 79 20 61 73 20 74 6f 20 6c 69 6e   a way as to lin
2d5c0 6b 20 74 68 65 0a 20 20 2a 2a 20 70 61 67 65 20  k the.  ** page 
2d5d0 69 6e 74 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f  into more than o
2d5e0 6e 65 20 62 2d 74 72 65 65 20 73 74 72 75 63 74  ne b-tree struct
2d5f0 75 72 65 2e 20 2a 2f 0a 20 20 74 65 73 74 63 61  ure. */.  testca
2d600 73 65 28 20 69 64 78 3e 70 50 61 67 65 2d 3e 6e  se( idx>pPage->n
2d610 43 65 6c 6c 20 29 3b 0a 0a 20 20 69 66 28 20 69  Cell );..  if( i
2d620 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx>=pPage->nCell
2d630 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
2d640 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2d650 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
2d660 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74  ld(pCur, get4byt
2d670 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2d680 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2d690 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  +8]));.      if(
2d6a0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
2d6b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 6f  .      return mo
2d6c0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
2d6d0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  r);.    }.    do
2d6e0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 75 72  {.      if( pCur
2d6f0 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20  ->iPage==0 ){.  
2d700 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
2d710 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
2d720 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2d730 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
2d740 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2d750 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d760 6d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75  moveToParent(pCu
2d770 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  r);.      pPage 
2d780 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2d790 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
2d7a0 20 7d 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 61   }while( pCur->a
2d7b0 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65  iIdx[pCur->iPage
2d7c0 5d 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  ]>=pPage->nCell 
2d7d0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
2d7e0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
2d7f0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2d800 42 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20  BtreeNext(pCur, 
2d810 70 52 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pRes);.    }else
2d820 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
2d830 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2d840 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d    }.  if( pPage-
2d850 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
2d860 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2d870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d880 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  rn moveToLeftmos
2d890 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 7d 0a 69  t(pCur);.  }.}.i
2d8a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e  nt sqlite3BtreeN
2d8b0 65 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ext(BtCursor *pC
2d8c0 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
2d8d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2d8e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
2d8f0 6f 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70  orOwnsBtShared(p
2d900 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
2d910 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61  ( pRes!=0 );.  a
2d920 73 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20  ssert( *pRes==0 
2d930 7c 7c 20 2a 70 52 65 73 3d 3d 31 20 29 3b 0a 20  || *pRes==1 );. 
2d940 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 73   assert( pCur->s
2d950 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c 20 70 43  kipNext==0 || pC
2d960 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d970 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 43  OR_VALID );.  pC
2d980 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
2d990 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72 46   0;.  pCur->curF
2d9a0 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f 56  lags &= ~(BTCF_V
2d9b0 61 6c 69 64 4e 4b 65 79 7c 42 54 43 46 5f 56 61  alidNKey|BTCF_Va
2d9c0 6c 69 64 4f 76 66 6c 29 3b 0a 20 20 2a 70 52 65  lidOvfl);.  *pRe
2d9d0 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 43 75  s = 0;.  if( pCu
2d9e0 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f  r->eState!=CURSO
2d9f0 52 5f 56 41 4c 49 44 20 29 20 72 65 74 75 72 6e  R_VALID ) return
2da00 20 62 74 72 65 65 4e 65 78 74 28 70 43 75 72 2c   btreeNext(pCur,
2da10 20 70 52 65 73 29 3b 0a 20 20 70 50 61 67 65 20   pRes);.  pPage 
2da20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
2da30 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 69  Cur->iPage];.  i
2da40 66 28 20 28 2b 2b 70 43 75 72 2d 3e 61 69 49 64  f( (++pCur->aiId
2da50 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3e  x[pCur->iPage])>
2da60 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
2da70 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78  .    pCur->aiIdx
2da80 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d 3b  [pCur->iPage]--;
2da90 0a 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65  .    return btre
2daa0 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52 65 73  eNext(pCur, pRes
2dab0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
2dac0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2dad0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2dae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2daf0 65 74 75 72 6e 20 6d 6f 76 65 54 6f 4c 65 66 74  eturn moveToLeft
2db00 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  most(pCur);.  }.
2db10 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68  }../*.** Step th
2db20 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20  e cursor to the 
2db30 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76  back to the prev
2db40 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68  ious entry in th
2db50 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a  e database.  If.
2db60 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 74 68  ** successful th
2db70 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20  en set *pRes=0. 
2db80 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a   If the cursor.*
2db90 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f  * was already po
2dba0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69  inting to the fi
2dbb0 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
2dbc0 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
2dbd0 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
2dbe0 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65   was called, the
2dbf0 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a  n set *pRes=1..*
2dc00 2a 0a 2a 2a 20 54 68 65 20 6d 61 69 6e 20 65 6e  *.** The main en
2dc10 74 72 79 20 70 6f 69 6e 74 20 69 73 20 73 71 6c  try point is sql
2dc20 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2dc30 73 28 29 2e 20 20 54 68 61 74 20 72 6f 75 74 69  s().  That routi
2dc40 6e 65 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 0a  ne is optimized.
2dc50 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f  ** for the commo
2dc60 6e 20 63 61 73 65 20 6f 66 20 6d 65 72 65 6c 79  n case of merely
2dc70 20 64 65 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   decrementing th
2dc80 65 20 63 65 6c 6c 20 63 6f 75 6e 74 65 72 20 42  e cell counter B
2dc90 74 43 75 72 73 6f 72 2e 61 69 49 64 78 0a 2a 2a  tCursor.aiIdx.**
2dca0 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
2dcb0 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20 63 75 72   cell on the cur
2dcc0 72 65 6e 74 20 70 61 67 65 2e 20 20 54 68 65 20  rent page.  The 
2dcd0 28 73 6c 6f 77 65 72 29 20 62 74 72 65 65 50 72  (slower) btreePr
2dce0 65 76 69 6f 75 73 28 29 0a 2a 2a 20 68 65 6c 70  evious().** help
2dcf0 65 72 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  er routine is ca
2dd00 6c 6c 65 64 20 77 68 65 6e 20 69 74 20 69 73 20  lled when it is 
2dd10 6e 65 63 65 73 73 61 72 79 20 74 6f 20 6d 6f 76  necessary to mov
2dd20 65 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  e to a different
2dd30 20 70 61 67 65 0a 2a 2a 20 6f 72 20 74 6f 20 72   page.** or to r
2dd40 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2dd50 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
2dd60 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 77 69  ling function wi
2dd70 6c 6c 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ll set *pRes to 
2dd80 30 20 6f 72 20 31 2e 20 20 54 68 65 20 69 6e 69  0 or 1.  The ini
2dd90 74 69 61 6c 20 2a 70 52 65 73 20 76 61 6c 75 65  tial *pRes value
2dda0 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 31 20 69 66  .** will be 1 if
2ddb0 20 74 68 65 20 63 75 72 73 6f 72 20 62 65 69 6e   the cursor bein
2ddc0 67 20 73 74 65 70 70 65 64 20 63 6f 72 72 65 73  g stepped corres
2ddd0 70 6f 6e 64 73 20 74 6f 20 61 6e 20 53 51 4c 20  ponds to an SQL 
2dde0 69 6e 64 65 78 20 61 6e 64 0a 2a 2a 20 69 66 20  index and.** if 
2ddf0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 75  this routine cou
2de00 6c 64 20 68 61 76 65 20 62 65 65 6e 20 73 6b 69  ld have been ski
2de10 70 70 65 64 20 69 66 20 74 68 61 74 20 53 51 4c  pped if that SQL
2de20 20 69 6e 64 65 78 20 68 61 64 20 62 65 65 6e 0a   index had been.
2de30 2a 2a 20 61 20 75 6e 69 71 75 65 20 69 6e 64 65  ** a unique inde
2de40 78 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  x.  Otherwise th
2de50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 68 61  e caller will ha
2de60 76 65 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  ve set *pRes to 
2de70 7a 65 72 6f 2e 0a 2a 2a 20 5a 65 72 6f 20 69 73  zero..** Zero is
2de80 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
2de90 2e 20 54 68 65 20 62 74 72 65 65 20 69 6d 70 6c  . The btree impl
2dea0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73 20 66 72  ementation is fr
2deb0 65 65 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  ee to use the.**
2dec0 20 69 6e 69 74 69 61 6c 20 2a 70 52 65 73 20 76   initial *pRes v
2ded0 61 6c 75 65 20 61 73 20 61 20 68 69 6e 74 20 74  alue as a hint t
2dee0 6f 20 69 6d 70 72 6f 76 65 20 70 65 72 66 6f 72  o improve perfor
2def0 6d 61 6e 63 65 2c 20 62 75 74 20 74 68 65 20 63  mance, but the c
2df00 75 72 72 65 6e 74 0a 2a 2a 20 53 51 4c 69 74 65  urrent.** SQLite
2df10 20 62 74 72 65 65 20 69 6d 70 6c 65 6d 65 6e 74   btree implement
2df20 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 20  ation does not. 
2df30 28 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63  (Note that the c
2df40 6f 6d 64 62 32 20 62 74 72 65 65 0a 2a 2a 20 69  omdb2 btree.** i
2df50 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 6f  mplementation do
2df60 65 73 20 75 73 65 20 74 68 69 73 20 68 69 6e 74  es use this hint
2df70 2c 20 68 6f 77 65 76 65 72 2e 29 0a 2a 2f 0a 73  , however.).*/.s
2df80 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
2df90 4e 4c 49 4e 45 20 69 6e 74 20 62 74 72 65 65 50  NLINE int btreeP
2dfa0 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
2dfb0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
2dfc0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2dfd0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
2dfe0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
2dff0 72 4f 77 6e 73 42 74 53 68 61 72 65 64 28 70 43  rOwnsBtShared(pC
2e000 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
2e010 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 61 73   pRes!=0 );.  as
2e020 73 65 72 74 28 20 2a 70 52 65 73 3d 3d 30 20 29  sert( *pRes==0 )
2e030 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e040 2d 3e 73 6b 69 70 4e 65 78 74 3d 3d 30 20 7c 7c  ->skipNext==0 ||
2e050 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2e060 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
2e070 20 61 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e   assert( (pCur->
2e080 63 75 72 46 6c 61 67 73 20 26 20 28 42 54 43 46  curFlags & (BTCF
2e090 5f 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c  _AtLast|BTCF_Val
2e0a0 69 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69  idOvfl|BTCF_Vali
2e0b0 64 4e 4b 65 79 29 29 3d 3d 30 20 29 3b 0a 20 20  dNKey))==0 );.  
2e0c0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 6e  assert( pCur->in
2e0d0 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  fo.nSize==0 );. 
2e0e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2e0f0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2e100 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 73 74  ){.    rc = rest
2e110 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2e120 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28  n(pCur);.    if(
2e130 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e140 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
2e150 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
2e160 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
2e170 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
2e180 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
2e190 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
2e1a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
2e1b0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b      if( pCur->sk
2e1c0 69 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  ipNext ){.      
2e1d0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
2e1e0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
2e1f0 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
2e200 74 65 3d 3d 43 55 52 53 4f 52 5f 53 4b 49 50 4e  te==CURSOR_SKIPN
2e210 45 58 54 20 29 3b 0a 20 20 20 20 20 20 70 43 75  EXT );.      pCu
2e220 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
2e230 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 20 20  OR_VALID;.      
2e240 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e 65  if( pCur->skipNe
2e250 78 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  xt<0 ){.        
2e260 70 43 75 72 2d 3e 73 6b 69 70 4e 65 78 74 20 3d  pCur->skipNext =
2e270 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
2e280 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2e290 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
2e2a0 2d 3e 73 6b 69 70 4e 65 78 74 20 3d 20 30 3b 0a  ->skipNext = 0;.
2e2b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
2e2c0 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
2e2d0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
2e2e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2e2f0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2e300 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2e310 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70  .    int idx = p
2e320 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2e330 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20  >iPage];.    rc 
2e340 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
2e350 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e  ur, get4byte(fin
2e360 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  dCell(pPage, idx
2e370 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  )));.    if( rc 
2e380 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
2e390 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
2e3a0 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
2e3b0 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
2e3c0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
2e3d0 72 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a  r->iPage]==0 ){.
2e3e0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
2e3f0 69 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  iPage==0 ){.    
2e400 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
2e410 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2e420 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
2e430 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
2e440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 6f        }.      mo
2e460 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
2e470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
2e480 72 74 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  rt( pCur->info.n
2e490 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Size==0 );.    a
2e4a0 73 73 65 72 74 28 20 28 70 43 75 72 2d 3e 63 75  ssert( (pCur->cu
2e4b0 72 46 6c 61 67 73 20 26 20 28 42 54 43 46 5f 56  rFlags & (BTCF_V
2e4c0 61 6c 69 64 4f 76 66 6c 29 29 3d 3d 30 20 29 3b  alidOvfl))==0 );
2e4d0 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  ..    pCur->aiId
2e4e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 2d  x[pCur->iPage]--
2e4f0 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20 70 43  ;.    pPage = pC
2e500 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2e510 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
2e520 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26   pPage->intKey &
2e530 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
2e540 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2e550 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2e560 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
2e570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e580 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e590 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e5a0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
2e5b0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
2e5c0 73 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  s(BtCursor *pCur
2e5d0 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
2e5e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 4f 77  assert( cursorOw
2e5f0 6e 73 42 74 53 68 61 72 65 64 28 70 43 75 72 29  nsBtShared(pCur)
2e600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52   );.  assert( pR
2e610 65 73 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  es!=0 );.  asser
2e620 74 28 20 2a 70 52 65 73 3d 3d 30 20 7c 7c 20 2a  t( *pRes==0 || *
2e630 70 52 65 73 3d 3d 31 20 29 3b 0a 20 20 61 73 73  pRes==1 );.  ass
2e640 65 72 74 28 20 70 43 75 72 2d 3e 73 6b 69 70 4e  ert( pCur->skipN
2e650 65 78 74 3d 3d 30 20 7c 7c 20 70 43 75 72 2d 3e  ext==0 || pCur->
2e660 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2e670 41 4c 49 44 20 29 3b 0a 20 20 2a 70 52 65 73 20  ALID );.  *pRes 
2e680 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 63 75 72  = 0;.  pCur->cur
2e690 46 6c 61 67 73 20 26 3d 20 7e 28 42 54 43 46 5f  Flags &= ~(BTCF_
2e6a0 41 74 4c 61 73 74 7c 42 54 43 46 5f 56 61 6c 69  AtLast|BTCF_Vali
2e6b0 64 4f 76 66 6c 7c 42 54 43 46 5f 56 61 6c 69 64  dOvfl|BTCF_Valid
2e6c0 4e 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 69  NKey);.  pCur->i
2e6d0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
2e6e0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2e6f0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 0a  e!=CURSOR_VALID.
2e700 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 69 49 64     || pCur->aiId
2e710 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3d 3d  x[pCur->iPage]==
2e720 30 0a 20 20 20 7c 7c 20 70 43 75 72 2d 3e 61 70  0.   || pCur->ap
2e730 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
2e740 5d 2d 3e 6c 65 61 66 3d 3d 30 0a 20 20 29 7b 0a  ]->leaf==0.  ){.
2e750 20 20 20 20 72 65 74 75 72 6e 20 62 74 72 65 65      return btree
2e760 50 72 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70  Previous(pCur, p
2e770 52 65 73 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72  Res);.  }.  pCur
2e780 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2e790 61 67 65 5d 2d 2d 3b 0a 20 20 72 65 74 75 72 6e  age]--;.  return
2e7a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2e7b0 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  *.** Allocate a 
2e7c0 6e 65 77 20 70 61 67 65 20 66 72 6f 6d 20 74 68  new page from th
2e7d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2e7e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70  .**.** The new p
2e7f0 61 67 65 20 69 73 20 6d 61 72 6b 65 64 20 61 73  age is marked as
2e800 20 64 69 72 74 79 2e 20 20 28 49 6e 20 6f 74 68   dirty.  (In oth
2e810 65 72 20 77 6f 72 64 73 2c 20 73 71 6c 69 74 65  er words, sqlite
2e820 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
2e830 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
2e840 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
2e850 6e 65 77 20 70 61 67 65 2e 29 20 20 54 68 65 20  new page.)  The 
2e860 6e 65 77 20 70 61 67 65 20 68 61 73 20 61 6c 73  new page has als
2e870 6f 0a 2a 2a 20 62 65 65 6e 20 72 65 66 65 72 65  o.** been refere
2e880 6e 63 65 64 20 61 6e 64 20 74 68 65 20 63 61 6c  nced and the cal
2e890 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  ling routine is 
2e8a0 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
2e8b0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74  calling.** sqlit
2e8c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 6f  e3PagerUnref() o
2e8d0 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 77  n the new page w
2e8e0 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a  hen it is done..
2e8f0 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  **.** SQLITE_OK 
2e900 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73  is returned on s
2e910 75 63 63 65 73 73 2e 20 20 41 6e 79 20 6f 74 68  uccess.  Any oth
2e920 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  er return value 
2e930 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20  indicates.** an 
2e940 65 72 72 6f 72 2e 20 20 2a 70 70 50 61 67 65 20  error.  *ppPage 
2e950 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69  is set to NULL i
2e960 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  n the event of a
2e970 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  n error..**.** I
2e980 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
2e990 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
2e9a0 30 2c 20 74 68 65 6e 20 61 6e 20 65 66 66 6f 72  0, then an effor
2e9b0 74 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a  t is made to .**
2e9c0 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63   locate a page c
2e9d0 6c 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65  lose to the page
2e9e0 20 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22   number "nearby"
2e9f0 2e 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75  .  This can be u
2ea00 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74  sed in an.** att
2ea10 65 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c  empt to keep rel
2ea20 61 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65  ated pages close
2ea30 20 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69   to each other i
2ea40 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2ea50 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ile,.** which in
2ea60 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64   turn can make d
2ea70 61 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66  atabase access f
2ea80 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
2ea90 74 68 65 20 65 4d 6f 64 65 20 70 61 72 61 6d 65  the eMode parame
2eaa0 74 65 72 20 69 73 20 42 54 41 4c 4c 4f 43 5f 45  ter is BTALLOC_E
2eab0 58 41 43 54 20 61 6e 64 20 74 68 65 20 6e 65 61  XACT and the nea
2eac0 72 62 79 20 70 61 67 65 20 65 78 69 73 74 73 0a  rby page exists.
2ead0 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e 20 74  ** anywhere on t
2eae0 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74 68  he free-list, th
2eaf0 65 6e 20 69 74 20 69 73 20 67 75 61 72 61 6e 74  en it is guarant
2eb00 65 65 64 20 74 6f 20 62 65 20 72 65 74 75 72 6e  eed to be return
2eb10 65 64 2e 20 20 49 66 0a 2a 2a 20 65 4d 6f 64 65  ed.  If.** eMode
2eb20 20 69 73 20 42 54 41 4c 4c 4f 43 5f 4c 54 20 74   is BTALLOC_LT t
2eb30 68 65 6e 20 74 68 65 20 70 61 67 65 20 72 65 74  hen the page ret
2eb40 75 72 6e 65 64 20 77 69 6c 6c 20 62 65 20 6c 65  urned will be le
2eb50 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
2eb60 0a 2a 2a 20 74 6f 20 6e 65 61 72 62 79 20 69 66  .** to nearby if
2eb70 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 20 65   any such page e
2eb80 78 69 73 74 73 2e 20 20 49 66 20 65 4d 6f 64 65  xists.  If eMode
2eb90 20 69 73 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20   is BTALLOC_ANY 
2eba0 74 68 65 6e 20 74 68 65 72 65 0a 2a 2a 20 61 72  then there.** ar
2ebb0 65 20 6e 6f 20 72 65 73 74 72 69 63 74 69 6f 6e  e no restriction
2ebc0 73 20 6f 6e 20 77 68 69 63 68 20 70 61 67 65 20  s on which page 
2ebd0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
2ebe0 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
2ebf0 61 74 65 42 74 72 65 65 50 61 67 65 28 0a 20 20  ateBtreePage(.  
2ec00 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
2ec10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
2ec20 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ree */.  MemPage
2ec30 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20   **ppPage,      
2ec40 2f 2a 20 53 74 6f 72 65 20 70 6f 69 6e 74 65 72  /* Store pointer
2ec50 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   to the allocate
2ec60 64 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  d page here */. 
2ec70 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 20 20   Pgno *pPgno,   
2ec80 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65          /* Store
2ec90 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
2eca0 20 68 65 72 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   here */.  Pgno 
2ecb0 6e 65 61 72 62 79 2c 20 20 20 20 20 20 20 20 20  nearby,         
2ecc0 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
2ecd0 61 20 70 61 67 65 20 6e 65 61 72 20 74 68 69 73  a page near this
2ece0 20 6f 6e 65 20 2a 2f 0a 20 20 75 38 20 65 4d 6f   one */.  u8 eMo
2ecf0 64 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  de              
2ed00 20 2f 2a 20 42 54 41 4c 4c 4f 43 5f 45 58 41 43   /* BTALLOC_EXAC
2ed10 54 2c 20 42 54 41 4c 4c 4f 43 5f 4c 54 2c 20 6f  T, BTALLOC_LT, o
2ed20 72 20 42 54 41 4c 4c 4f 43 5f 41 4e 59 20 2a 2f  r BTALLOC_ANY */
2ed30 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2ed40 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72 63 3b  Page1;.  int rc;
2ed50 0a 20 20 75 33 32 20 6e 3b 20 20 20 20 20 2f 2a  .  u32 n;     /*
2ed60 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2ed70 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2ed80 20 2a 2f 0a 20 20 75 33 32 20 6b 3b 20 20 20 20   */.  u32 k;    
2ed90 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
2eda0 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  aves on the trun
2edb0 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  k of the freelis
2edc0 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
2edd0 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 4d 65  pTrunk = 0;.  Me
2ede0 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72 75 6e  mPage *pPrevTrun
2edf0 6b 20 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 6d 78  k = 0;.  Pgno mx
2ee00 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 54 6f 74  Page;     /* Tot
2ee10 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  al size of the d
2ee20 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2ee30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ee40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2ee50 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2ee60 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 42 54  ssert( eMode==BT
2ee70 41 4c 4c 4f 43 5f 41 4e 59 20 7c 7c 20 28 6e 65  ALLOC_ANY || (ne
2ee80 61 72 62 79 3e 30 20 26 26 20 49 66 4e 6f 74 4f  arby>0 && IfNotO
2ee90 6d 69 74 41 56 28 70 42 74 2d 3e 61 75 74 6f 56  mitAV(pBt->autoV
2eea0 61 63 75 75 6d 29 29 20 29 3b 0a 20 20 70 50 61  acuum)) );.  pPa
2eeb0 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ge1 = pBt->pPage
2eec0 31 3b 0a 20 20 6d 78 50 61 67 65 20 3d 20 62 74  1;.  mxPage = bt
2eed0 72 65 65 50 61 67 65 63 6f 75 6e 74 28 70 42 74  reePagecount(pBt
2eee0 29 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  );.  /* EVIDENCE
2eef0 2d 4f 46 3a 20 52 2d 30 35 31 31 39 2d 30 32 36  -OF: R-05119-026
2ef00 33 37 20 54 68 65 20 34 2d 62 79 74 65 20 62 69  37 The 4-byte bi
2ef10 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
2ef20 20 61 74 20 6f 66 66 73 65 74 20 33 36 0a 20 20   at offset 36.  
2ef30 2a 2a 20 73 74 6f 72 65 73 20 73 74 6f 72 65 73  ** stores stores
2ef40 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
2ef50 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
2ef60 65 20 66 72 65 65 6c 69 73 74 2e 20 2a 2f 0a 20  e freelist. */. 
2ef70 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70   n = get4byte(&p
2ef80 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
2ef90 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6e  );.  testcase( n
2efa0 3d 3d 6d 78 50 61 67 65 2d 31 20 29 3b 0a 20 20  ==mxPage-1 );.  
2efb0 69 66 28 20 6e 3e 3d 6d 78 50 61 67 65 20 29 7b  if( n>=mxPage ){
2efc0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2efd0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
2efe0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29  .  }.  if( n>0 )
2eff0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61  {.    /* There a
2f000 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  re pages on the 
2f010 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73 65  freelist.  Reuse
2f020 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
2f030 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  ges. */.    Pgno
2f040 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20   iTrunk;.    u8 
2f050 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 20  searchList = 0; 
2f060 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  /* If the free-l
2f070 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61 72  ist must be sear
2f080 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62 79  ched for 'nearby
2f090 27 20 2a 2f 0a 20 20 20 20 75 33 32 20 6e 53 65  ' */.    u32 nSe
2f0a0 61 72 63 68 20 3d 20 30 3b 20 20 20 2f 2a 20 43  arch = 0;   /* C
2f0b0 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
2f0c0 65 72 20 6f 66 20 73 65 61 72 63 68 20 61 74 74  er of search att
2f0d0 65 6d 70 74 73 20 2a 2f 0a 20 20 20 20 0a 20 20  empts */.    .  
2f0e0 20 20 2f 2a 20 49 66 20 65 4d 6f 64 65 3d 3d 42    /* If eMode==B
2f0f0 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 61 6e 64  TALLOC_EXACT and
2f100 20 61 20 71 75 65 72 79 20 6f 66 20 74 68 65 20   a query of the 
2f110 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20  pointer-map.    
2f120 2a 2a 20 73 68 6f 77 73 20 74 68 61 74 20 74 68  ** shows that th
2f130 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27 20  e page 'nearby' 
2f140 69 73 20 73 6f 6d 65 77 68 65 72 65 20 6f 6e 20  is somewhere on 
2f150 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20 74  the free-list, t
2f160 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 65  hen.    ** the e
2f170 6e 74 69 72 65 2d 6c 69 73 74 20 77 69 6c 6c 20  ntire-list will 
2f180 62 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20  be searched for 
2f190 74 68 61 74 20 70 61 67 65 2e 0a 20 20 20 20 2a  that page..    *
2f1a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
2f1b0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2f1c0 0a 20 20 20 20 69 66 28 20 65 4d 6f 64 65 3d 3d  .    if( eMode==
2f1d0 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 20 29 7b  BTALLOC_EXACT ){
2f1e0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62  .      if( nearb
2f1f0 79 3c 3d 6d 78 50 61 67 65 20 29 7b 0a 20 20 20  y<=mxPage ){.   
2f200 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2f210 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
2f220 65 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20  earby>0 );.     
2f230 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
2f240 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20  autoVacuum );.  
2f250 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2f260 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
2f270 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
2f280 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
2f290 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f2a0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
2f2b0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
2f2c0 20 20 20 20 20 20 20 20 20 20 73 65 61 72 63 68            search
2f2d0 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  List = 1;.      
2f2e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f2f0 7d 65 6c 73 65 20 69 66 28 20 65 4d 6f 64 65 3d  }else if( eMode=
2f300 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a 20  =BTALLOC_LE ){. 
2f310 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20       searchList 
2f320 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
2f330 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  f..    /* Decrem
2f340 65 6e 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73  ent the free-lis
2f350 74 20 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65  t count by 1. Se
2f360 74 20 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20  t iTrunk to the 
2f370 69 6e 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20  index of the.   
2f380 20 2a 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c   ** first free-l
2f390 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
2f3a0 69 50 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e  iPrevTrunk is in
2f3b0 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a  itially 1..    *
2f3c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
2f3d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2f3e0 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  ge1->pDbPage);. 
2f3f0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f400 72 6e 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62  rn rc;.    put4b
2f410 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
2f420 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20  ta[36], n-1);.. 
2f430 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77     /* The code w
2f440 69 74 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20  ithin this loop 
2f450 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65  is run only once
2f460 20 69 66 20 74 68 65 20 27 73 65 61 72 63 68 4c   if the 'searchL
2f470 69 73 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20  ist' variable.  
2f480 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65    ** is not true
2f490 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20  . Otherwise, it 
2f4a0 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61  runs once for ea
2f4b0 63 68 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e  ch trunk-page on
2f4c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65   the.    ** free
2f4d0 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20  -list until the 
2f4e0 70 61 67 65 20 27 6e 65 61 72 62 79 27 20 69 73  page 'nearby' is
2f4f0 20 6c 6f 63 61 74 65 64 20 28 65 4d 6f 64 65 3d   located (eMode=
2f500 3d 42 54 41 4c 4c 4f 43 5f 45 58 41 43 54 29 0a  =BTALLOC_EXACT).
2f510 20 20 20 20 2a 2a 20 6f 72 20 75 6e 74 69 6c 20      ** or until 
2f520 61 20 70 61 67 65 20 6c 65 73 73 20 74 68 61 6e  a page less than
2f530 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f 63   'nearby' is loc
2f540 61 74 65 64 20 28 65 4d 6f 64 65 3d 3d 42 54 41  ated (eMode==BTA
2f550 4c 4c 4f 43 5f 4c 54 29 0a 20 20 20 20 2a 2f 0a  LLOC_LT).    */.
2f560 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70      do {.      p
2f570 50 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75  PrevTrunk = pTru
2f580 6e 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  nk;.      if( pP
2f590 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2f5a0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
2f5b0 4f 46 3a 20 52 2d 30 31 35 30 36 2d 31 31 30 35  OF: R-01506-1105
2f5c0 33 20 54 68 65 20 66 69 72 73 74 20 69 6e 74 65  3 The first inte
2f5d0 67 65 72 20 6f 6e 20 61 20 66 72 65 65 6c 69 73  ger on a freelis
2f5e0 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20  t trunk page.   
2f5f0 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 70       ** is the p
2f600 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2f610 65 20 6e 65 78 74 20 66 72 65 65 6c 69 73 74 20  e next freelist 
2f620 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68  trunk page in th
2f630 65 20 6c 69 73 74 20 6f 72 0a 20 20 20 20 20 20  e list or.      
2f640 20 20 2a 2a 20 7a 65 72 6f 20 69 66 20 74 68 69    ** zero if thi
2f650 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 66 72  s is the last fr
2f660 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
2f670 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 54  e. */.        iT
2f680 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
2f690 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
2f6a0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
2f6b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2f6c0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
2f6d0 39 38 34 31 2d 31 33 37 39 38 20 54 68 65 20 34  9841-13798 The 4
2f6e0 2d 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e  -byte big-endian
2f6f0 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73   integer at offs
2f700 65 74 20 33 32 0a 20 20 20 20 20 20 20 20 2a 2a  et 32.        **
2f710 20 73 74 6f 72 65 73 20 74 68 65 20 70 61 67 65   stores the page
2f720 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
2f730 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
2f740 20 66 72 65 65 6c 69 73 74 2c 20 6f 72 20 7a 65   freelist, or ze
2f750 72 6f 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  ro if.        **
2f760 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69 73   the freelist is
2f770 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
2f780 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
2f790 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
2f7a0 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20  ata[32]);.      
2f7b0 7d 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  }.      testcase
2f7c0 28 20 69 54 72 75 6e 6b 3d 3d 6d 78 50 61 67 65  ( iTrunk==mxPage
2f7d0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54   );.      if( iT
2f7e0 72 75 6e 6b 3e 6d 78 50 61 67 65 20 7c 7c 20 6e  runk>mxPage || n
2f7f0 53 65 61 72 63 68 2b 2b 20 3e 20 6e 20 29 7b 0a  Search++ > n ){.
2f800 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2f810 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
2f820 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f830 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72 65         rc = btre
2f840 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28 70  eGetUnusedPage(p
2f850 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
2f860 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  unk, 0);.      }
2f870 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2f880 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
2f890 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
2f8a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
2f8b0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  age;.      }.   
2f8c0 20 20 20 61 73 73 65 72 74 28 20 70 54 72 75 6e     assert( pTrun
2f8d0 6b 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  k!=0 );.      as
2f8e0 73 65 72 74 28 20 70 54 72 75 6e 6b 2d 3e 61 44  sert( pTrunk->aD
2f8f0 61 74 61 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ata!=0 );.      
2f900 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
2f910 52 2d 31 33 35 32 33 2d 30 34 33 39 34 20 54 68  R-13523-04394 Th
2f920 65 20 73 65 63 6f 6e 64 20 69 6e 74 65 67 65 72  e second integer
2f930 20 6f 6e 20 61 20 66 72 65 65 6c 69 73 74 20 74   on a freelist t
2f940 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 20 20  runk page.      
2f950 2a 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ** is the number
2f960 20 6f 66 20 6c 65 61 66 20 70 61 67 65 20 70 6f   of leaf page po
2f970 69 6e 74 65 72 73 20 74 6f 20 66 6f 6c 6c 6f 77  inters to follow
2f980 2e 20 2a 2f 0a 20 20 20 20 20 20 6b 20 3d 20 67  . */.      k = g
2f990 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
2f9a0 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20  >aData[4]);.    
2f9b0 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21 73    if( k==0 && !s
2f9c0 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20 20  earchList ){.   
2f9d0 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e       /* The trun
2f9e0 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73 20  k has no leaves 
2f9f0 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73 20  and the list is 
2fa00 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63 68  not being search
2fa10 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ed. .        ** 
2fa20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 74  So extract the t
2fa30 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c 66  runk page itself
2fa40 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20 74   and use it as t
2fa50 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20 20  he newly .      
2fa60 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
2fa70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  age */.        a
2fa80 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75 6e  ssert( pPrevTrun
2fa90 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  k==0 );.        
2faa0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2fab0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
2fac0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
2fad0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2fae0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
2faf0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
2fb00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a       }.        *
2fb10 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a  pPgno = iTrunk;.
2fb20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2fb30 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2fb40 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2fb50 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2fb60 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2fb70 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72 75  nk;.        pTru
2fb80 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
2fb90 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
2fba0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
2fbb0 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
2fbc0 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
2fbd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
2fbe0 66 28 20 6b 3e 28 75 33 32 29 28 70 42 74 2d 3e  f( k>(u32)(pBt->
2fbf0 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 32  usableSize/4 - 2
2fc00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
2fc10 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
2fc20 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
2fc30 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
2fc40 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
2fc50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
2fc60 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
2fc70 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
2fc80 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
2fc90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2fca0 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
2fcb0 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
2fcc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
2fcd0 28 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20  (nearby==iTrunk 
2fce0 7c 7c 20 28 69 54 72 75 6e 6b 3c 6e 65 61 72 62  || (iTrunk<nearb
2fcf0 79 20 26 26 20 65 4d 6f 64 65 3d 3d 42 54 41 4c  y && eMode==BTAL
2fd00 4c 4f 43 5f 4c 45 29 29 20 0a 20 20 20 20 20 20  LOC_LE)) .      
2fd10 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2fd20 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e 67 20  e list is being 
2fd30 73 65 61 72 63 68 65 64 20 61 6e 64 20 74 68 69  searched and thi
2fd40 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20  s trunk page is 
2fd50 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20 20  the page.       
2fd60 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c   ** to allocate,
2fd70 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77   regardless of w
2fd80 68 65 74 68 65 72 20 69 74 20 68 61 73 20 6c 65  hether it has le
2fd90 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aves..        */
2fda0 0a 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20  .        *pPgno 
2fdb0 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = iTrunk;.      
2fdc0 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72 75    *ppPage = pTru
2fdd0 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61 72  nk;.        sear
2fde0 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  chList = 0;.    
2fdf0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2fe00 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e  PagerWrite(pTrun
2fe10 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  k->pDbPage);.   
2fe20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2fe30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2fe40 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
2fe50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2fe60 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20     if( k==0 ){. 
2fe70 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
2fe80 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
2fe90 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
2fea0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
2feb0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2fec0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2fed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fee0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fef0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2ff00 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  revTrunk->pDbPag
2ff10 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2ff20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ff30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2ff40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
2ff50 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
2ff60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ff70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72       memcpy(&pPr
2ff80 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
2ff90 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
2ffa0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
2ffb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
2ffc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2ffd0 2a 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65  * The trunk page
2ffe0 20 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20   is required by 
2fff0 74 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69  the caller but i
30000 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20  t contains .    
30010 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72        ** pointer
30020 73 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  s to free-list l
30030 65 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74  eaves. The first
30040 20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20   leaf becomes a 
30050 74 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20  trunk.          
30060 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
30070 63 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20  case..          
30080 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d  */.          Mem
30090 50 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b  Page *pNewTrunk;
300a0 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20  .          Pgno 
300b0 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34  iNewTrunk = get4
300c0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
300d0 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20  ata[8]);.       
300e0 20 20 20 69 66 28 20 69 4e 65 77 54 72 75 6e 6b     if( iNewTrunk
300f0 3e 6d 78 50 61 67 65 20 29 7b 20 0a 20 20 20 20  >mxPage ){ .    
30100 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
30110 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
30120 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
30130 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30140 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
30150 7d 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  }.          test
30160 63 61 73 65 28 20 69 4e 65 77 54 72 75 6e 6b 3d  case( iNewTrunk=
30170 3d 6d 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20  =mxPage );.     
30180 20 20 20 20 20 72 63 20 3d 20 62 74 72 65 65 47       rc = btreeG
30190 65 74 55 6e 75 73 65 64 50 61 67 65 28 70 42 74  etUnusedPage(pBt
301a0 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e  , iNewTrunk, &pN
301b0 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20  ewTrunk, 0);.   
301c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
301d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
301e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
301f0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
30200 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30210 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
30220 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65  e3PagerWrite(pNe
30230 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  wTrunk->pDbPage)
30240 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30260 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
30270 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
30280 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nk);.           
30290 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
302a0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20  te_page;.       
302b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d     }.          m
302c0 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b  emcpy(&pNewTrunk
302d0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72  ->aData[0], &pTr
302e0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
302f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
30300 34 62 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b  4byte(&pNewTrunk
30310 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29  ->aData[4], k-1)
30320 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  ;.          memc
30330 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61  py(&pNewTrunk->a
30340 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b  Data[8], &pTrunk
30350 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d  ->aData[12], (k-
30360 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20  1)*4);.         
30370 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65   releasePage(pNe
30380 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
30390 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72 75     if( !pPrevTru
303a0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
303b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
303c0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
303d0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
303e0 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
303f0 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61 67    put4byte(&pPag
30400 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69  e1->aData[32], i
30410 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
30420 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
30430 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
30440 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30450 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61  PrevTrunk->pDbPa
30460 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
30470 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30480 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
30490 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
304a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
304b0 20 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62             put4b
304c0 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
304d0 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54  >aData[0], iNewT
304e0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
304f0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
30500 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
30510 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
30520 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
30530 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
30540 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
30550 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64  gno, n-1));.#end
30560 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  if.      }else i
30570 66 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( k>0 ){.      
30580 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61 20 6c    /* Extract a l
30590 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74 72 75  eaf from the tru
305a0 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  nk */.        u3
305b0 32 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20  2 closest;.     
305c0 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20     Pgno iPage;. 
305d0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
305e0 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20 70 54  char *aData = pT
305f0 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20  runk->aData;.   
30600 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79 3e       if( nearby>
30610 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
30620 33 32 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  32 i;.          
30630 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
30640 20 20 20 20 20 20 20 69 66 28 20 65 4d 6f 64 65         if( eMode
30650 3d 3d 42 54 41 4c 4c 4f 43 5f 4c 45 20 29 7b 0a  ==BTALLOC_LE ){.
30660 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
30670 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=0; i<k; i++){.
30680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
30690 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
306a0 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 20  aData[8+i*4]);. 
306b0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
306c0 20 69 50 61 67 65 3c 3d 6e 65 61 72 62 79 20 29   iPage<=nearby )
306d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
306e0 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
306f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
30700 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
30710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
30720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
30730 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
30740 20 69 6e 74 20 64 69 73 74 3b 0a 20 20 20 20 20   int dist;.     
30750 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 73 71         dist = sq
30760 6c 69 74 65 33 41 62 73 49 6e 74 33 32 28 67 65  lite3AbsInt32(ge
30770 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 5d  t4byte(&aData[8]
30780 29 20 2d 20 6e 65 61 72 62 79 29 3b 0a 20 20 20  ) - nearby);.   
30790 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31           for(i=1
307a0 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<k; i++){.   
307b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 64             int d
307c0 32 20 3d 20 73 71 6c 69 74 65 33 41 62 73 49 6e  2 = sqlite3AbsIn
307d0 74 33 32 28 67 65 74 34 62 79 74 65 28 26 61 44  t32(get4byte(&aD
307e0 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65  ata[8+i*4]) - ne
307f0 61 72 62 79 29 3b 0a 20 20 20 20 20 20 20 20 20  arby);.         
30800 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
30810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
30820 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b      closest = i;
30830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30840 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20 20   dist = d2;.    
30850 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30870 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
30880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
30890 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20  losest = 0;.    
308a0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
308b0 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28  Page = get4byte(
308c0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
308d0 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 74 65  *4]);.        te
308e0 73 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d  stcase( iPage==m
308f0 78 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20  xPage );.       
30900 20 69 66 28 20 69 50 61 67 65 3e 6d 78 50 61 67   if( iPage>mxPag
30910 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  e ){.          r
30920 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
30930 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
30940 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
30950 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
30960 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74 65 73     }.        tes
30970 74 63 61 73 65 28 20 69 50 61 67 65 3d 3d 6d 78  tcase( iPage==mx
30980 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Page );.        
30990 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20  if( !searchList 
309a0 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 50  .         || (iP
309b0 61 67 65 3d 3d 6e 65 61 72 62 79 20 7c 7c 20 28  age==nearby || (
309c0 69 50 61 67 65 3c 6e 65 61 72 62 79 20 26 26 20  iPage<nearby && 
309d0 65 4d 6f 64 65 3d 3d 42 54 41 4c 4c 4f 43 5f 4c  eMode==BTALLOC_L
309e0 45 29 29 20 0a 20 20 20 20 20 20 20 20 29 7b 0a  E)) .        ){.
309f0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 6f            int no
30a00 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20 20 20 20  Content;.       
30a10 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61 67     *pPgno = iPag
30a20 65 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  e;.          TRA
30a30 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
30a40 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
30a50 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
30a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30a70 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
30a80 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
30a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
30aa0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
30ab0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
30ac0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
30ad0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
30ae0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
30af0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
30b00 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
30b10 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
30b20 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
30b30 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20  if( closest<k-1 
30b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ){.            m
30b50 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63  emcpy(&aData[8+c
30b60 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74  losest*4], &aDat
30b70 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20  a[4+k*4], 4);.  
30b80 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30b90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 61 44      put4byte(&aD
30ba0 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
30bb0 20 20 20 20 20 20 20 20 6e 6f 43 6f 6e 74 65 6e          noConten
30bc0 74 20 3d 20 21 62 74 72 65 65 47 65 74 48 61 73  t = !btreeGetHas
30bd0 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 2a 70 50  Content(pBt, *pP
30be0 67 6e 6f 29 3f 20 50 41 47 45 52 5f 47 45 54 5f  gno)? PAGER_GET_
30bf0 4e 4f 43 4f 4e 54 45 4e 54 20 3a 20 30 3b 0a 20  NOCONTENT : 0;. 
30c00 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74           rc = bt
30c10 72 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65  reeGetUnusedPage
30c20 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
30c30 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
30c40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
30c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
30c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
30c70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
30c80 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
30c90 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
30ca0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30cb0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30cc0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30cd0 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
30ce0 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 50              *ppP
30cf0 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  age = 0;.       
30d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
30d10 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65 61   }.          sea
30d20 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
30d30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
30d40 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30d50 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20  (pPrevTrunk);.  
30d60 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d      pPrevTrunk =
30d70 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20   0;.    }while( 
30d80 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20 20  searchList );.  
30d90 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
30da0 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65 73  ere are no pages
30db0 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
30dc0 2c 20 73 6f 20 61 70 70 65 6e 64 20 61 20 6e 65  , so append a ne
30dd0 77 20 70 61 67 65 20 74 6f 20 74 68 65 0a 20 20  w page to the.  
30de0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d    ** database im
30df0 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  age..    **.    
30e00 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 6e 65 77  ** Normally, new
30e10 20 70 61 67 65 73 20 61 6c 6c 6f 63 61 74 65 64   pages allocated
30e20 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 20 63   by this block c
30e30 61 6e 20 62 65 20 72 65 71 75 65 73 74 65 64 20  an be requested 
30e40 66 72 6f 6d 20 74 68 65 0a 20 20 20 20 2a 2a 20  from the.    ** 
30e50 70 61 67 65 72 20 6c 61 79 65 72 20 77 69 74 68  pager layer with
30e60 20 74 68 65 20 27 6e 6f 2d 63 6f 6e 74 65 6e 74   the 'no-content
30e70 27 20 66 6c 61 67 20 73 65 74 2e 20 54 68 69 73  ' flag set. This
30e80 20 70 72 65 76 65 6e 74 73 20 74 68 65 20 70 61   prevents the pa
30e90 67 65 72 0a 20 20 20 20 2a 2a 20 66 72 6f 6d 20  ger.    ** from 
30ea0 74 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 74  trying to read t
30eb0 68 65 20 70 61 67 65 73 20 63 6f 6e 74 65 6e 74  he pages content
30ec0 20 66 72 6f 6d 20 64 69 73 6b 2e 20 48 6f 77 65   from disk. Howe
30ed0 76 65 72 2c 20 69 66 20 74 68 65 0a 20 20 20 20  ver, if the.    
30ee0 2a 2a 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  ** current trans
30ef0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
30f00 64 79 20 72 75 6e 20 6f 6e 65 20 6f 72 20 6d 6f  dy run one or mo
30f10 72 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  re incremental-v
30f20 61 63 75 75 6d 0a 20 20 20 20 2a 2a 20 73 74 65  acuum.    ** ste
30f30 70 73 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ps, then the pag
30f40 65 20 77 65 20 61 72 65 20 61 62 6f 75 74 20 74  e we are about t
30f50 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 61 79 20 63  o allocate may c
30f60 6f 6e 74 61 69 6e 20 63 6f 6e 74 65 6e 74 0a 20  ontain content. 
30f70 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 72 65     ** that is re
30f80 71 75 69 72 65 64 20 69 6e 20 74 68 65 20 65 76  quired in the ev
30f90 65 6e 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63  ent of a rollbac
30fa0 6b 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  k. In this case,
30fb0 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 73   do.    ** not s
30fc0 65 74 20 74 68 65 20 6e 6f 2d 63 6f 6e 74 65 6e  et the no-conten
30fd0 74 20 66 6c 61 67 2e 20 54 68 69 73 20 63 61 75  t flag. This cau
30fe0 73 65 73 20 74 68 65 20 70 61 67 65 72 20 74 6f  ses the pager to
30ff0 20 6c 6f 61 64 20 61 6e 64 20 6a 6f 75 72 6e 61   load and journa
31000 6c 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75 72  l.    ** the cur
31010 72 65 6e 74 20 70 61 67 65 20 63 6f 6e 74 65 6e  rent page conten
31020 74 20 62 65 66 6f 72 65 20 6f 76 65 72 77 72 69  t before overwri
31030 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 0a  ting it..    **.
31040 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
31050 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 20   the pager will 
31060 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 74 74  not actually att
31070 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 6f 72 20  empt to load or 
31080 6a 6f 75 72 6e 61 6c 20 0a 20 20 20 20 2a 2a 20  journal .    ** 
31090 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
310a0 70 61 67 65 20 74 68 61 74 20 72 65 61 6c 6c 79  page that really
310b0 20 64 6f 65 73 20 6c 69 65 20 70 61 73 74 20 74   does lie past t
310c0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
310d0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
310e0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 74  le on disk. So t
310f0 68 65 20 65 66 66 65 63 74 73 20 6f 66 20 64 69  he effects of di
31100 73 61 62 6c 69 6e 67 20 74 68 65 20 6e 6f 2d 63  sabling the no-c
31110 6f 6e 74 65 6e 74 20 6f 70 74 69 6d 69 7a 61 74  ontent optimizat
31120 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 65 72 65 20  ion.    ** here 
31130 61 72 65 20 63 6f 6e 66 69 6e 65 64 20 74 6f 20  are confined to 
31140 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61 74  those pages that
31150 20 6c 69 65 20 62 65 74 77 65 65 6e 20 74 68 65   lie between the
31160 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
31170 2a 2a 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  ** database imag
31180 65 20 61 6e 64 20 74 68 65 20 65 6e 64 20 6f 66  e and the end of
31190 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
311a0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
311b0 6e 74 20 62 4e 6f 43 6f 6e 74 65 6e 74 20 3d 20  nt bNoContent = 
311c0 28 30 3d 3d 49 66 4e 6f 74 4f 6d 69 74 41 56 28  (0==IfNotOmitAV(
311d0 70 42 74 2d 3e 62 44 6f 54 72 75 6e 63 61 74 65  pBt->bDoTruncate
311e0 29 29 3f 20 50 41 47 45 52 5f 47 45 54 5f 4e 4f  ))? PAGER_GET_NO
311f0 43 4f 4e 54 45 4e 54 3a 30 3b 0a 0a 20 20 20 20  CONTENT:0;..    
31200 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
31210 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
31220 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
31230 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
31240 6e 20 72 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e  n rc;.    pBt->n
31250 50 61 67 65 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Page++;.    if( 
31260 70 42 74 2d 3e 6e 50 61 67 65 3d 3d 50 45 4e 44  pBt->nPage==PEND
31270 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
31280 74 29 20 29 20 70 42 74 2d 3e 6e 50 61 67 65 2b  t) ) pBt->nPage+
31290 2b 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  +;..#ifndef SQLI
312a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
312b0 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
312c0 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50 54  autoVacuum && PT
312d0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
312e0 20 70 42 74 2d 3e 6e 50 61 67 65 29 20 29 7b 0a   pBt->nPage) ){.
312f0 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50 67        /* If *pPg
31300 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20 70  no refers to a p
31310 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c  ointer-map page,
31320 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65   allocate two ne
31330 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a 2a  w pages.      **
31340 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
31350 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64 20  he file instead 
31360 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72 73  of one. The firs
31370 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  t allocated page
31380 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65  .      ** become
31390 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d  s a new pointer-
313a0 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73 65  map page, the se
313b0 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79 20  cond is used by 
313c0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20  the caller..    
313d0 20 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61    */.      MemPa
313e0 67 65 20 2a 70 50 67 20 3d 20 30 3b 0a 20 20 20  ge *pPg = 0;.   
313f0 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
31400 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
31410 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
31420 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
31430 70 42 74 2d 3e 6e 50 61 67 65 29 29 3b 0a 20 20  pBt->nPage));.  
31440 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
31450 3e 6e 50 61 67 65 21 3d 50 45 4e 44 49 4e 47 5f  >nPage!=PENDING_
31460 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
31470 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 62 74 72  ;.      rc = btr
31480 65 65 47 65 74 55 6e 75 73 65 64 50 61 67 65 28  eeGetUnusedPage(
31490 70 42 74 2c 20 70 42 74 2d 3e 6e 50 61 67 65 2c  pBt, pBt->nPage,
314a0 20 26 70 50 67 2c 20 62 4e 6f 43 6f 6e 74 65 6e   &pPg, bNoConten
314b0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
314c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
314d0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
314e0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
314f0 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  g->pDbPage);.   
31500 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
31510 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (pPg);.      }. 
31520 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
31530 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
31540 42 74 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  Bt->nPage++;.   
31550 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 50 61 67     if( pBt->nPag
31560 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  e==PENDING_BYTE_
31570 50 41 47 45 28 70 42 74 29 20 29 7b 20 70 42 74  PAGE(pBt) ){ pBt
31580 2d 3e 6e 50 61 67 65 2b 2b 3b 20 7d 0a 20 20 20  ->nPage++; }.   
31590 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 75   }.#endif.    pu
315a0 74 34 62 79 74 65 28 32 38 20 2b 20 28 75 38 2a  t4byte(28 + (u8*
315b0 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  )pBt->pPage1->aD
315c0 61 74 61 2c 20 70 42 74 2d 3e 6e 50 61 67 65 29  ata, pBt->nPage)
315d0 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70  ;.    *pPgno = p
315e0 42 74 2d 3e 6e 50 61 67 65 3b 0a 0a 20 20 20 20  Bt->nPage;..    
315f0 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
31600 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
31610 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63  E(pBt) );.    rc
31620 20 3d 20 62 74 72 65 65 47 65 74 55 6e 75 73 65   = btreeGetUnuse
31630 64 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  dPage(pBt, *pPgn
31640 6f 2c 20 70 70 50 61 67 65 2c 20 62 4e 6f 43 6f  o, ppPage, bNoCo
31650 6e 74 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  ntent);.    if( 
31660 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
31670 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
31680 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
31690 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
316a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
316b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
316c0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
316d0 67 65 29 3b 0a 20 20 20 20 20 20 2a 70 70 50 61  ge);.      *ppPa
316e0 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ge = 0;.    }.  
316f0 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
31700 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20  TE: %d from end 
31710 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67  of file\n", *pPg
31720 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  no));.  }..  ass
31730 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
31740 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
31750 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f  Bt) );..end_allo
31760 63 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c  cate_page:.  rel
31770 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
31780 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
31790 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 61  pPrevTrunk);.  a
317a0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
317b0 45 5f 4f 4b 20 7c 7c 20 73 71 6c 69 74 65 33 50  E_OK || sqlite3P
317c0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
317d0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
317e0 61 67 65 29 3c 3d 31 20 29 3b 0a 20 20 61 73 73  age)<=1 );.  ass
317f0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
31800 4f 4b 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d  OK || (*ppPage)-
31810 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20  >isInit==0 );.  
31820 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31830 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
31840 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
31850 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
31860 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
31870 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
31880 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
31890 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
318a0 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
318b0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
318c0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
318d0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
318e0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
318f0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
31900 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
31910 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
31920 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
31930 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
31940 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
31950 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
31960 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
31970 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
31980 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
31990 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
319a0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
319b0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
319c0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
319d0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
319e0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
319f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
31a00 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
31a10 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
31a20 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
31a30 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
31a40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
31a50 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
31a60 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
31a70 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
31a80 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
31a90 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
31aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
31ab0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
31ac0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
31ad0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31af0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
31b00 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
31b10 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
31b20 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
31b30 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
31b40 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
31b50 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
31b60 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
31b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b80 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
31b90 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
31ba0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
31bb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31bd0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
31be0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c00 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
31c10 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
31c20 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
31c30 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
31c40 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
31c50 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
31c60 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f  assert( CORRUPT_
31c70 44 42 20 7c 7c 20 69 50 61 67 65 3e 31 20 29 3b  DB || iPage>1 );
31c80 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
31c90 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
31ca0 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
31cb0 0a 0a 20 20 69 66 28 20 69 50 61 67 65 3c 32 20  ..  if( iPage<2 
31cc0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
31cd0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
31ce0 69 66 28 20 70 4d 65 6d 50 61 67 65 20 29 7b 0a  if( pMemPage ){.
31cf0 20 20 20 20 70 50 61 67 65 20 3d 20 70 4d 65 6d      pPage = pMem
31d00 50 61 67 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  Page;.    sqlite
31d10 33 50 61 67 65 72 52 65 66 28 70 50 61 67 65 2d  3PagerRef(pPage-
31d20 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 65 6c  >pDbPage);.  }el
31d30 73 65 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  se{.    pPage = 
31d40 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70 28  btreePageLookup(
31d50 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 7d  pBt, iPage);.  }
31d60 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74  ..  /* Increment
31d70 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20 63   the free page c
31d80 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a  ount on pPage1 *
31d90 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
31da0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
31db0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69  1->pDbPage);.  i
31dc0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65  f( rc ) goto fre
31dd0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 6e 46 72  epage_out;.  nFr
31de0 65 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  ee = get4byte(&p
31df0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31e00 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 70  );.  put4byte(&p
31e10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
31e20 2c 20 6e 46 72 65 65 2b 31 29 3b 0a 0a 20 20 69  , nFree+1);..  i
31e30 66 28 20 70 42 74 2d 3e 62 74 73 46 6c 61 67 73  f( pBt->btsFlags
31e40 20 26 20 42 54 53 5f 53 45 43 55 52 45 5f 44 45   & BTS_SECURE_DE
31e50 4c 45 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 49  LETE ){.    /* I
31e60 66 20 74 68 65 20 73 65 63 75 72 65 5f 64 65 6c  f the secure_del
31e70 65 74 65 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e  ete option is en
31e80 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  abled, then.    
31e90 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20  ** always fully 
31ea0 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  overwrite delete
31eb0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
31ec0 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
31ed0 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65  .    if( (!pPage
31ee0 20 26 26 20 28 28 72 63 20 3d 20 62 74 72 65 65   && ((rc = btree
31ef0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 61  GetPage(pBt, iPa
31f00 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
31f10 3d 30 29 20 29 0a 20 20 20 20 20 7c 7c 20 20 20  =0) ).     ||   
31f20 20 20 20 20 20 20 20 20 20 28 28 72 63 20 3d 20           ((rc = 
31f30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
31f40 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
31f50 29 29 21 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20  ))!=0).    ){.  
31f60 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
31f70 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
31f80 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61   memset(pPage->a
31f90 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e  Data, 0, pPage->
31fa0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
31fb0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
31fc0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
31fd0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
31fe0 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69  write an entry i
31ff0 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61  n the pointer-ma
32000 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61  p.  ** to indica
32010 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
32020 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20   is free..  */. 
32030 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
32040 4d 20 29 7b 0a 20 20 20 20 70 74 72 6d 61 70 50  M ){.    ptrmapP
32050 75 74 28 70 42 74 2c 20 69 50 61 67 65 2c 20 50  ut(pBt, iPage, P
32060 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
32070 30 2c 20 26 72 63 29 3b 0a 20 20 20 20 69 66 28  0, &rc);.    if(
32080 20 72 63 20 29 20 67 6f 74 6f 20 66 72 65 65 70   rc ) goto freep
32090 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  age_out;.  }..  
320a0 2f 2a 20 4e 6f 77 20 6d 61 6e 69 70 75 6c 61 74  /* Now manipulat
320b0 65 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74  e the actual dat
320c0 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 20  abase free-list 
320d0 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 72 65  structure. There
320e0 20 61 72 65 20 74 77 6f 0a 20 20 2a 2a 20 70 6f   are two.  ** po
320f0 73 73 69 62 69 6c 69 74 69 65 73 2e 20 49 66 20  ssibilities. If 
32100 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73  the free-list is
32110 20 63 75 72 72 65 6e 74 6c 79 20 65 6d 70 74 79   currently empty
32120 2c 20 6f 72 20 69 66 20 74 68 65 20 66 69 72 73  , or if the firs
32130 74 0a 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67  t.  ** trunk pag
32140 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e in the free-li
32150 73 74 20 69 73 20 66 75 6c 6c 2c 20 74 68 65 6e  st is full, then
32160 20 74 68 69 73 20 70 61 67 65 20 77 69 6c 6c 20   this page will 
32170 62 65 63 6f 6d 65 20 61 0a 20 20 2a 2a 20 6e 65  become a.  ** ne
32180 77 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75 6e  w free-list trun
32190 6b 20 70 61 67 65 2e 20 4f 74 68 65 72 77 69 73  k page. Otherwis
321a0 65 2c 20 69 74 20 77 69 6c 6c 20 62 65 63 6f 6d  e, it will becom
321b0 65 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 0a  e a leaf of the.
321c0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
321d0 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 75 72   page in the cur
321e0 72 65 6e 74 20 66 72 65 65 2d 6c 69 73 74 2e 20  rent free-list. 
321f0 54 68 69 73 20 62 6c 6f 63 6b 20 74 65 73 74 73  This block tests
32200 20 69 66 20 69 74 0a 20 20 2a 2a 20 69 73 20 70   if it.  ** is p
32210 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
32220 68 65 20 70 61 67 65 20 61 73 20 61 20 6e 65 77  he page as a new
32230 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 2e   free-list leaf.
32240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 46 72 65  .  */.  if( nFre
32250 65 21 3d 30 20 29 7b 0a 20 20 20 20 75 33 32 20  e!=0 ){.    u32 
32260 6e 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  nLeaf;          
32270 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
32280 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20   number of leaf 
32290 63 65 6c 6c 73 20 6f 6e 20 74 72 75 6e 6b 20 70  cells on trunk p
322a0 61 67 65 20 2a 2f 0a 0a 20 20 20 20 69 54 72 75  age */..    iTru
322b0 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  nk = get4byte(&p
322c0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
322d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 62 74 72 65  );.    rc = btre
322e0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54  eGetPage(pBt, iT
322f0 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30  runk, &pTrunk, 0
32300 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
32310 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32320 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
32330 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  out;.    }..    
32340 6e 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65  nLeaf = get4byte
32350 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
32360 34 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4]);.    assert(
32370 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
32380 3e 33 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  >32 );.    if( n
32390 4c 65 61 66 20 3e 20 28 75 33 32 29 70 42 74 2d  Leaf > (u32)pBt-
323a0 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
323b0 32 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  2 ){.      rc = 
323c0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
323d0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
323e0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
323f0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
32400 66 20 3c 20 28 75 33 32 29 70 42 74 2d 3e 75 73  f < (u32)pBt->us
32410 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29  ableSize/4 - 8 )
32420 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68  {.      /* In th
32430 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
32440 20 72 6f 6f 6d 20 6f 6e 20 74 68 65 20 74 72 75   room on the tru
32450 6e 6b 20 70 61 67 65 20 74 6f 20 69 6e 73 65 72  nk page to inser
32460 74 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  t the page.     
32470 20 2a 2a 20 62 65 69 6e 67 20 66 72 65 65 64 20   ** being freed 
32480 61 73 20 61 20 6e 65 77 20 6c 65 61 66 2e 0a 20  as a new leaf.. 
32490 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
324a0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
324b0 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
324c0 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
324d0 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
324e0 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
324f0 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
32500 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
32510 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
32520 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
32530 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
32540 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
32550 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
32560 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
32570 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
32580 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
32590 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
325a0 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
325b0 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
325c0 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
325d0 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
325e0 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
325f0 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
32600 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
32610 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
32620 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
32630 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
32640 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
32650 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
32660 63 6f 6e 74 69 6e 75 65 20 74 6f 20 72 65 73 74  continue to rest
32670 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20  rict the number 
32680 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73  of entries to us
32690 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20  ableSize/4 - 8. 
326a0 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e       ** for now.
326b0 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20    At some point 
326c0 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f  in the future (o
326d0 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73  nce everyone has
326e0 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20   upgraded.      
326f0 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c  ** to 3.6.0 or l
32700 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20  ater) we should 
32710 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20  consider fixing 
32720 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20  the conditional 
32730 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74  above.      ** t
32740 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69  o read "usableSi
32750 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20  ze/4-2" instead 
32760 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34  of "usableSize/4
32770 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  -8"..      **.  
32780 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
32790 4f 46 3a 20 52 2d 31 39 39 32 30 2d 31 31 35 37  OF: R-19920-1157
327a0 36 20 48 6f 77 65 76 65 72 2c 20 6e 65 77 65 72  6 However, newer
327b0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
327c0 69 74 65 20 73 74 69 6c 6c 0a 20 20 20 20 20 20  ite still.      
327d0 2a 2a 20 61 76 6f 69 64 20 75 73 69 6e 67 20 74  ** avoid using t
327e0 68 65 20 6c 61 73 74 20 73 69 78 20 65 6e 74 72  he last six entr
327f0 69 65 73 20 69 6e 20 74 68 65 20 66 72 65 65 6c  ies in the freel
32800 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 61  ist trunk page a
32810 72 72 61 79 20 69 6e 0a 20 20 20 20 20 20 2a 2a  rray in.      **
32820 20 6f 72 64 65 72 20 74 68 61 74 20 64 61 74 61   order that data
32830 62 61 73 65 20 66 69 6c 65 73 20 63 72 65 61 74  base files creat
32840 65 64 20 62 79 20 6e 65 77 65 72 20 76 65 72 73  ed by newer vers
32850 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 63  ions of SQLite c
32860 61 6e 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 72  an be.      ** r
32870 65 61 64 20 62 79 20 6f 6c 64 65 72 20 76 65 72  ead by older ver
32880 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2e  sions of SQLite.
32890 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
328a0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
328b0 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70  rWrite(pTrunk->p
328c0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
328d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
328e0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34   ){.        put4
328f0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
32900 61 74 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29  ata[4], nLeaf+1)
32910 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
32920 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
32930 61 5b 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50  a[8+nLeaf*4], iP
32940 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
32950 28 20 70 50 61 67 65 20 26 26 20 28 70 42 74 2d  ( pPage && (pBt-
32960 3e 62 74 73 46 6c 61 67 73 20 26 20 42 54 53 5f  >btsFlags & BTS_
32970 53 45 43 55 52 45 5f 44 45 4c 45 54 45 29 3d 3d  SECURE_DELETE)==
32980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
32990 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
329a0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
329b0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
329c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 74 72          rc = btr
329d0 65 65 53 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeSetHasContent(
329e0 70 42 74 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  pBt, iPage);.   
329f0 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
32a00 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
32a10 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
32a20 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
32a30 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
32a40 6e 6f 29 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  no));.      goto
32a50 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
32a60 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
32a70 66 20 63 6f 6e 74 72 6f 6c 20 66 6c 6f 77 73 20  f control flows 
32a80 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
32a90 68 65 6e 20 69 74 20 77 61 73 20 6e 6f 74 20 70  hen it was not p
32aa0 6f 73 73 69 62 6c 65 20 74 6f 20 61 64 64 20 74  ossible to add t
32ab0 68 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  he.  ** the page
32ac0 20 62 65 69 6e 67 20 66 72 65 65 64 20 61 73 20   being freed as 
32ad0 61 20 6c 65 61 66 20 70 61 67 65 20 6f 66 20 74  a leaf page of t
32ae0 68 65 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  he first trunk i
32af0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e  n the free-list.
32b00 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 62  .  ** Possibly b
32b10 65 63 61 75 73 65 20 74 68 65 20 66 72 65 65 2d  ecause the free-
32b20 6c 69 73 74 20 69 73 20 65 6d 70 74 79 2c 20 6f  list is empty, o
32b30 72 20 70 6f 73 73 69 62 6c 79 20 62 65 63 61 75  r possibly becau
32b40 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66 69 72  se the .  ** fir
32b50 73 74 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20  st trunk in the 
32b60 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c  free-list is ful
32b70 6c 2e 20 45 69 74 68 65 72 20 77 61 79 2c 20 74  l. Either way, t
32b80 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
32b90 65 65 64 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  eed.  ** will be
32ba0 63 6f 6d 65 20 74 68 65 20 6e 65 77 20 66 69 72  come the new fir
32bb0 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
32bc0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2e 0a   the free-list..
32bd0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
32be0 3d 3d 30 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b  ==0 && SQLITE_OK
32bf0 21 3d 28 72 63 20 3d 20 62 74 72 65 65 47 65 74  !=(rc = btreeGet
32c00 50 61 67 65 28 70 42 74 2c 20 69 50 61 67 65 2c  Page(pBt, iPage,
32c10 20 26 70 50 61 67 65 2c 20 30 29 29 20 29 7b 0a   &pPage, 0)) ){.
32c20 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
32c30 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 72 63 20  e_out;.  }.  rc 
32c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32c50 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
32c60 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
32c70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32c80 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75  goto freepage_ou
32c90 74 3b 0a 20 20 7d 0a 20 20 70 75 74 34 62 79 74  t;.  }.  put4byt
32ca0 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
32cb0 69 54 72 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62  iTrunk);.  put4b
32cc0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
32cd0 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34  a[4], 0);.  put4
32ce0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
32cf0 61 74 61 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b  ata[32], iPage);
32d00 0a 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d  .  TRACE(("FREE-
32d10 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
32d20 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
32d30 67 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e  g %d\n", pPage->
32d40 70 67 6e 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a  pgno, iTrunk));.
32d50 0a 66 72 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20  .freepage_out:. 
32d60 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
32d70 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
32d80 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  = 0;.  }.  relea
32d90 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
32da0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
32db0 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  unk);.  return r
32dc0 63 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  c;.}.static void
32dd0 20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67   freePage(MemPag
32de0 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 2a 70  e *pPage, int *p
32df0 52 43 29 7b 0a 20 20 69 66 28 20 28 2a 70 52 43  RC){.  if( (*pRC
32e00 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
32e10 20 20 20 20 2a 70 52 43 20 3d 20 66 72 65 65 50      *pRC = freeP
32e20 61 67 65 32 28 70 50 61 67 65 2d 3e 70 42 74 2c  age2(pPage->pBt,
32e30 20 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70   pPage, pPage->p
32e40 67 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  gno);.  }.}../*.
32e50 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72  ** Free any over
32e60 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63  flow pages assoc
32e70 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
32e80 69 76 65 6e 20 43 65 6c 6c 2e 20 20 57 72 69 74  iven Cell.  Writ
32e90 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 61 6c 20 43  e the.** local C
32ea0 65 6c 6c 20 73 69 7a 65 20 28 74 68 65 20 6e 75  ell size (the nu
32eb0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 6e  mber of bytes on
32ec0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61   the original pa
32ed0 67 65 2c 20 6f 6d 69 74 74 69 6e 67 0a 2a 2a 20  ge, omitting.** 
32ee0 6f 76 65 72 66 6c 6f 77 29 20 69 6e 74 6f 20 2a  overflow) into *
32ef0 70 6e 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  pnSize..*/.stati
32f00 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
32f10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
32f20 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e,          /* T
32f30 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
32f40 74 61 69 6e 73 20 74 68 65 20 43 65 6c 6c 20 2a  tains the Cell *
32f50 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
32f60 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 2f 2a 20  r *pCell,    /* 
32f70 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
32f80 65 20 43 65 6c 6c 20 2a 2f 0a 20 20 75 31 36 20  e Cell */.  u16 
32f90 2a 70 6e 53 69 7a 65 20 20 20 20 20 20 20 20 20  *pnSize         
32fa0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
32fb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 43 65  e size of the Ce
32fc0 6c 6c 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ll here */.){.  
32fd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
32fe0 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65  pPage->pBt;.  Ce
32ff0 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50  llInfo info;.  P
33000 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20  gno ovflPgno;.  
33010 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f  int rc;.  int nO
33020 76 66 6c 3b 0a 20 20 75 33 32 20 6f 76 66 6c 50  vfl;.  u32 ovflP
33030 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65  ageSize;..  asse
33040 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
33050 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
33060 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
33070 50 61 67 65 2d 3e 78 50 61 72 73 65 43 65 6c 6c  Page->xParseCell
33080 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
33090 69 6e 66 6f 29 3b 0a 20 20 2a 70 6e 53 69 7a 65  info);.  *pnSize
330a0 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
330b0 20 69 66 28 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c   if( info.nLocal
330c0 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
330d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
330e0 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20  LITE_OK;  /* No 
330f0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20  overflow pages. 
33100 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  Return without d
33110 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f  oing anything */
33120 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 65 6c 6c  .  }.  if( pCell
33130 2b 69 6e 66 6f 2e 6e 53 69 7a 65 2d 31 20 3e 20  +info.nSize-1 > 
33140 70 50 61 67 65 2d 3e 61 44 61 74 61 2b 70 50 61  pPage->aData+pPa
33150 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 29 7b 0a  ge->maskPage ){.
33160 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33170 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
33180 20 2f 2a 20 43 65 6c 6c 20 65 78 74 65 6e 64 73   /* Cell extends
33190 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 61 67   past end of pag
331a0 65 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50  e */.  }.  ovflP
331b0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70  gno = get4byte(p
331c0 43 65 6c 6c 20 2b 20 69 6e 66 6f 2e 6e 53 69 7a  Cell + info.nSiz
331d0 65 20 2d 20 34 29 3b 0a 20 20 61 73 73 65 72 74  e - 4);.  assert
331e0 28 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ( pBt->usableSiz
331f0 65 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50  e > 4 );.  ovflP
33200 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
33210 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
33220 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
33230 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
33240 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
33250 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
33260 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
33270 28 20 6e 4f 76 66 6c 3e 30 20 7c 7c 20 0a 20 20  ( nOvfl>0 || .  
33280 20 20 28 43 4f 52 52 55 50 54 5f 44 42 20 26 26    (CORRUPT_DB &&
33290 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20   (info.nPayload 
332a0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 3c  + ovflPageSize)<
332b0 6f 76 66 6c 50 61 67 65 53 69 7a 65 29 0a 20 20  ovflPageSize).  
332c0 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66  );.  while( nOvf
332d0 6c 2d 2d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  l-- ){.    Pgno 
332e0 69 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 4d  iNext = 0;.    M
332f0 65 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20  emPage *pOvfl = 
33300 30 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c 50  0;.    if( ovflP
33310 67 6e 6f 3c 32 20 7c 7c 20 6f 76 66 6c 50 67 6e  gno<2 || ovflPgn
33320 6f 3e 62 74 72 65 65 50 61 67 65 63 6f 75 6e 74  o>btreePagecount
33330 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
33340 2a 20 30 20 69 73 20 6e 6f 74 20 61 20 6c 65 67  * 0 is not a leg
33350 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  al page number a
33360 6e 64 20 70 61 67 65 20 31 20 63 61 6e 6e 6f 74  nd page 1 cannot
33370 20 62 65 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a   be an .      **
33380 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
33390 54 68 65 72 65 66 6f 72 65 20 69 66 20 6f 76 66  Therefore if ovf
333a0 6c 50 67 6e 6f 3c 32 20 6f 72 20 70 61 73 74 20  lPgno<2 or past 
333b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
333c0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 74 68        ** file th
333d0 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
333e0 62 65 20 63 6f 72 72 75 70 74 2e 20 2a 2f 0a 20  be corrupt. */. 
333f0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33400 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
33410 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
33420 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  Ovfl ){.      rc
33430 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
33440 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f  ge(pBt, ovflPgno
33450 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78 74  , &pOvfl, &iNext
33460 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
33470 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
33480 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 20 70 4f   }..    if( ( pO
33490 76 66 6c 20 7c 7c 20 28 28 70 4f 76 66 6c 20 3d  vfl || ((pOvfl =
334a0 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b 75 70   btreePageLookup
334b0 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 29 29  (pBt, ovflPgno))
334c0 21 3d 30 29 20 29 0a 20 20 20 20 20 26 26 20 73  !=0) ).     && s
334d0 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 52  qlite3PagerPageR
334e0 65 66 63 6f 75 6e 74 28 70 4f 76 66 6c 2d 3e 70  efcount(pOvfl->p
334f0 44 62 50 61 67 65 29 21 3d 31 0a 20 20 20 20 29  DbPage)!=1.    )
33500 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65  {.      /* There
33510 20 69 73 20 6e 6f 20 72 65 61 73 6f 6e 20 61 6e   is no reason an
33520 79 20 63 75 72 73 6f 72 20 73 68 6f 75 6c 64 20  y cursor should 
33530 68 61 76 65 20 61 6e 20 6f 75 74 73 74 61 6e 64  have an outstand
33540 69 6e 67 20 72 65 66 65 72 65 6e 63 65 20 0a 20  ing reference . 
33550 20 20 20 20 20 2a 2a 20 74 6f 20 61 6e 20 6f 76       ** to an ov
33560 65 72 66 6c 6f 77 20 70 61 67 65 20 62 65 6c 6f  erflow page belo
33570 6e 67 69 6e 67 20 74 6f 20 61 20 63 65 6c 6c 20  nging to a cell 
33580 74 68 61 74 20 69 73 20 62 65 69 6e 67 20 64 65  that is being de
33590 6c 65 74 65 64 2f 75 70 64 61 74 65 64 2e 0a 20  leted/updated.. 
335a0 20 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 74 68       ** So if th
335b0 65 72 65 20 65 78 69 73 74 73 20 6d 6f 72 65 20  ere exists more 
335c0 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
335d0 63 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 2c  ce to this page,
335e0 20 74 68 65 6e 20 69 74 20 0a 20 20 20 20 20 20   then it .      
335f0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 72 65 61 6c  ** must not real
33600 6c 79 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  ly be an overflo
33610 77 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 64  w page and the d
33620 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
33630 63 6f 72 72 75 70 74 2e 20 0a 20 20 20 20 20 20  corrupt. .      
33640 2a 2a 20 49 74 20 69 73 20 68 65 6c 70 66 75 6c  ** It is helpful
33650 20 74 6f 20 64 65 74 65 63 74 20 74 68 69 73 20   to detect this 
33660 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 66  before calling f
33670 72 65 65 50 61 67 65 32 28 29 2c 20 61 73 20 0a  reePage2(), as .
33680 20 20 20 20 20 20 2a 2a 20 66 72 65 65 50 61 67        ** freePag
33690 65 32 28 29 20 6d 61 79 20 7a 65 72 6f 20 74 68  e2() may zero th
336a0 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  e page contents 
336b0 69 66 20 73 65 63 75 72 65 2d 64 65 6c 65 74 65  if secure-delete
336c0 20 6d 6f 64 65 20 69 73 0a 20 20 20 20 20 20 2a   mode is.      *
336d0 2a 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68  * enabled. If th
336e0 69 73 20 27 6f 76 65 72 66 6c 6f 77 27 20 70 61  is 'overflow' pa
336f0 67 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  ge happens to be
33700 20 61 20 70 61 67 65 20 74 68 61 74 20 74 68 65   a page that the
33710 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72  .      ** caller
33720 20 69 73 20 69 74 65 72 61 74 69 6e 67 20 74 68   is iterating th
33730 72 6f 75 67 68 20 6f 72 20 75 73 69 6e 67 20 69  rough or using i
33740 6e 20 73 6f 6d 65 20 6f 74 68 65 72 20 77 61 79  n some other way
33750 2c 20 74 68 69 73 0a 20 20 20 20 20 20 2a 2a 20  , this.      ** 
33760 63 61 6e 20 62 65 20 70 72 6f 62 6c 65 6d 61 74  can be problemat
33770 69 63 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ic..      */.   
33780 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
33790 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
337a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
337b0 20 3d 20 66 72 65 65 50 61 67 65 32 28 70 42 74   = freePage2(pBt
337c0 2c 20 70 4f 76 66 6c 2c 20 6f 76 66 6c 50 67 6e  , pOvfl, ovflPgn
337d0 6f 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  o);.    }..    i
337e0 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20 20 20 20  f( pOvfl ){.    
337f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
33800 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61  ref(pOvfl->pDbPa
33810 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
33820 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
33830 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67 6e 6f 20  c;.    ovflPgno 
33840 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  = iNext;.  }.  r
33850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
33860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
33870 20 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e   the byte sequen
33880 63 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ce used to repre
33890 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70  sent a cell on p
338a0 61 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64  age pPage.** and
338b0 20 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65   write that byte
338c0 20 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70   sequence into p
338d0 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f  Cell[].  Overflo
338e0 77 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61  w pages are.** a
338f0 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c  llocated and fil
33900 6c 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73  led in as necess
33910 61 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ary.  The callin
33920 67 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69  g procedure.** i
33930 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
33940 72 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75  r making sure su
33950 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68  fficient space h
33960 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  as been allocate
33970 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d  d.** for pCell[]
33980 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
33990 74 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  t pCell does not
339a0 20 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20   necessary need 
339b0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
339c0 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
339d0 61 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67  area.  pCell mig
339e0 68 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65  ht point to some
339f0 20 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61   temporary stora
33a00 67 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69  ge.  The cell wi
33a10 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75  ll.** be constru
33a20 63 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d  cted in this tem
33a30 70 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e  porary area then
33a40 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61   copied into pPa
33a50 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74  ge->aData.** lat
33a60 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
33a70 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20  t fillInCell(.  
33a80 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
33a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33aa0 2a 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  * The page that 
33ab0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c  contains the cel
33ac0 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  l */.  unsigned 
33ad0 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20  char *pCell,    
33ae0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74        /* Complet
33af0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65  e text of the ce
33b00 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 74  ll */.  const Bt
33b10 72 65 65 50 61 79 6c 6f 61 64 20 2a 70 58 2c 20  reePayload *pX, 
33b20 20 20 20 20 20 20 20 2f 2a 20 50 61 79 6c 6f 61         /* Payloa
33b30 64 20 77 69 74 68 20 77 68 69 63 68 20 74 6f 20  d with which to 
33b40 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 63 65  construct the ce
33b50 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ll */.  int *pnS
33b60 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
33b70 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
33b80 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
33b90 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
33ba0 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
33bb0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
33bc0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
33bd0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
33be0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
33bf0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
33c00 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
33c10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
33c20 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
33c30 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
33c40 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
33c50 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
33c60 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
33c70 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
33c80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
33c90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
33ca0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
33cb0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
33cc0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
33cd0 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
33ce0 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
33cf0 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
33d00 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
33d10 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
33d20 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
33d30 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
33d40 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
33d50 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
33d60 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
33d70 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
33d80 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
33d90 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
33da0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
33db0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
33dc0 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
33dd0 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
33de0 64 65 72 20 3d 20 70 50 61 67 65 2d 3e 63 68 69  der = pPage->chi
33df0 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 69 66 28  ldPtrSize;.  if(
33e00 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
33e10 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d  {.    nPayload =
33e20 20 70 58 2d 3e 6e 44 61 74 61 20 2b 20 70 58 2d   pX->nData + pX-
33e30 3e 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 53 72 63  >nZero;.    pSrc
33e40 20 3d 20 70 58 2d 3e 70 44 61 74 61 3b 0a 20 20   = pX->pData;.  
33e50 20 20 6e 53 72 63 20 3d 20 70 58 2d 3e 6e 44 61    nSrc = pX->nDa
33e60 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
33e70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 4c 65 61  pPage->intKeyLea
33e80 66 20 29 3b 20 2f 2a 20 66 69 6c 6c 49 6e 43 65  f ); /* fillInCe
33e90 6c 6c 28 29 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ll() only called
33ea0 20 66 6f 72 20 6c 65 61 76 65 73 20 2a 2f 0a 20   for leaves */. 
33eb0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75     nHeader += pu
33ec0 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c  tVarint32(&pCell
33ed0 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 50 61 79 6c  [nHeader], nPayl
33ee0 6f 61 64 29 3b 0a 20 20 20 20 6e 48 65 61 64 65  oad);.    nHeade
33ef0 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26  r += putVarint(&
33f00 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20  pCell[nHeader], 
33f10 2a 28 75 36 34 2a 29 26 70 58 2d 3e 6e 4b 65 79  *(u64*)&pX->nKey
33f20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
33f30 61 73 73 65 72 74 28 20 70 58 2d 3e 6e 4b 65 79  assert( pX->nKey
33f40 3c 3d 30 78 37 66 66 66 66 66 66 66 20 26 26 20  <=0x7fffffff && 
33f50 70 58 2d 3e 70 4b 65 79 21 3d 30 20 29 3b 0a 20  pX->pKey!=0 );. 
33f60 20 20 20 6e 53 72 63 20 3d 20 6e 50 61 79 6c 6f     nSrc = nPaylo
33f70 61 64 20 3d 20 28 69 6e 74 29 70 58 2d 3e 6e 4b  ad = (int)pX->nK
33f80 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
33f90 58 2d 3e 70 4b 65 79 3b 0a 20 20 20 20 6e 48 65  X->pKey;.    nHe
33fa0 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e  ader += putVarin
33fb0 74 33 32 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  t32(&pCell[nHead
33fc0 65 72 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b 0a  er], nPayload);.
33fd0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c    }.  .  /* Fill
33fe0 20 69 6e 20 74 68 65 20 70 61 79 6c 6f 61 64 20   in the payload 
33ff0 2a 2f 0a 20 20 69 66 28 20 6e 50 61 79 6c 6f 61  */.  if( nPayloa
34000 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
34010 61 6c 20 29 7b 0a 20 20 20 20 6e 20 3d 20 6e 48  al ){.    n = nH
34020 65 61 64 65 72 20 2b 20 6e 50 61 79 6c 6f 61 64  eader + nPayload
34030 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
34040 6e 3d 3d 33 20 29 3b 0a 20 20 20 20 74 65 73 74  n==3 );.    test
34050 63 61 73 65 28 20 6e 3d 3d 34 20 29 3b 0a 20 20  case( n==4 );.  
34060 20 20 69 66 28 20 6e 3c 34 20 29 20 6e 20 3d 20    if( n<4 ) n = 
34070 34 3b 0a 20 20 20 20 2a 70 6e 53 69 7a 65 20 3d  4;.    *pnSize =
34080 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65 66   n;.    spaceLef
34090 74 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  t = nPayload;.  
340a0 20 20 70 50 72 69 6f 72 20 3d 20 70 43 65 6c 6c    pPrior = pCell
340b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
340c0 6e 74 20 6d 6e 20 3d 20 70 50 61 67 65 2d 3e 6d  nt mn = pPage->m
340d0 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6e 20 3d  inLocal;.    n =
340e0 20 6d 6e 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20   mn + (nPayload 
340f0 2d 20 6d 6e 29 20 25 20 28 70 50 61 67 65 2d 3e  - mn) % (pPage->
34100 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
34110 2d 20 34 29 3b 0a 20 20 20 20 74 65 73 74 63 61  - 4);.    testca
34120 73 65 28 20 6e 3d 3d 70 50 61 67 65 2d 3e 6d 61  se( n==pPage->ma
34130 78 4c 6f 63 61 6c 20 29 3b 0a 20 20 20 20 74 65  xLocal );.    te
34140 73 74 63 61 73 65 28 20 6e 3d 3d 70 50 61 67 65  stcase( n==pPage
34150 2d 3e 6d 61 78 4c 6f 63 61 6c 2b 31 20 29 3b 0a  ->maxLocal+1 );.
34160 20 20 20 20 69 66 28 20 6e 20 3e 20 70 50 61 67      if( n > pPag
34170 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 29 20 6e 20  e->maxLocal ) n 
34180 3d 20 6d 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c  = mn;.    spaceL
34190 65 66 74 20 3d 20 6e 3b 0a 20 20 20 20 2a 70 6e  eft = n;.    *pn
341a0 53 69 7a 65 20 3d 20 6e 20 2b 20 6e 48 65 61 64  Size = n + nHead
341b0 65 72 20 2b 20 34 3b 0a 20 20 20 20 70 50 72 69  er + 4;.    pPri
341c0 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61  or = &pCell[nHea
341d0 64 65 72 2b 6e 5d 3b 0a 20 20 7d 0a 20 20 70 50  der+n];.  }.  pP
341e0 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
341f0 6e 48 65 61 64 65 72 5d 3b 0a 0a 20 20 2f 2a 20  nHeader];..  /* 
34200 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 76 61  At this point va
34210 72 69 61 62 6c 65 73 20 73 68 6f 75 6c 64 20 62  riables should b
34220 65 20 73 65 74 20 61 73 20 66 6f 6c 6c 6f 77 73  e set as follows
34230 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 6e 50  :.  **.  **   nP
34240 61 79 6c 6f 61 64 20 20 20 20 20 20 20 20 20 20  ayload          
34250 20 54 6f 74 61 6c 20 70 61 79 6c 6f 61 64 20 73   Total payload s
34260 69 7a 65 20 69 6e 20 62 79 74 65 73 0a 20 20 2a  ize in bytes.  *
34270 2a 20 20 20 70 50 61 79 6c 6f 61 64 20 20 20 20  *   pPayload    
34280 20 20 20 20 20 20 20 42 65 67 69 6e 20 77 72 69         Begin wri
34290 74 69 6e 67 20 70 61 79 6c 6f 61 64 20 68 65 72  ting payload her
342a0 65 0a 20 20 2a 2a 20 20 20 73 70 61 63 65 4c 65  e.  **   spaceLe
342b0 66 74 20 20 20 20 20 20 20 20 20 20 53 70 61 63  ft          Spac
342c0 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70  e available at p
342d0 50 61 79 6c 6f 61 64 2e 20 20 49 66 20 6e 50 61  Payload.  If nPa
342e0 79 6c 6f 61 64 3e 73 70 61 63 65 4c 65 66 74 2c  yload>spaceLeft,
342f0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
34300 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
34310 6d 65 61 6e 73 20 63 6f 6e 74 65 6e 74 20 6d 75  means content mu
34320 73 74 20 73 70 69 6c 6c 20 69 6e 74 6f 20 6f 76  st spill into ov
34330 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 20 20  erflow pages..  
34340 2a 2a 20 20 20 2a 70 6e 53 69 7a 65 20 20 20 20  **   *pnSize    
34350 20 20 20 20 20 20 20 20 53 69 7a 65 20 6f 66 20          Size of 
34360 74 68 65 20 6c 6f 63 61 6c 20 63 65 6c 6c 20 28  the local cell (
34370 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 6f 76 65  not counting ove
34380 72 66 6c 6f 77 20 70 61 67 65 73 29 0a 20 20 2a  rflow pages).  *
34390 2a 20 20 20 70 50 72 69 6f 72 20 20 20 20 20 20  *   pPrior      
343a0 20 20 20 20 20 20 20 57 68 65 72 65 20 74 6f 20         Where to 
343b0 77 72 69 74 65 20 74 68 65 20 70 67 6e 6f 20 6f  write the pgno o
343c0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
343d0 66 6c 6f 77 20 70 61 67 65 0a 20 20 2a 2a 0a 20  flow page.  **. 
343e0 20 2a 2a 20 55 73 65 20 61 20 63 61 6c 6c 20 74   ** Use a call t
343f0 6f 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c  o btreeParseCell
34400 50 74 72 28 29 20 74 6f 20 76 65 72 69 66 79 20  Ptr() to verify 
34410 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73 20  that the values 
34420 61 62 6f 76 65 0a 20 20 2a 2a 20 77 65 72 65 20  above.  ** were 
34430 63 6f 6d 70 75 74 65 64 20 63 6f 72 72 65 63 74  computed correct
34440 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 20 53 51 4c  ly..  */.#if SQL
34450 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 0a 20 20  ITE_DEBUG.  {.  
34460 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
34470 0a 20 20 20 20 70 50 61 67 65 2d 3e 78 50 61 72  .    pPage->xPar
34480 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  seCell(pPage, pC
34490 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
344a0 20 61 73 73 65 72 74 28 20 6e 48 65 61 64 65 72   assert( nHeader
344b0 3d 3d 28 69 6e 74 29 28 69 6e 66 6f 2e 70 50 61  ==(int)(info.pPa
344c0 79 6c 6f 61 64 20 2d 20 70 43 65 6c 6c 29 20 29  yload - pCell) )
344d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 6e  ;.    assert( in
344e0 66 6f 2e 6e 4b 65 79 3d 3d 70 58 2d 3e 6e 4b 65  fo.nKey==pX->nKe
344f0 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  y );.    assert(
34500 20 2a 70 6e 53 69 7a 65 20 3d 3d 20 69 6e 66 6f   *pnSize == info
34510 2e 6e 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  .nSize );.    as
34520 73 65 72 74 28 20 73 70 61 63 65 4c 65 66 74 20  sert( spaceLeft 
34530 3d 3d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  == info.nLocal )
34540 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
34550 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 79  /* Write the pay
34560 6c 6f 61 64 20 69 6e 74 6f 20 74 68 65 20 6c 6f  load into the lo
34570 63 61 6c 20 43 65 6c 6c 20 61 6e 64 20 61 6e 79  cal Cell and any
34580 20 65 78 74 72 61 20 69 6e 74 6f 20 6f 76 65 72   extra into over
34590 66 6c 6f 77 20 70 61 67 65 73 20 2a 2f 0a 20 20  flow pages */.  
345a0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
345b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
345c0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
345d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
345e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
345f0 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
34600 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
34610 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
34620 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
34630 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
34640 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
34650 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
34660 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
34670 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
34680 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
34690 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
346a0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
346b0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
346c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
346d0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
346e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
346f0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
34700 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
34710 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
34720 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
34730 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
34740 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
34750 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
34760 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
34770 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
34780 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
34790 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
347a0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
347b0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
347c0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
347d0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
347e0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
347f0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
34800 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
34810 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
34820 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
34830 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
34840 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
34850 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
34860 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
34870 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
34880 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
34890 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
348a0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
348b0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
348c0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
348d0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
348e0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
348f0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
34900 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
34910 69 7a 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ized values and 
34920 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
34930 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
34940 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
34950 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
34960 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
34970 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
34980 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34990 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
349a0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
349b0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
349c0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
349d0 20 20 20 20 20 70 74 72 6d 61 70 50 75 74 28 70       ptrmapPut(p
349e0 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54  Bt, pgnoOvfl, eT
349f0 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70 2c  ype, pgnoPtrmap,
34a00 20 26 72 63 29 3b 0a 20 20 20 20 20 20 20 20 69   &rc);.        i
34a10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
34a20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
34a30 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
34a40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
34a50 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
34a60 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
34a70 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
34a80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
34a90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
34aa0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
34ab0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
34ac0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
34ad0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
34ae0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
34af0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
34b00 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
34b10 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
34b20 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
34b30 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
34b40 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
34b50 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
34b60 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
34b70 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
34b80 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
34b90 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
34ba0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
34bb0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
34bc0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
34bd0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
34be0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
34bf0 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
34c00 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
34c10 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
34c20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
34c30 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
34c40 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34c50 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
34c60 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
34c70 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
34c80 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
34c90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
34ca0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
34cb0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
34cc0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
34cd0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
34ce0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
34cf0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
34d00 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
34d10 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
34d20 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
34d30 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
34d40 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
34d50 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
34d60 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
34d70 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
34d80 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
34d90 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
34da0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
34db0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
34dc0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
34dd0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
34de0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
34df0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
34e00 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
34e10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
34e20 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
34e30 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
34e40 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
34e50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
34e60 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
34e70 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
34e80 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
34e90 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
34ea0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
34eb0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
34ec0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
34ed0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
34ee0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
34ef0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
34f00 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
34f10 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
34f20 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
34f30 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
34f40 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
34f50 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
34f60 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
34f70 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
34f80 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
34f90 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
34fa0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
34fb0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
34fc0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
34fd0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
34fe0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
34ff0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
35000 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
35010 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
35020 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
35030 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 7d 0a 20  Left -= n;.  }. 
35040 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f   releasePage(pTo
35050 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75  Release);.  retu
35060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
35070 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
35080 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
35090 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
350a0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
350b0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
350c0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
350d0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
350e0 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
350f0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
35100 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
35110 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
35120 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
35130 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
35140 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
35150 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
35160 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
35170 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
35180 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
35190 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
351a0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
351b0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
351c0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
351d0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
351e0 73 7a 2c 20 69 6e 74 20 2a 70 52 43 29 7b 0a 20  sz, int *pRC){. 
351f0 20 75 33 32 20 70 63 3b 20 20 20 20 20 20 20 20   u32 pc;        
35200 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 65   /* Offset to ce
35210 6c 6c 20 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65  ll content of ce
35220 6c 6c 20 62 65 69 6e 67 20 64 65 6c 65 74 65 64  ll being deleted
35230 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
35240 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e        /* pPage->
35250 61 44 61 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70  aData */.  u8 *p
35260 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73  tr;        /* Us
35270 65 64 20 74 6f 20 6d 6f 76 65 20 62 79 74 65 73  ed to move bytes
35280 20 61 72 6f 75 6e 64 20 77 69 74 68 69 6e 20 64   around within d
35290 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ata[] */.  int r
352a0 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  c;         /* Th
352b0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  e return code */
352c0 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
352d0 20 20 20 2f 2a 20 42 65 67 69 6e 6e 69 6e 67 20     /* Beginning 
352e0 6f 66 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  of the header.  
352f0 30 20 6d 6f 73 74 20 70 61 67 65 73 2e 20 20 31  0 most pages.  1
35300 30 30 20 70 61 67 65 20 31 20 2a 2f 0a 0a 20 20  00 page 1 */..  
35310 69 66 28 20 2a 70 52 43 20 29 20 72 65 74 75 72  if( *pRC ) retur
35320 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  n;..  assert( id
35330 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
35340 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
35350 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
35360 20 7c 7c 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65   || sz==cellSize
35370 28 70 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a  (pPage, idx) );.
35380 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
35390 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
353a0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
353b0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
353c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
353d0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
353e0 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d  tex) );.  data =
353f0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
35400 20 70 74 72 20 3d 20 26 70 50 61 67 65 2d 3e 61   ptr = &pPage->a
35410 43 65 6c 6c 49 64 78 5b 32 2a 69 64 78 5d 3b 0a  CellIdx[2*idx];.
35420 20 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28    pc = get2byte(
35430 70 74 72 29 3b 0a 20 20 68 64 72 20 3d 20 70 50  ptr);.  hdr = pP
35440 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
35450 20 20 74 65 73 74 63 61 73 65 28 20 70 63 3d 3d    testcase( pc==
35460 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
35470 64 72 2b 35 5d 29 20 29 3b 0a 20 20 74 65 73 74  dr+5]) );.  test
35480 63 61 73 65 28 20 70 63 2b 73 7a 3d 3d 70 50 61  case( pc+sz==pPa
35490 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
354a0 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 70 63 20  ize );.  if( pc 
354b0 3c 20 28 75 33 32 29 67 65 74 32 62 79 74 65 28  < (u32)get2byte(
354c0 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 7c 7c  &data[hdr+5]) ||
354d0 20 70 63 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e   pc+sz > pPage->
354e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
354f0 29 7b 0a 20 20 20 20 2a 70 52 43 20 3d 20 53 51  ){.    *pRC = SQ
35500 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
35510 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
35520 20 7d 0a 20 20 72 63 20 3d 20 66 72 65 65 53 70   }.  rc = freeSp
35530 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
35540 7a 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  z);.  if( rc ){.
35550 20 20 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20      *pRC = rc;. 
35560 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
35570 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
35580 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
35590 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  ell==0 ){.    me
355a0 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31  mset(&data[hdr+1
355b0 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 64 61  ], 0, 4);.    da
355c0 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
355d0 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
355e0 61 5b 68 64 72 2b 35 5d 2c 20 70 50 61 67 65 2d  a[hdr+5], pPage-
355f0 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
35600 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
35610 72 65 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  ree = pPage->pBt
35620 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 70  ->usableSize - p
35630 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 0a  Page->hdrOffset.
35640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35650 20 20 20 20 20 20 20 2d 20 70 50 61 67 65 2d 3e         - pPage->
35660 63 68 69 6c 64 50 74 72 53 69 7a 65 20 2d 20 38  childPtrSize - 8
35670 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d  ;.  }else{.    m
35680 65 6d 6d 6f 76 65 28 70 74 72 2c 20 70 74 72 2b  emmove(ptr, ptr+
35690 32 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43 65  2, 2*(pPage->nCe
356a0 6c 6c 20 2d 20 69 64 78 29 29 3b 0a 20 20 20 20  ll - idx));.    
356b0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
356c0 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  dr+3], pPage->nC
356d0 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ell);.    pPage-
356e0 3e 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 7d  >nFree += 2;.  }
356f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
35700 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70   a new cell on p
35710 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64  Page at cell ind
35720 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70  ex "i".  pCell p
35730 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20  oints to the.** 
35740 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63  content of the c
35750 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ell..**.** If th
35760 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77  e cell content w
35770 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70  ill fit on the p
35780 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74  age, then put it
35790 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a   there.  If it.*
357a0 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20  * will not fit, 
357b0 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79  then make a copy
357c0 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   of the cell con
357d0 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20  tent into pTemp 
357e0 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e  if.** pTemp is n
357f0 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64  ot null.  Regard
35800 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61  less of pTemp, a
35810 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e  llocate a new en
35820 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d  try.** in pPage-
35830 3e 61 70 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  >apOvfl[] and ma
35840 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
35850 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
35860 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
35870 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
35880 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
35890 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
358a0 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
358b0 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
358c0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
358d0 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
358e0 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
358f0 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
35900 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 52 43 20  ted..**.** *pRC 
35910 6d 75 73 74 20 62 65 20 53 51 4c 49 54 45 5f 4f  must be SQLITE_O
35920 4b 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K when this rout
35930 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
35940 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
35950 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d 50  sertCell(.  MemP
35960 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
35970 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63 68   Page into which
35980 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67 20   we are copying 
35990 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20 20  */.  int i,     
359a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 65         /* New ce
359b0 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 69  ll becomes the i
359c0 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65 20  -th cell of the 
359d0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 43  page */.  u8 *pC
359e0 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 43  ell,        /* C
359f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e 65  ontent of the ne
35a00 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  w cell */.  int 
35a10 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sz,           /*
35a20 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   Bytes of conten
35a30 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20 20  t in pCell */.  
35a40 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20 20  u8 *pTemp,      
35a50 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
35a60 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65 6c  e space for pCel
35a70 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f 0a  l, if needed */.
35a80 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
35a90 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65      /* If non-ze
35aa0 72 6f 2c 20 72 65 70 6c 61 63 65 20 66 69 72 73  ro, replace firs
35ab0 74 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  t 4 bytes with t
35ac0 68 69 73 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69  his value */.  i
35ad0 6e 74 20 2a 70 52 43 20 20 20 20 20 20 20 20 20  nt *pRC         
35ae0 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 77 72 69   /* Read and wri
35af0 74 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 66  te return code f
35b00 72 6f 6d 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  rom here */.){. 
35b10 20 69 6e 74 20 69 64 78 20 3d 20 30 3b 20 20 20   int idx = 0;   
35b20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
35b30 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f  rite new cell co
35b40 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20  ntent in data[] 
35b50 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
35b60 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
35b70 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
35b80 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
35b90 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   The content of 
35ba0 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a  the whole page *
35bb0 2f 0a 20 20 75 38 20 2a 70 49 6e 73 3b 20 20 20  /.  u8 *pIns;   
35bc0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
35bd0 6e 74 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65  nt in pPage->aCe
35be0 6c 6c 49 64 78 5b 5d 20 77 68 65 72 65 20 6e 6f  llIdx[] where no
35bf0 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 2a   cell inserted *
35c00 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 52  /..  assert( *pR
35c10 43 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  C==SQLITE_OK );.
35c20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
35c30 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
35c40 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
35c50 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
35c60 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70  MX_CELL(pPage->p
35c70 42 74 29 3c 3d 31 30 39 32 31 20 29 3b 0a 20 20  Bt)<=10921 );.  
35c80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
35c90 43 65 6c 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50  Cell<=MX_CELL(pP
35ca0 61 67 65 2d 3e 70 42 74 29 20 7c 7c 20 43 4f 52  age->pBt) || COR
35cb0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73  RUPT_DB );.  ass
35cc0 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
35cd0 72 66 6c 6f 77 3c 3d 41 72 72 61 79 53 69 7a 65  rflow<=ArraySize
35ce0 28 70 50 61 67 65 2d 3e 61 70 4f 76 66 6c 29 20  (pPage->apOvfl) 
35cf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 41 72 72  );.  assert( Arr
35d00 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 70  aySize(pPage->ap
35d10 4f 76 66 6c 29 3d 3d 41 72 72 61 79 53 69 7a 65  Ovfl)==ArraySize
35d20 28 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 29 20  (pPage->aiOvfl) 
35d30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
35d40 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
35d50 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
35d60 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68 65 20 63  x) );.  /* The c
35d70 65 6c 6c 20 73 68 6f 75 6c 64 20 6e 6f 72 6d 61  ell should norma
35d80 6c 6c 79 20 62 65 20 73 69 7a 65 64 20 63 6f 72  lly be sized cor
35d90 72 65 63 74 6c 79 2e 20 20 48 6f 77 65 76 65 72  rectly.  However
35da0 2c 20 77 68 65 6e 20 6d 6f 76 69 6e 67 20 61 0a  , when moving a.
35db0 20 20 2a 2a 20 6d 61 6c 66 6f 72 6d 65 64 20 63    ** malformed c
35dc0 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 20  ell from a leaf 
35dd0 70 61 67 65 20 74 6f 20 61 6e 20 69 6e 74 65 72  page to an inter
35de0 69 6f 72 20 70 61 67 65 2c 20 69 66 20 74 68 65  ior page, if the
35df0 20 63 65 6c 6c 20 73 69 7a 65 0a 20 20 2a 2a 20   cell size.  ** 
35e00 77 61 6e 74 65 64 20 74 6f 20 62 65 20 6c 65 73  wanted to be les
35e10 73 20 74 68 61 6e 20 34 20 62 75 74 20 67 6f 74  s than 4 but got
35e20 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 34   rounded up to 4
35e30 20 6f 6e 20 74 68 65 20 6c 65 61 66 2c 20 74 68   on the leaf, th
35e40 65 6e 20 73 69 7a 65 0a 20 20 2a 2a 20 6d 69 67  en size.  ** mig
35e50 68 74 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  ht be less than 
35e60 38 20 28 6c 65 61 66 2d 73 69 7a 65 20 2b 20 70  8 (leaf-size + p
35e70 6f 69 6e 74 65 72 29 20 6f 6e 20 74 68 65 20 69  ointer) on the i
35e80 6e 74 65 72 69 6f 72 20 6e 6f 64 65 2e 20 20 48  nterior node.  H
35e90 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20 74 65  ence.  ** the te
35ea0 72 6d 20 61 66 74 65 72 20 74 68 65 20 7c 7c 20  rm after the || 
35eb0 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
35ec0 20 61 73 73 65 72 74 28 29 2e 20 2a 2f 0a 20 20   assert(). */.  
35ed0 61 73 73 65 72 74 28 20 73 7a 3d 3d 70 50 61 67  assert( sz==pPag
35ee0 65 2d 3e 78 43 65 6c 6c 53 69 7a 65 28 70 50 61  e->xCellSize(pPa
35ef0 67 65 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 28 73  ge, pCell) || (s
35f00 7a 3d 3d 38 20 26 26 20 69 43 68 69 6c 64 3e 30  z==8 && iChild>0
35f10 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
35f20 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
35f30 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
35f40 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
35f50 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
35f60 79 28 70 54 65 6d 70 2c 20 70 43 65 6c 6c 2c 20  y(pTemp, pCell, 
35f70 73 7a 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  sz);.      pCell
35f80 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
35f90 20 20 20 20 69 66 28 20 69 43 68 69 6c 64 20 29      if( iChild )
35fa0 7b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  {.      put4byte
35fb0 28 70 43 65 6c 6c 2c 20 69 43 68 69 6c 64 29 3b  (pCell, iChild);
35fc0 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70  .    }.    j = p
35fd0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b  Page->nOverflow+
35fe0 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a  +;.    assert( j
35ff0 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 70 50  <(int)(sizeof(pP
36000 61 67 65 2d 3e 61 70 4f 76 66 6c 29 2f 73 69 7a  age->apOvfl)/siz
36010 65 6f 66 28 70 50 61 67 65 2d 3e 61 70 4f 76 66  eof(pPage->apOvf
36020 6c 5b 30 5d 29 29 20 29 3b 0a 20 20 20 20 70 50  l[0])) );.    pP
36030 61 67 65 2d 3e 61 70 4f 76 66 6c 5b 6a 5d 20 3d  age->apOvfl[j] =
36040 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
36050 65 2d 3e 61 69 4f 76 66 6c 5b 6a 5d 20 3d 20 28  e->aiOvfl[j] = (
36060 75 31 36 29 69 3b 0a 0a 20 20 20 20 2f 2a 20 57  u16)i;..    /* W
36070 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  hen multiple ove
36080 72 66 6c 6f 77 73 20 6f 63 63 75 72 2c 20 74 68  rflows occur, th
36090 65 79 20 61 72 65 20 61 6c 77 61 79 73 20 73 65  ey are always se
360a0 71 75 65 6e 74 69 61 6c 20 61 6e 64 20 69 6e 0a  quential and in.
360b0 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20 6f 72      ** sorted or
360c0 64 65 72 2e 20 20 54 68 69 73 20 69 6e 76 61 72  der.  This invar
360d0 69 61 6e 74 73 20 61 72 69 73 65 20 62 65 63 61  iants arise beca
360e0 75 73 65 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65  use multiple ove
360f0 72 66 6c 6f 77 73 20 63 61 6e 0a 20 20 20 20 2a  rflows can.    *
36100 2a 20 6f 6e 6c 79 20 6f 63 63 75 72 20 77 68 65  * only occur whe
36110 6e 20 69 6e 73 65 72 74 69 6e 67 20 64 69 76 69  n inserting divi
36120 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 74  der cells into t
36130 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 64  he parent page d
36140 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 62 61 6c  uring.    ** bal
36150 61 6e 63 69 6e 67 2c 20 61 6e 64 20 74 68 65 20  ancing, and the 
36160 64 69 76 69 64 65 72 73 20 61 72 65 20 61 64 6a  dividers are adj
36170 61 63 65 6e 74 20 61 6e 64 20 73 6f 72 74 65 64  acent and sorted
36180 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
36190 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 70 50 61  ert( j==0 || pPa
361a0 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a 2d 31 5d 3c  ge->aiOvfl[j-1]<
361b0 28 75 31 36 29 69 20 29 3b 20 2f 2a 20 4f 76 65  (u16)i ); /* Ove
361c0 72 66 6c 6f 77 73 20 69 6e 20 73 6f 72 74 65 64  rflows in sorted
361d0 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 61 73   order */.    as
361e0 73 65 72 74 28 20 6a 3d 3d 30 20 7c 7c 20 69 3d  sert( j==0 || i=
361f0 3d 70 50 61 67 65 2d 3e 61 69 4f 76 66 6c 5b 6a  =pPage->aiOvfl[j
36200 2d 31 5d 2b 31 20 29 3b 20 20 20 2f 2a 20 4f 76  -1]+1 );   /* Ov
36210 65 72 66 6c 6f 77 73 20 61 72 65 20 73 65 71 75  erflows are sequ
36220 65 6e 74 69 61 6c 20 2a 2f 0a 20 20 7d 65 6c 73  ential */.  }els
36230 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  e{.    int rc = 
36240 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
36250 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
36260 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36270 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36280 20 20 2a 70 52 43 20 3d 20 72 63 3b 0a 20 20 20    *pRC = rc;.   
36290 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
362a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
362b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
362c0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
362d0 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74 61  age) );.    data
362e0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
362f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 26 64 61  .    assert( &da
36300 74 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ta[pPage->cellOf
36310 66 73 65 74 5d 3d 3d 70 50 61 67 65 2d 3e 61 43  fset]==pPage->aC
36320 65 6c 6c 49 64 78 20 29 3b 0a 20 20 20 20 72 63  ellIdx );.    rc
36330 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65   = allocateSpace
36340 28 70 50 61 67 65 2c 20 73 7a 2c 20 26 69 64 78  (pPage, sz, &idx
36350 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
36360 20 2a 70 52 43 20 3d 20 72 63 3b 20 72 65 74 75   *pRC = rc; retu
36370 72 6e 3b 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65  rn; }.    /* The
36380 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 29   allocateSpace()
36390 20 72 6f 75 74 69 6e 65 20 67 75 61 72 61 6e 74   routine guarant
363a0 65 65 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ees the followin
363b0 67 20 70 72 6f 70 65 72 74 69 65 73 0a 20 20 20  g properties.   
363c0 20 2a 2a 20 69 66 20 69 74 20 72 65 74 75 72 6e   ** if it return
363d0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 2a  s successfully *
363e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  /.    assert( id
363f0 78 20 3e 3d 20 30 20 29 3b 0a 20 20 20 20 61 73  x >= 0 );.    as
36400 73 65 72 74 28 20 69 64 78 20 3e 3d 20 70 50 61  sert( idx >= pPa
36410 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32  ge->cellOffset+2
36420 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 32 20  *pPage->nCell+2 
36430 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
36440 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
36450 2b 73 7a 20 3c 3d 20 28 69 6e 74 29 70 50 61 67  +sz <= (int)pPag
36460 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
36470 7a 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ze );.    pPage-
36480 3e 6e 46 72 65 65 20 2d 3d 20 28 75 31 36 29 28  >nFree -= (u16)(
36490 32 20 2b 20 73 7a 29 3b 0a 20 20 20 20 6d 65 6d  2 + sz);.    mem
364a0 63 70 79 28 26 64 61 74 61 5b 69 64 78 5d 2c 20  cpy(&data[idx], 
364b0 70 43 65 6c 6c 2c 20 73 7a 29 3b 0a 20 20 20 20  pCell, sz);.    
364c0 69 66 28 20 69 43 68 69 6c 64 20 29 7b 0a 20 20  if( iChild ){.  
364d0 20 20 20 20 70 75 74 34 62 79 74 65 28 26 64 61      put4byte(&da
364e0 74 61 5b 69 64 78 5d 2c 20 69 43 68 69 6c 64 29  ta[idx], iChild)
364f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 73  ;.    }.    pIns
36500 20 3d 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 49   = pPage->aCellI
36510 64 78 20 2b 20 69 2a 32 3b 0a 20 20 20 20 6d 65  dx + i*2;.    me
36520 6d 6d 6f 76 65 28 70 49 6e 73 2b 32 2c 20 70 49  mmove(pIns+2, pI
36530 6e 73 2c 20 32 2a 28 70 50 61 67 65 2d 3e 6e 43  ns, 2*(pPage->nC
36540 65 6c 6c 20 2d 20 69 29 29 3b 0a 20 20 20 20 70  ell - i));.    p
36550 75 74 32 62 79 74 65 28 70 49 6e 73 2c 20 69 64  ut2byte(pIns, id
36560 78 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  x);.    pPage->n
36570 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 2f 2a 20 69  Cell++;.    /* i
36580 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 63 65 6c  ncrement the cel
36590 6c 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69  l count */.    i
365a0 66 28 20 28 2b 2b 64 61 74 61 5b 70 50 61 67 65  f( (++data[pPage
365b0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 34 5d 29 3d  ->hdrOffset+4])=
365c0 3d 30 20 29 20 64 61 74 61 5b 70 50 61 67 65 2d  =0 ) data[pPage-
365d0 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2b 2b 3b  >hdrOffset+3]++;
365e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
365f0 32 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67  2byte(&data[pPag
36600 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  e->hdrOffset+3])
36610 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
36620 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
36630 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36640 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
36650 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
36660 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
36670 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e  cell may contain
36680 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
36690 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20   overflow page. 
366a0 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20  If so, write.   
366b0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20     ** the entry 
366c0 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  for the overflow
366d0 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70   page into the p
366e0 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20  ointer map..    
366f0 20 20 2a 2f 0a 20 20 20 20 20 20 70 74 72 6d 61    */.      ptrma
36700 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
36710 65 2c 20 70 43 65 6c 6c 2c 20 70 52 43 29 3b 0a  e, pCell, pRC);.
36720 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
36730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 43 65 6c 6c  .}../*.** A Cell
36740 41 72 72 61 79 20 6f 62 6a 65 63 74 20 63 6f 6e  Array object con
36750 74 61 69 6e 73 20 61 20 63 61 63 68 65 20 6f 66  tains a cache of
36760 20 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 73 69   pointers and si
36770 7a 65 73 20 66 6f 72 20 61 0a 2a 2a 20 63 6f 6e  zes for a.** con
36780 73 65 63 75 74 69 76 65 20 73 65 71 75 65 6e 63  secutive sequenc
36790 65 20 6f 66 20 63 65 6c 6c 73 20 74 68 61 74 20  e of cells that 
367a0 6d 69 67 68 74 20 62 65 20 68 65 6c 64 20 6f 6e  might be held on
367b0 20 6d 75 6c 74 69 70 6c 65 20 70 61 67 65 73 2e   multiple pages.
367c0 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
367d0 63 74 20 43 65 6c 6c 41 72 72 61 79 20 43 65 6c  ct CellArray Cel
367e0 6c 41 72 72 61 79 3b 0a 73 74 72 75 63 74 20 43  lArray;.struct C
367f0 65 6c 6c 41 72 72 61 79 20 7b 0a 20 20 69 6e 74  ellArray {.  int
36800 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
36810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36820 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
36830 6c 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  l[] */.  MemPage
36840 20 2a 70 52 65 66 3b 20 20 20 20 20 20 20 20 20   *pRef;         
36850 20 2f 2a 20 52 65 66 65 72 65 6e 63 65 20 70 61   /* Reference pa
36860 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
36870 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
36880 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67  /* All cells beg
36890 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20  in balanced */. 
368a0 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20   u16 *szCell;   
368b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
368c0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
368d0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
368e0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  */.};../*.** Mak
368f0 65 20 73 75 72 65 20 74 68 65 20 63 65 6c 6c 20  e sure the cell 
36900 73 69 7a 65 73 20 61 74 20 69 64 78 2c 20 69 64  sizes at idx, id
36910 78 2b 31 2c 20 2e 2e 2e 2c 20 69 64 78 2b 4e 2d  x+1, ..., idx+N-
36920 31 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63  1 have been.** c
36930 6f 6d 70 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  omputed..*/.stat
36940 69 63 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65  ic void populate
36950 43 65 6c 6c 43 61 63 68 65 28 43 65 6c 6c 41 72  CellCache(CellAr
36960 72 61 79 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ray *p, int idx,
36970 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
36980 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78  t( idx>=0 && idx
36990 2b 4e 3c 3d 70 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  +N<=p->nCell );.
369a0 20 20 77 68 69 6c 65 28 20 4e 3e 30 20 29 7b 0a    while( N>0 ){.
369b0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61      assert( p->a
369c0 70 43 65 6c 6c 5b 69 64 78 5d 21 3d 30 20 29 3b  pCell[idx]!=0 );
369d0 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 43 65  .    if( p->szCe
369e0 6c 6c 5b 69 64 78 5d 3d 3d 30 20 29 7b 0a 20 20  ll[idx]==0 ){.  
369f0 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 69 64      p->szCell[id
36a00 78 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43  x] = p->pRef->xC
36a10 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c  ellSize(p->pRef,
36a20 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78 5d 29   p->apCell[idx])
36a30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36a40 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55     assert( CORRU
36a50 50 54 5f 44 42 20 7c 7c 0a 20 20 20 20 20 20 20  PT_DB ||.       
36a60 20 20 20 20 20 20 20 70 2d 3e 73 7a 43 65 6c 6c         p->szCell
36a70 5b 69 64 78 5d 3d 3d 70 2d 3e 70 52 65 66 2d 3e  [idx]==p->pRef->
36a80 78 43 65 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65  xCellSize(p->pRe
36a90 66 2c 20 70 2d 3e 61 70 43 65 6c 6c 5b 69 64 78  f, p->apCell[idx
36aa0 5d 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ]) );.    }.    
36ab0 69 64 78 2b 2b 3b 0a 20 20 20 20 4e 2d 2d 3b 0a  idx++;.    N--;.
36ac0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74    }.}../*.** Ret
36ad0 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20  urn the size of 
36ae0 74 68 65 20 4e 74 68 20 65 6c 65 6d 65 6e 74 20  the Nth element 
36af0 6f 66 20 74 68 65 20 63 65 6c 6c 20 61 72 72 61  of the cell arra
36b00 79 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  y.*/.static SQLI
36b10 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 75 31 36 20  TE_NOINLINE u16 
36b20 63 6f 6d 70 75 74 65 43 65 6c 6c 53 69 7a 65 28  computeCellSize(
36b30 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20 69 6e  CellArray *p, in
36b40 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
36b50 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e 43 65  N>=0 && N<p->nCe
36b60 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
36b70 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d 3d 3d 30 20  p->szCell[N]==0 
36b80 29 3b 0a 20 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e  );.  p->szCell[N
36b90 5d 20 3d 20 70 2d 3e 70 52 65 66 2d 3e 78 43 65  ] = p->pRef->xCe
36ba0 6c 6c 53 69 7a 65 28 70 2d 3e 70 52 65 66 2c 20  llSize(p->pRef, 
36bb0 70 2d 3e 61 70 43 65 6c 6c 5b 4e 5d 29 3b 0a 20  p->apCell[N]);. 
36bc0 20 72 65 74 75 72 6e 20 70 2d 3e 73 7a 43 65 6c   return p->szCel
36bd0 6c 5b 4e 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75  l[N];.}.static u
36be0 31 36 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a  16 cachedCellSiz
36bf0 65 28 43 65 6c 6c 41 72 72 61 79 20 2a 70 2c 20  e(CellArray *p, 
36c00 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74  int N){.  assert
36c10 28 20 4e 3e 3d 30 20 26 26 20 4e 3c 70 2d 3e 6e  ( N>=0 && N<p->n
36c20 43 65 6c 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d  Cell );.  if( p-
36c30 3e 73 7a 43 65 6c 6c 5b 4e 5d 20 29 20 72 65 74  >szCell[N] ) ret
36c40 75 72 6e 20 70 2d 3e 73 7a 43 65 6c 6c 5b 4e 5d  urn p->szCell[N]
36c50 3b 0a 20 20 72 65 74 75 72 6e 20 63 6f 6d 70 75  ;.  return compu
36c60 74 65 43 65 6c 6c 53 69 7a 65 28 70 2c 20 4e 29  teCellSize(p, N)
36c70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 72 61 79  ;.}../*.** Array
36c80 20 61 70 43 65 6c 6c 5b 5d 20 63 6f 6e 74 61 69   apCell[] contai
36c90 6e 73 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 6e  ns pointers to n
36ca0 43 65 6c 6c 20 62 2d 74 72 65 65 20 70 61 67 65  Cell b-tree page
36cb0 20 63 65 6c 6c 73 2e 20 54 68 65 20 0a 2a 2a 20   cells. The .** 
36cc0 73 7a 43 65 6c 6c 5b 5d 20 61 72 72 61 79 20 63  szCell[] array c
36cd0 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65  ontains the size
36ce0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63   in bytes of eac
36cf0 68 20 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e  h cell. This fun
36d00 63 74 69 6f 6e 0a 2a 2a 20 72 65 70 6c 61 63 65  ction.** replace
36d10 73 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  s the current co
36d20 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65 20 70  ntents of page p
36d30 50 67 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74  Pg with the cont
36d40 65 6e 74 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ents of the cell
36d50 0a 2a 2a 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a  .** array..**.**
36d60 20 53 6f 6d 65 20 6f 66 20 74 68 65 20 63 65 6c   Some of the cel
36d70 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6d  ls in apCell[] m
36d80 61 79 20 63 75 72 72 65 6e 74 6c 79 20 62 65 20  ay currently be 
36d90 73 74 6f 72 65 64 20 69 6e 20 70 50 67 2e 20 54  stored in pPg. T
36da0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
36db0 77 6f 72 6b 73 20 61 72 6f 75 6e 64 20 70 72 6f  works around pro
36dc0 62 6c 65 6d 73 20 63 61 75 73 65 64 20 62 79 20  blems caused by 
36dd0 74 68 69 73 20 62 79 20 6d 61 6b 69 6e 67 20 61  this by making a
36de0 20 63 6f 70 79 20 6f 66 20 61 6e 79 20 0a 2a 2a   copy of any .**
36df0 20 73 75 63 68 20 63 65 6c 6c 73 20 62 65 66 6f   such cells befo
36e00 72 65 20 6f 76 65 72 77 72 69 74 69 6e 67 20 74  re overwriting t
36e10 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2a  he page data..**
36e20 0a 2a 2a 20 54 68 65 20 4d 65 6d 50 61 67 65 2e  .** The MemPage.
36e30 6e 46 72 65 65 20 66 69 65 6c 64 20 69 73 20 69  nFree field is i
36e40 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
36e50 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  is function. It 
36e60 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
36e70 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
36e80 20 63 61 6c 6c 65 72 20 74 6f 20 73 65 74 20 69   caller to set i
36e90 74 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a  t correctly..*/.
36ea0 73 74 61 74 69 63 20 69 6e 74 20 72 65 62 75 69  static int rebui
36eb0 6c 64 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  ldPage(.  MemPag
36ec0 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
36ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 64 69            /* Edi
36ee0 74 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  t this page */. 
36ef0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
36f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36f10 20 2f 2a 20 46 69 6e 61 6c 20 6e 75 6d 62 65 72   /* Final number
36f20 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 70 61 67   of cells on pag
36f30 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
36f40 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
36f50 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
36f60 6f 66 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 75 31  of cells */.  u1
36f70 36 20 2a 73 7a 43 65 6c 6c 20 20 20 20 20 20 20  6 *szCell       
36f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f90 20 41 72 72 61 79 20 6f 66 20 63 65 6c 6c 20 73   Array of cell s
36fa0 69 7a 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  izes */.){.  con
36fb0 73 74 20 69 6e 74 20 68 64 72 20 3d 20 70 50 67  st int hdr = pPg
36fc0 2d 3e 68 64 72 4f 66 66 73 65 74 3b 20 20 20 20  ->hdrOffset;    
36fd0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
36fe0 6f 66 20 68 65 61 64 65 72 20 6f 6e 20 70 50 67  of header on pPg
36ff0 20 2a 2f 0a 20 20 75 38 20 2a 20 63 6f 6e 73 74   */.  u8 * const
37000 20 61 44 61 74 61 20 3d 20 70 50 67 2d 3e 61 44   aData = pPg->aD
37010 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
37020 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  * Pointer to dat
37030 61 20 66 6f 72 20 70 50 67 20 2a 2f 0a 20 20 63  a for pPg */.  c
37040 6f 6e 73 74 20 69 6e 74 20 75 73 61 62 6c 65 53  onst int usableS
37050 69 7a 65 20 3d 20 70 50 67 2d 3e 70 42 74 2d 3e  ize = pPg->pBt->
37060 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 75 38  usableSize;.  u8
37070 20 2a 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20   * const pEnd = 
37080 26 61 44 61 74 61 5b 75 73 61 62 6c 65 53 69 7a  &aData[usableSiz
37090 65 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  e];.  int i;.  u
370a0 38 20 2a 70 43 65 6c 6c 70 74 72 20 3d 20 70 50  8 *pCellptr = pP
370b0 67 2d 3e 61 43 65 6c 6c 49 64 78 3b 0a 20 20 75  g->aCellIdx;.  u
370c0 38 20 2a 70 54 6d 70 20 3d 20 73 71 6c 69 74 65  8 *pTmp = sqlite
370d0 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28  3PagerTempSpace(
370e0 70 50 67 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  pPg->pBt->pPager
370f0 29 3b 0a 20 20 75 38 20 2a 70 44 61 74 61 3b 0a  );.  u8 *pData;.
37100 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28  .  i = get2byte(
37110 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  &aData[hdr+5]);.
37120 20 20 6d 65 6d 63 70 79 28 26 70 54 6d 70 5b 69    memcpy(&pTmp[i
37130 5d 2c 20 26 61 44 61 74 61 5b 69 5d 2c 20 75 73  ], &aData[i], us
37140 61 62 6c 65 53 69 7a 65 20 2d 20 69 29 3b 0a 0a  ableSize - i);..
37150 20 20 70 44 61 74 61 20 3d 20 70 45 6e 64 3b 0a    pData = pEnd;.
37160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
37170 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  ll; i++){.    u8
37180 20 2a 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c   *pCell = apCell
37190 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  [i];.    if( SQL
371a0 49 54 45 5f 57 49 54 48 49 4e 28 70 43 65 6c 6c  ITE_WITHIN(pCell
371b0 2c 61 44 61 74 61 2c 70 45 6e 64 29 20 29 7b 0a  ,aData,pEnd) ){.
371c0 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 26 70        pCell = &p
371d0 54 6d 70 5b 70 43 65 6c 6c 20 2d 20 61 44 61 74  Tmp[pCell - aDat
371e0 61 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44  a];.    }.    pD
371f0 61 74 61 20 2d 3d 20 73 7a 43 65 6c 6c 5b 69 5d  ata -= szCell[i]
37200 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 70  ;.    put2byte(p
37210 43 65 6c 6c 70 74 72 2c 20 28 70 44 61 74 61 20  Cellptr, (pData 
37220 2d 20 61 44 61 74 61 29 29 3b 0a 20 20 20 20 70  - aData));.    p
37230 43 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  Cellptr += 2;.  
37240 20 20 69 66 28 20 70 44 61 74 61 20 3c 20 70 43    if( pData < pC
37250 65 6c 6c 70 74 72 20 29 20 72 65 74 75 72 6e 20  ellptr ) return 
37260 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
37270 4b 50 54 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  KPT;.    memcpy(
37280 70 44 61 74 61 2c 20 70 43 65 6c 6c 2c 20 73 7a  pData, pCell, sz
37290 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 61 73  Cell[i]);.    as
372a0 73 65 72 74 28 20 73 7a 43 65 6c 6c 5b 69 5d 3d  sert( szCell[i]=
372b0 3d 70 50 67 2d 3e 78 43 65 6c 6c 53 69 7a 65 28  =pPg->xCellSize(
372c0 70 50 67 2c 20 70 43 65 6c 6c 29 20 7c 7c 20 43  pPg, pCell) || C
372d0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20  ORRUPT_DB );.   
372e0 20 74 65 73 74 63 61 73 65 28 20 73 7a 43 65 6c   testcase( szCel
372f0 6c 5b 69 5d 21 3d 70 50 67 2d 3e 78 43 65 6c 6c  l[i]!=pPg->xCell
37300 53 69 7a 65 28 70 50 67 2c 70 43 65 6c 6c 29 20  Size(pPg,pCell) 
37310 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
37320 20 70 50 67 2d 3e 6e 46 72 65 65 20 66 69 65 6c   pPg->nFree fiel
37330 64 20 69 73 20 6e 6f 77 20 73 65 74 20 69 6e 63  d is now set inc
37340 6f 72 72 65 63 74 6c 79 2e 20 54 68 65 20 63 61  orrectly. The ca
37350 6c 6c 65 72 20 77 69 6c 6c 20 66 69 78 20 69 74  ller will fix it
37360 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 43 65 6c  . */.  pPg->nCel
37370 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 70 50 67  l = nCell;.  pPg
37380 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
37390 0a 0a 20 20 70 75 74 32 62 79 74 65 28 26 61 44  ..  put2byte(&aD
373a0 61 74 61 5b 68 64 72 2b 31 5d 2c 20 30 29 3b 0a  ata[hdr+1], 0);.
373b0 20 20 70 75 74 32 62 79 74 65 28 26 61 44 61 74    put2byte(&aDat
373c0 61 5b 68 64 72 2b 33 5d 2c 20 70 50 67 2d 3e 6e  a[hdr+3], pPg->n
373d0 43 65 6c 6c 29 3b 0a 20 20 70 75 74 32 62 79 74  Cell);.  put2byt
373e0 65 28 26 61 44 61 74 61 5b 68 64 72 2b 35 5d 2c  e(&aData[hdr+5],
373f0 20 70 44 61 74 61 20 2d 20 61 44 61 74 61 29 3b   pData - aData);
37400 0a 20 20 61 44 61 74 61 5b 68 64 72 2b 37 5d 20  .  aData[hdr+7] 
37410 3d 20 30 78 30 30 3b 0a 20 20 72 65 74 75 72 6e  = 0x00;.  return
37420 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
37430 2a 0a 2a 2a 20 41 72 72 61 79 20 61 70 43 65 6c  *.** Array apCel
37440 6c 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 6e 43 65  l[] contains nCe
37450 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 62  ll pointers to b
37460 2d 74 72 65 65 20 63 65 6c 6c 73 2e 20 41 72 72  -tree cells. Arr
37470 61 79 20 73 7a 43 65 6c 6c 0a 2a 2a 20 63 6f 6e  ay szCell.** con
37480 74 61 69 6e 73 20 74 68 65 20 73 69 7a 65 20 69  tains the size i
37490 6e 20 62 79 74 65 73 20 6f 66 20 65 61 63 68 20  n bytes of each 
374a0 73 75 63 68 20 63 65 6c 6c 2e 20 54 68 69 73 20  such cell. This 
374b0 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74  function attempt
374c0 73 20 74 6f 20 0a 2a 2a 20 61 64 64 20 74 68 65  s to .** add the
374d0 20 63 65 6c 6c 73 20 73 74 6f 72 65 64 20 69 6e   cells stored in
374e0 20 74 68 65 20 61 72 72 61 79 20 74 6f 20 70 61   the array to pa
374f0 67 65 20 70 50 67 2e 20 49 66 20 69 74 20 63 61  ge pPg. If it ca
37500 6e 6e 6f 74 20 28 62 65 63 61 75 73 65 20 0a 2a  nnot (because .*
37510 2a 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73  * the page needs
37520 20 74 6f 20 62 65 20 64 65 66 72 61 67 6d 65 6e   to be defragmen
37530 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 63  ted before the c
37540 65 6c 6c 73 20 77 69 6c 6c 20 66 69 74 29 2c 20  ells will fit), 
37550 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 69 73 20 72  non-zero.** is r
37560 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
37570 73 65 2c 20 69 66 20 74 68 65 20 63 65 6c 6c 73  se, if the cells
37580 20 61 72 65 20 61 64 64 65 64 20 73 75 63 63 65   are added succe
37590 73 73 66 75 6c 6c 79 2c 20 7a 65 72 6f 20 69 73  ssfully, zero is
375a0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
375b0 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 65  .** Argument pCe
375c0 6c 6c 70 74 72 20 70 6f 69 6e 74 73 20 74 6f 20  llptr points to 
375d0 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
375e0 69 6e 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e  in the cell-poin
375f0 74 65 72 20 61 72 72 61 79 0a 2a 2a 20 28 70 61  ter array.** (pa
37600 72 74 20 6f 66 20 70 61 67 65 20 70 50 67 29 20  rt of page pPg) 
37610 74 6f 20 70 6f 70 75 6c 61 74 65 2e 20 41 66 74  to populate. Aft
37620 65 72 20 63 65 6c 6c 20 61 70 43 65 6c 6c 5b 30  er cell apCell[0
37630 5d 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ] is written to 
37640 74 68 65 0a 2a 2a 20 70 61 67 65 20 62 6f 64 79  the.** page body
37650 2c 20 61 20 31 36 2d 62 69 74 20 6f 66 66 73 65  , a 16-bit offse
37660 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
37670 70 43 65 6c 6c 70 74 72 2e 20 41 6e 64 20 73 6f  pCellptr. And so
37680 20 6f 6e 2c 20 66 6f 72 20 65 61 63 68 0a 2a 2a   on, for each.**
37690 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 61 72 72   cell in the arr
376a0 61 79 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ay. It is the re
376b0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
376c0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 6e  the caller to en
376d0 73 75 72 65 0a 2a 2a 20 74 68 61 74 20 69 74 20  sure.** that it 
376e0 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 77  is safe to overw
376f0 72 69 74 65 20 74 68 69 73 20 70 61 72 74 20 6f  rite this part o
37700 66 20 74 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74  f the cell-point
37710 65 72 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20  er array..**.** 
37720 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
37730 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 2a 70  on is called, *p
37740 70 44 61 74 61 20 70 6f 69 6e 74 73 20 74 6f 20  pData points to 
37750 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
37760 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 72 65   .** content are
37770 61 20 6f 6e 20 70 61 67 65 20 70 50 67 2e 20 49  a on page pPg. I
37780 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
37790 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 69  e content area i
377a0 73 20 65 78 74 65 6e 64 65 64 2c 0a 2a 2a 20 2a  s extended,.** *
377b0 70 70 44 61 74 61 20 69 73 20 75 70 64 61 74 65  ppData is update
377c0 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  d to point to th
377d0 65 20 6e 65 77 20 73 74 61 72 74 20 6f 66 20 74  e new start of t
377e0 68 65 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 0a  he content area.
377f0 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ** before return
37800 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c  ing..**.** Final
37810 6c 79 2c 20 61 72 67 75 6d 65 6e 74 20 70 42 65  ly, argument pBe
37820 67 69 6e 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  gin points to th
37830 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
37840 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
37850 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 73  .** end of the s
37860 70 61 63 65 20 72 65 71 75 69 72 65 64 20 62 79  pace required by
37870 20 74 68 69 73 20 70 61 67 65 20 66 6f 72 20 74   this page for t
37880 68 65 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20  he cell-pointer 
37890 61 72 65 61 20 28 66 6f 72 0a 2a 2a 20 61 6c 6c  area (for.** all
378a0 20 63 65 6c 6c 73 20 2d 20 6e 6f 74 20 6a 75 73   cells - not jus
378b0 74 20 74 68 6f 73 65 20 69 6e 73 65 72 74 65 64  t those inserted
378c0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
378d0 63 61 6c 6c 29 2e 20 49 66 20 74 68 65 20 63 6f  call). If the co
378e0 6e 74 65 6e 74 0a 2a 2a 20 61 72 65 61 20 6d 75  ntent.** area mu
378f0 73 74 20 62 65 20 65 78 74 65 6e 64 65 64 20 74  st be extended t
37900 6f 20 62 65 66 6f 72 65 20 74 68 69 73 20 70 6f  o before this po
37910 69 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  int in order to 
37920 61 63 63 6f 6d 6f 64 61 74 65 20 61 6c 6c 0a 2a  accomodate all.*
37930 2a 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  * cells in apCel
37940 6c 5b 5d 2c 20 74 68 65 6e 20 74 68 65 20 63 65  l[], then the ce
37950 6c 6c 73 20 64 6f 20 6e 6f 74 20 66 69 74 20 61  lls do not fit a
37960 6e 64 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72  nd non-zero is r
37970 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
37980 69 63 20 69 6e 74 20 70 61 67 65 49 6e 73 65 72  ic int pageInser
37990 74 41 72 72 61 79 28 0a 20 20 4d 65 6d 50 61 67  tArray(.  MemPag
379a0 65 20 2a 70 50 67 2c 20 20 20 20 20 20 20 20 20  e *pPg,         
379b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
379c0 65 20 74 6f 20 61 64 64 20 63 65 6c 6c 73 20 74  e to add cells t
379d0 6f 20 2a 2f 0a 20 20 75 38 20 2a 70 42 65 67 69  o */.  u8 *pBegi
379e0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
379f0 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
37a00 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61 72   cell-pointer ar
37a10 72 61 79 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70  ray */.  u8 **pp
37a20 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
37a30 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
37a40 55 54 3a 20 50 61 67 65 20 63 6f 6e 74 65 6e 74  UT: Page content
37a50 20 2d 61 72 65 61 20 70 6f 69 6e 74 65 72 20 2a   -area pointer *
37a60 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 70 74 72  /.  u8 *pCellptr
37a70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37a80 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
37a90 6f 20 63 65 6c 6c 2d 70 6f 69 6e 74 65 72 20 61  o cell-pointer a
37aa0 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  rea */.  int iFi
37ab0 72 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  rst,            
37ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
37ad0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
37ae0 74 6f 20 61 64 64 20 2a 2f 0a 20 20 69 6e 74 20  to add */.  int 
37af0 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  nCell,          
37b00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37b10 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74  umber of cells t
37b20 6f 20 61 64 64 20 74 6f 20 70 50 67 20 2a 2f 0a  o add to pPg */.
37b30 20 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41    CellArray *pCA
37b40 72 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20  rray            
37b50 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65    /* Array of ce
37b60 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
37b70 69 3b 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  i;.  u8 *aData =
37b80 20 70 50 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75   pPg->aData;.  u
37b90 38 20 2a 70 44 61 74 61 20 3d 20 2a 70 70 44 61  8 *pData = *ppDa
37ba0 74 61 3b 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d  ta;.  int iEnd =
37bb0 20 69 46 69 72 73 74 20 2b 20 6e 43 65 6c 6c 3b   iFirst + nCell;
37bc0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
37bd0 50 54 5f 44 42 20 7c 7c 20 70 50 67 2d 3e 68 64  PT_DB || pPg->hd
37be0 72 4f 66 66 73 65 74 3d 3d 30 20 29 3b 20 20 20  rOffset==0 );   
37bf0 20 2f 2a 20 4e 65 76 65 72 20 63 61 6c 6c 65 64   /* Never called
37c00 20 6f 6e 20 70 61 67 65 20 31 20 2a 2f 0a 20 20   on page 1 */.  
37c10 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c  for(i=iFirst; i<
37c20 69 45 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  iEnd; i++){.    
37c30 69 6e 74 20 73 7a 2c 20 72 63 3b 0a 20 20 20 20  int sz, rc;.    
37c40 75 38 20 2a 70 53 6c 6f 74 3b 0a 20 20 20 20 73  u8 *pSlot;.    s
37c50 7a 20 3d 20 63 61 63 68 65 64 43 65 6c 6c 53 69  z = cachedCellSi
37c60 7a 65 28 70 43 41 72 72 61 79 2c 20 69 29 3b 0a  ze(pCArray, i);.
37c70 20 20 20 20 69 66 28 20 28 61 44 61 74 61 5b 31      if( (aData[1
37c80 5d 3d 3d 30 20 26 26 20 61 44 61 74 61 5b 32 5d  ]==0 && aData[2]
37c90 3d 3d 30 29 20 7c 7c 20 28 70 53 6c 6f 74 20 3d  ==0) || (pSlot =
37ca0 20 70 61 67 65 46 69 6e 64 53 6c 6f 74 28 70 50   pageFindSlot(pP
37cb0 67 2c 73 7a 2c 26 72 63 29 29 3d 3d 30 20 29 7b  g,sz,&rc))==0 ){
37cc0 0a 20 20 20 20 20 20 69 66 28 20 28 70 44 61 74  .      if( (pDat
37cd0 61 20 2d 20 70 42 65 67 69 6e 29 3c 73 7a 20 29  a - pBegin)<sz )
37ce0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
37cf0 20 70 44 61 74 61 20 2d 3d 20 73 7a 3b 0a 20 20   pData -= sz;.  
37d00 20 20 20 20 70 53 6c 6f 74 20 3d 20 70 44 61 74      pSlot = pDat
37d10 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20  a;.    }.    /* 
37d20 70 53 6c 6f 74 20 61 6e 64 20 70 43 41 72 72 61  pSlot and pCArra
37d30 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 20 77 69 6c  y->apCell[i] wil
37d40 6c 20 6e 65 76 65 72 20 6f 76 65 72 6c 61 70 20  l never overlap 
37d50 6f 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  on a well-formed
37d60 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
37d70 2e 20 20 42 75 74 20 74 68 65 79 20 6d 69 67 68  .  But they migh
37d80 74 20 66 6f 72 20 61 20 63 6f 72 72 75 70 74 20  t for a corrupt 
37d90 64 61 74 61 62 61 73 65 2e 20 20 48 65 6e 63 65  database.  Hence
37da0 20 75 73 65 20 6d 65 6d 6d 6f 76 65 28 29 0a 20   use memmove(). 
37db0 20 20 20 2a 2a 20 73 69 6e 63 65 20 6d 65 6d 63     ** since memc
37dc0 70 79 28 29 20 73 65 6e 64 73 20 53 49 47 41 42  py() sends SIGAB
37dd0 4f 52 54 20 77 69 74 68 20 6f 76 65 72 6c 61 70  ORT with overlap
37de0 70 69 6e 67 20 62 75 66 66 65 72 73 20 6f 6e 20  ping buffers on 
37df0 4f 70 65 6e 42 53 44 20 2a 2f 0a 20 20 20 20 61  OpenBSD */.    a
37e00 73 73 65 72 74 28 20 28 70 53 6c 6f 74 2b 73 7a  ssert( (pSlot+sz
37e10 29 3c 3d 70 43 41 72 72 61 79 2d 3e 61 70 43 65  )<=pCArray->apCe
37e20 6c 6c 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 7c  ll[i].         |
37e30 7c 20 70 53 6c 6f 74 3e 3d 28 70 43 41 72 72 61  | pSlot>=(pCArra
37e40 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 2b 73 7a 29  y->apCell[i]+sz)
37e50 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  .         || COR
37e60 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 20 20 6d  RUPT_DB );.    m
37e70 65 6d 6d 6f 76 65 28 70 53 6c 6f 74 2c 20 70 43  emmove(pSlot, pC
37e80 41 72 72 61 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d  Array->apCell[i]
37e90 2c 20 73 7a 29 3b 0a 20 20 20 20 70 75 74 32 62  , sz);.    put2b
37ea0 79 74 65 28 70 43 65 6c 6c 70 74 72 2c 20 28 70  yte(pCellptr, (p
37eb0 53 6c 6f 74 20 2d 20 61 44 61 74 61 29 29 3b 0a  Slot - aData));.
37ec0 20 20 20 20 70 43 65 6c 6c 70 74 72 20 2b 3d 20      pCellptr += 
37ed0 32 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 61 74 61  2;.  }.  *ppData
37ee0 20 3d 20 70 44 61 74 61 3b 0a 20 20 72 65 74 75   = pData;.  retu
37ef0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rn 0;.}../*.** A
37f00 72 72 61 79 20 61 70 43 65 6c 6c 5b 5d 20 63 6f  rray apCell[] co
37f10 6e 74 61 69 6e 73 20 6e 43 65 6c 6c 20 70 6f 69  ntains nCell poi
37f20 6e 74 65 72 73 20 74 6f 20 62 2d 74 72 65 65 20  nters to b-tree 
37f30 63 65 6c 6c 73 2e 20 41 72 72 61 79 20 73 7a 43  cells. Array szC
37f40 65 6c 6c 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  ell .** contains
37f50 20 74 68 65 20 73 69 7a 65 20 69 6e 20 62 79 74   the size in byt
37f60 65 73 20 6f 66 20 65 61 63 68 20 73 75 63 68 20  es of each such 
37f70 63 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  cell. This funct
37f80 69 6f 6e 20 61 64 64 73 20 74 68 65 0a 2a 2a 20  ion adds the.** 
37f90 73 70 61 63 65 20 61 73 73 6f 63 69 61 74 65 64  space associated
37fa0 20 77 69 74 68 20 65 61 63 68 20 63 65 6c 6c 20   with each cell 
37fb0 69 6e 20 74 68 65 20 61 72 72 61 79 20 74 68 61  in the array tha
37fc0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  t is currently s
37fd0 74 6f 72 65 64 20 0a 2a 2a 20 77 69 74 68 69 6e  tored .** within
37fe0 20 74 68 65 20 62 6f 64 79 20 6f 66 20 70 50 67   the body of pPg
37ff0 20 74 6f 20 74 68 65 20 70 50 67 20 66 72 65 65   to the pPg free
38000 2d 6c 69 73 74 2e 20 54 68 65 20 63 65 6c 6c 2d  -list. The cell-
38010 70 6f 69 6e 74 65 72 73 20 61 6e 64 20 6f 74 68  pointers and oth
38020 65 72 0a 2a 2a 20 66 69 65 6c 64 73 20 6f 66 20  er.** fields of 
38030 74 68 65 20 70 61 67 65 20 61 72 65 20 6e 6f 74  the page are not
38040 20 75 70 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   updated..**.** 
38050 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
38060 74 75 72 6e 73 20 74 68 65 20 74 6f 74 61 6c 20  turns the total 
38070 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
38080 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
38090 65 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  e-list..*/.stati
380a0 63 20 69 6e 74 20 70 61 67 65 46 72 65 65 41 72  c int pageFreeAr
380b0 72 61 79 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ray(.  MemPage *
380c0 70 50 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  pPg,            
380d0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 74         /* Page t
380e0 6f 20 65 64 69 74 20 2a 2f 0a 20 20 69 6e 74 20  o edit */.  int 
380f0 69 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20  iFirst,         
38100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
38110 69 72 73 74 20 63 65 6c 6c 20 74 6f 20 64 65 6c  irst cell to del
38120 65 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  ete */.  int nCe
38130 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
38140 20 20 20 20 20 20 20 20 20 2f 2a 20 43 65 6c 6c           /* Cell
38150 73 20 74 6f 20 64 65 6c 65 74 65 20 2a 2f 0a 20  s to delete */. 
38160 20 43 65 6c 6c 41 72 72 61 79 20 2a 70 43 41 72   CellArray *pCAr
38170 72 61 79 20 20 20 20 20 20 20 20 20 20 20 20 20  ray             
38180 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 65 6c   /* Array of cel
38190 6c 73 20 2a 2f 0a 29 7b 0a 20 20 75 38 20 2a 20  ls */.){.  u8 * 
381a0 63 6f 6e 73 74 20 61 44 61 74 61 20 3d 20 70 50  const aData = pP
381b0 67 2d 3e 61 44 61 74 61 3b 0a 20 20 75 38 20 2a  g->aData;.  u8 *
381c0 20 63 6f 6e 73 74 20 70 45 6e 64 20 3d 20 26 61   const pEnd = &a
381d0 44 61 74 61 5b 70 50 67 2d 3e 70 42 74 2d 3e 75  Data[pPg->pBt->u
381e0 73 61 62 6c 65 53 69 7a 65 5d 3b 0a 20 20 75 38  sableSize];.  u8
381f0 20 2a 20 63 6f 6e 73 74 20 70 53 74 61 72 74 20   * const pStart 
38200 3d 20 26 61 44 61 74 61 5b 70 50 67 2d 3e 68 64  = &aData[pPg->hd
38210 72 4f 66 66 73 65 74 20 2b 20 38 20 2b 20 70 50  rOffset + 8 + pP
38220 67 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 5d  g->childPtrSize]
38230 3b 0a 20 20 69 6e 74 20 6e 52 65 74 20 3d 20 30  ;.  int nRet = 0
38240 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
38250 20 69 45 6e 64 20 3d 20 69 46 69 72 73 74 20 2b   iEnd = iFirst +
38260 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 70 46   nCell;.  u8 *pF
38270 72 65 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73  ree = 0;.  int s
38280 7a 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  zFree = 0;..  fo
38290 72 28 69 3d 69 46 69 72 73 74 3b 20 69 3c 69 45  r(i=iFirst; i<iE
382a0 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38  nd; i++){.    u8
382b0 20 2a 70 43 65 6c 6c 20 3d 20 70 43 41 72 72 61   *pCell = pCArra
382c0 79 2d 3e 61 70 43 65 6c 6c 5b 69 5d 3b 0a 20 20  y->apCell[i];.  
382d0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 57 49 54    if( SQLITE_WIT
382e0 48 49 4e 28 70 43 65 6c 6c 2c 20 70 53 74 61 72  HIN(pCell, pStar
382f0 74 2c 20 70 45 6e 64 29 20 29 7b 0a 20 20 20 20  t, pEnd) ){.    
38300 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20    int sz;.      
38310 2f 2a 20 4e 6f 20 6e 65 65 64 20 74 6f 20 75 73  /* No need to us
38320 65 20 63 61 63 68 65 64 43 65 6c 6c 53 69 7a 65  e cachedCellSize
38330 28 29 20 68 65 72 65 2e 20 20 54 68 65 20 73 69  () here.  The si
38340 7a 65 73 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  zes of all cells
38350 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61   that.      ** a
38360 72 65 20 74 6f 20 62 65 20 66 72 65 65 64 20 68  re to be freed h
38370 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
38380 20 63 6f 6d 70 75 74 69 6e 67 20 77 68 69 6c 65   computing while
38390 20 64 65 63 69 64 69 6e 67 20 77 68 69 63 68 0a   deciding which.
383a0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 6e        ** cells n
383b0 65 65 64 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  eed freeing */. 
383c0 20 20 20 20 20 73 7a 20 3d 20 70 43 41 72 72 61       sz = pCArra
383d0 79 2d 3e 73 7a 43 65 6c 6c 5b 69 5d 3b 20 20 61  y->szCell[i];  a
383e0 73 73 65 72 74 28 20 73 7a 3e 30 20 29 3b 0a 20  ssert( sz>0 );. 
383f0 20 20 20 20 20 69 66 28 20 70 46 72 65 65 21 3d       if( pFree!=
38400 28 70 43 65 6c 6c 20 2b 20 73 7a 29 20 29 7b 0a  (pCell + sz) ){.
38410 20 20 20 20 20 20 20 20 69 66 28 20 70 46 72 65          if( pFre
38420 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  e ){.          a
38430 73 73 65 72 74 28 20 70 46 72 65 6